Как я могу эффективно моделировать сущности и компоненты в GameplayKit/SpriteKit

Начав с GameplayKit, я моделирую бесконечный бегун, в котором игрок может переключаться между персонажами одним щелчком мыши на экране. Персонаж первый может атаковать с близкого расстояния (компонент), второй прыгает (компонент), а третий стреляет (компонент).

Я хотел бы знать, как лучше смоделировать между этими двумя:

  1. Создайте класс Player, который имеет 3 разных объекта символов (массив), один из которых с его компонентами

  2. Создайте сущность Player, состоящую из 3 разных компонентов персонажей, и добавьте все компоненты движения и действий (стрельба/прыжки...)

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

Пс:. SpriteComponent будет компонентом, отвечающим за визуальное представление всех сущностей в .sks.

Пс2:. Примеры в быстром, если это возможно.

Спасибо за ваше время.


person Layon Tavares    schedule 06.03.2016    source источник


Ответы (1)


Это зависит от того, что вы делаете и что делает каждый персонаж, помимо использования компонентов. Используя gamekit, я, вероятно, предпочел бы создать класс сущностей, а не просто классы.

Рассматривали ли вы возможность использования только одной сущности игрока, а затем, когда вы меняете персонажа, вы просто удаляете/добавляете компоненты для этого персонажа.

Скажем, вы переходите с атакующего на прыгающего, вы можете удалить компонент атаки.

 player.removeComponent....

и добавьте компонент прыжков

 let jumpingComponent = ...
 player.addComponent(jumpingComponent)

В общем, вы хотите, чтобы ваши компоненты были максимально гибкими и универсальными. Например, ваш spriteComponent должен принимать строку/текстуру изображения в своем методе инициализации, чтобы вы могли добавить один и тот же компонент к каждому объекту, но использовать другое изображение.

 class SpriteComponent: GKComponent {

     let node: SKSpriteNode

     init(texture: SKTexture) {
          node = SKSpriteNode(texture: texture, color: SKColor.clearColor(), size: texture.size())
     }
}

Теперь вы можете добавить один и тот же компонент к каждому персонажу, используя разные изображения.

    let character1Texture = SKTexture(imageNamed: "Character 1 image"
    let spriteComponent = SpriteComponent(texture: character1Texture)
    addComponent(spriteComponent)

То же самое касается ваших анимаций и других компонентов.

Я так к этому отношусь.

Скажем, у меня есть игра, в которой есть 10 типов врагов, которые более или менее одинаковы. Я бы, вероятно, попытался просто иметь 1 класс вражеских сущностей, чтобы все компоненты использовались всеми 10 врагами. Затем я бы добавил соответствующие компоненты, которые делают каждый из них уникальным динамически или на основе enumType, который я бы передал в методе init.

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

Apple делает это в DemoBot, где у них есть сущность TaskBot, а затем сущность FlyingBoy и сущность GroundBot, которые являются подклассами TaskBot.

Это действительно зависит от вас.

person crashoverride777    schedule 06.03.2016
comment
Это может быть, но у 3-х персонажей разные спрайты и анимация для каждого действия (типа отряда с волшебником, рыцарем и лучником), в случае оптимизации управления памятью и обработкой было бы плохо убрать визуальную составляющую и добавить другую визуальную с разными параметрами инициализации каждый раз, когда игрок нажимает кнопку? Или просто один визуальный компонент с 3 способами переключения между персонажами и добавление еще одного в этот же компонент на случай, если мы решим перейти на 4+, было бы хорошим решением? Спасибо за Ваш ответ. Вероятно, в ответ я выберу это как решение =D - person Layon Tavares; 06.03.2016
comment
Трудно определить, какой способ лучше, вариантов довольно много. Вы можете использовать 3 сущности. Ваш компонент Sprite должен передавать строку имени изображения в свой метод инициализации, таким образом, вы можете дать трем объектам один и тот же компонент Sprite, но с разными текстурами. Затем просто создайте компоненты анимации и т. д. для сущностей. Вы снова можете просто создать 1 объект, а затем создать 3 экземпляра в вашей GameScene с разными компонентами. Я предпочитаю использовать подкласс сущностей, который имеет очень мало кода, кроме компонентов, поэтому, возможно, создание 3 сущностей - это путь. - person crashoverride777; 06.03.2016