Подклассы спрайта в cocos2d - PullRequest
0 голосов
/ 12 мая 2011

Несколько дней назад я начал работать с cocos2d. Мне очень нравятся рамки. Я хотел бы создать игру с cocos2d и, возможно, задать простой вопрос ...

Я делаю игру с 4 персонажами, которые имеют схожие характеристики, но имеют разные атрибуты, такие как «тип» и «очки». Я хотел бы разделить спрайты на один класс, который обрабатывает всю их логику, рисование и анимацию.

Мой вопрос, однако, заключается в том, как я могу вызвать класс спрайта с помощью, скажем, параметра «type» 1, 2, 3 или 4, а затем заставить класс нарисовать правильный спрайт в моей сцене со всей его индивидуальной логикой

Спасибо!

Ответы [ 3 ]

0 голосов
/ 12 мая 2011
Полиморфизм

таким способом можно сделать несколькими различными способами, некоторые лучше, чем другие.1) вы можете попробовать просто переопределить метод init или node и настроить там свой объект.

+(CCSprite *)node
{
    MySprite * returnSprite = [super node];
    returnSprite.hat = @"fedora";
    returnSprite.hatImage = [CCSprite spriteWithImage:...];

}

2) использовать отражение (psuedocode)

-(void)drawingMethodHere
{
     [self.hat drawAtPoint:somePoint];
}

, затем переопределить -(CCNode *)hatчтобы отразить тип.

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

0 голосов
/ 23 апреля 2012

Вы должны создать подкласс CCNode вместо того, чтобы создавать подклассы CCSprite.

Я думаю, что ваша проблема довольно проста. Просто создайте базовый класс с именем Character, который имеет общую логику, свойства и т.д. Обратите внимание, что база символов должна быть подклассом CCNode.

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

Для вашего спрайта я бы сказал, создайте переменную экземпляра типа CCSprite, а затем создайте методы для инициализации с изображением. Затем вы просто добавите этот спрайт как дочерний элемент при инициализации объекта.

0 голосов
/ 12 мая 2011

У вас должен быть класс Enemy, который содержит свойства определенных врагов и не зависит от типа (например, позиция, текущее состояние здоровья, экземпляр CCSprite?) И класс EnemyType, который содержит свойства, которые являются общими для всех врагов определенного типа. (Максимальное здоровье, максимальная скорость, размер, имя файла спрайта). Вы должны загрузить типы врагов до загрузки уровня, а затем создать экземпляр каждого врага, используя соответствующий тип в конструкторе.

Например, если ваш вражеский элемент в файле уровня выглядит следующим образом

<enemy><type>spider</type>...more properties...</enemy>

Код (псевдо) будет делать что-то вроде

   EnemyType *enemyType = nil;
   if (typeElement.value == "spider")
   {
       enemyType = spiderType;
   }
   Enemy *newEnemy = [Enemy enemyWithType:enemyType];

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

EDIT: Еще один приятный пост для чтения , который кажется очень актуальным и может рассказать о некоторых вещах, вероятно, лучше, чем я.

В любом случае, я не хотел заставить вас думать, что вам следует просто переосмыслить весь свой дизайн. То, что я предлагаю, «лучше» в отношении MVC, но это не значит, что оно лучше для вашей игры. Если вы будете тратить все свое время на «правильность дизайна», вы никогда не закончите игру, особенно если вы только изучаете фреймворк cocos2d, я фактически делал проект обучения не так давно, и сам Стив Макконнел придет и шлепни меня, если он это увидел.

Если вы работаете над игрой в одиночку, и это небольшой проект, оставьте подкласс, если он будет более управляемым для вас, все, включая «правильность дизайна», должно быть должным образом оценено (кроме, возможно, использования »). goto "заявления :))

...