Комплексное поведение и модели поведения противника

Я хотел бы немного переключиться на своих врагов в моей игре SpriteKit. Они просто так … предсказуемы. Меня вдохновили виды врагов, которые встречаются в «Связывании Исаака: Возрождение».

Например, предположим, что я хотел бы реализовать врагов, которые разделились на двух меньших врагов, когда enemy.health < 50.0f . В простом сценарии это можно сделать из моего основного цикла обновления сцены, итерации через всех моих врагов. Что-то вроде:

 if(enemy.health < 50 && enemy.type == kEnemyTypeSplitsIntoTwo) { CGPoint position1 = CGPointMake(enemy.position.x+20,enemy.position.y); CGPoint position2 = CGPointMake(enemy.position.x-20,enemy.position.y); [enemy killEnemy]; [self spawnNewEnemyWithType:enemyType andHealth:50 atPosition:position1]; [self spawnNewEnemyWithType:enemyType andHealth:50 atPosition:position2]; } 

Это, вероятно, будет работать для простых случаев. Но это то, что я определенно хочу оставить вне моего основного цикла обновления сцены. Проблема в том, что мой класс врага является фактически подклассом SKSpriteNode .

Для ситуаций, подобных этому, в идеале я бы хотел, чтобы новый класс, такой как класс ComplexEnemy или EnemyGroup с этим, чтобы я мог реализовать более сложные виды поведения и модели противника (думаю, эпические боссы сражаются с несколькими фазами). Я бы предположил, что этот новый класс, скорее всего, будет выводиться из SKNode (или даже NSObject ?) И генерировать несколько экземпляров Enemy в определенных точках.

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

-ОКРУГ КОЛУМБИЯ

tl; dr – группы врагов, боссы с несколькими фазами. Как вы, ребята, это делаете?

Нет ничего плохого в использовании SKSpriteNode в качестве вражеского класса. Я делаю это все время. Например, если вы хотите добавить панель здоровья, вы можете просто добавить ее как дочернюю.

Ваш вопрос в основном основан на мнениях, поэтому ожидайте, что он будет закрыт достаточно скоро. Тем не менее, это хороший вопрос. Я предлагаю вам использовать один или несколько классов класса SKSpriteNode для обработки вашей рабочей нагрузки, поскольку это может облегчить работу новичка. Разумеется, вы можете просто использовать один класс врага, и его метод обновления обрабатывает различные аспекты, основанные на свойствах. Например:

 -(void)update:(NSTimeInterval)currentTime { if(self.enemyType == kDragon) { // do big stuff } if(self.enemyType == kDwarf) { // do small stuff } } 

В настоящее время я работаю над проектом, в котором есть 10 разных видов врагов и 4 варианта поведения для каждого из них. Все это обрабатывается из одного класса (SKSpriteNode).

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

В вашей ситуации я бы подклассифицировал ComplexEnemy как простой объект. Этот объект будет отвечать за создание и добавление и удаление на место различных врагов, которые могут появиться.

Затем в методе обновления сцены я бы назвал метод проверки в этом объекте. Метод проверки выполнит остальную часть тяжелого подъема. Вы можете поместить этот вызов (тот, что ComplexEnemy в методе обновления) в массив методов, и когда экземпляр ComplexEnemy будет ComplexEnemy , он зарегистрируется в этом массиве, чтобы его можно было проверить. Он удаляется из массива перед удалением из памяти.

  • Лучший способ представления макетов с относительными позициями в iOS?
  • iOS: как прокручивать между представлениями с помощью Swift
  • Как добавить представление за другим видом в iOS
  • Просмотр контроллера frame.height и frame.width заменяются для iOS 8
  • Рамка пользовательской клавиатуры iOS сжимается на 20 пунктов, если строка состояния увеличивается во время записи или телефонного звонка?
  • В чем разница между addChildViewController и presentModelViewController
  • Компонент React Native Text не будет находиться внутри компонента View
  • черный экран - просмотр nil в viewWillAppear
  • Force landscape ios 7
  • MVC в Cocoa Touch: как взаимодействуют взгляд и модель?
  • Отключение нескольких контроллеров просмотра сразу (iOS 8)
  • Давайте будем гением компьютера.