2016-06-17 4 views
0

Я работаю над приложением, и я написал большую часть SKScene в одном классе. Он отлично работает, но когда я прошел курс (java) в прошлом семестре, кажется, что принятая отраслевая практика заключается в том, чтобы разделить его на многие классы.Где я должен выполнять свои функции?

Более конкретно, мой (SpriteKit) приложение содержит кошку и мышь, и после того, как финиширование курс, я решил, что вместо того, чтобы содержать всю свою информацию в SKScene, я должен разделить некоторые из них на несколько классов (а Player суперкласс с подклассами Cat и Mouse), каждая из которых содержит их соответствующую информацию (такую ​​как положение x и y) и функции (такие как moveCat) с только функциями и информацией, связанными с сюжетом, в классе Scene.

проблема заключается в содержании функций.

В частности одна из функций, pathBlocked (который проверяет, есть ли какие-либо барьеры, блокирующие нужный путь движения) использует много информации, что не имеет смысла содержать внутри Player объекта (например, всю информацию о барьеры на доске и сколько сыров было собрано).

Я не могу просто оставить pathBlocked как Scene функции, потому что есть функция, которая должна принадлежать к кошке (catAI), который использует pathBlocked для навигации. Если это метод сцены, это не сработает. Мне нужно было бы создать экземпляр объекта Scene каждый раз, когда я захочу позвонить pathBlocked.

Должен ли я забыть о создании Cat и Mouse Занятия или я должен заполнить класс Player информацией, которая не совсем принадлежит?

или есть третий вариант, о котором я не думаю?

Если вам нужен фрагмент кода, я мог бы включить его.

Спасибо!

+0

'pathBlocked' мне показалось бы наиболее подходящим как метод сцены. – Alexander

+0

забыл упомянуть, у кошки есть метод 'catAI', который вызывает' pathBlocked'. Если это метод сцены, это не сработает. Разве мне не нужно было бы создавать объект сцены каждый раз, когда я хотел бы называть 'pathBlocked'? –

+1

Объект cat может содержать слабую ссылку на родительскую сцену и запрашивать его для такой информации – Alexander

ответ

1

Хорошо, так что вы должны сделать, это

class Cat { 
    var sceneRef: GameScene? //or whatever scene is called 
    var xPos: CGFloat! 
    var yPos: CGFloat! 

    init(s: GameScene){//just example stuff 
     sceneRef = s 
     xPos = sceneRef!.childNodeWithName("cat").position.x 
     yPos = sceneRef!.childNodeWithName("cat").position.y //However, these variables will not stay up to date. If you need them current, you would have to do the same thing again, xPos = sceneRef!.childNode...etc. 
    } 

    func doStuff{ 

    } 

    func createNewPath() 
     //create a new path 
    } 
} 

Затем на сцене, вы можете сделать:

class GameScene: SKScene { 
    var cat: Cat? 

    override init(size: CGSize){ 
     super.init(size: size) 
     cat = Cat(s: self) 

    func whatever() { 
     if (pathBlocked()){ 
      cat!.createNewPath() 
     } 
    } 

Я думаю, вы просто должны разворачивать его каждый раз, когда вы используете его, но XCode скажет вам об этом.

^кредит за то, что должно пойти в Аомчилов, раньше я не знал о слабых ссылках. Это был интересный опыт XD.

Если вы хотите организовать свой код, другой способ, которым вы могли бы это сделать, - это иметь файл расширения для вашей сцены и бросить все функции функции низкого уровня там и сохранить все материалы высокого уровня в реальной сцене класс. Создайте новый класс и назовите его SceneExtension или что-то:

import SpriteKit 
//import whatever else you need 

extension GameScene { //<- Or whatever your previous scene that you want to extend is called 

    func pathBlocked() { 
     //function code 
    } 

    //other functions 
} 

И только в основном бросить все другие функции, которые вы не хотите смотреть и просто занимают место в самом файле сцены. Он действует как его в одном файле, поэтому вы можете вызвать любую из функций здесь или использовать любые переменные из любого класса.

+0

Будет ли слабая ссылка изменяться вместе со сценой? Если сцена содержит переменную, изменится ли переменная слабой ссылки при изменении переменной сцены. –

+0

Да. если вы проверите 'if scene.cheeseObtained> = 5' или что-то в этом роде, оно будет точным, однако если вы сделаете так, как' var cheese = scene.cheeseObtained', а затем cheeseObtained изменения в классе сцены, переменная, которую вы только что создали " сыр "не будет обновляться, но если вы снова запустите' cheese = scene.cheeseObtained', это будет точно. Я буду взрослел, плохо испытал некоторые вещи и удостоверился, что это правильно, не хотите вводить в заблуждение XD. – Arkidillo

+0

Я сам его протестировал, и все переменные остаются в курсе последних событий. поэтому, если вам нужна текущая позиция x, вы можете сделать: 'sceneRef! .childNodeWithName (« cat »). position.x' – Arkidillo

Смежные вопросы