Objective-C cocos2d выделяет методы в новые классы?

#objective-c #cocos2d-iphone

#objective-c #cocos2d-iphone

Вопрос:

Итак, когда я начинал, у меня был только один игровой класс, пока я учился. Я продолжал возиться с кодом и добавлял в него что-то еще, и теперь это стало смешным. Я новичок в objective-c и не очень хорошо понимаю его структуру, но я разбираюсь в хороших методах программирования и хотел бы разбить класс на более мелкие, более специфические классы. Кажется, я не могу найти объяснение, как это сделать. Буду признателен за любую помощь. Я не знаю, меняет ли это что-нибудь, но я использую cocos2d, и прямо сейчас все находится в gmaescene.m и .h

Ответ №1:

Вполне нормально, что ваши подклассы CCScene и CCLayer довольно большие (как в сотнях строк кода реализации), поскольку именно в них реализована большая часть игровой механики, такой как анимация спрайтов, обработка событий касания, игровая логика и т.д. Тем не менее, вот некоторые из методов, которые я использую, чтобы разбить коды на более мелкие классы:

Преобразуйте коды, относящиеся к конкретным игровым объектам, в классы objects

Предположим, что в вашей игре есть аватар героя и несколько аватаров врагов, движущихся по экрану и взаимодействующих друг с другом. Обычно у каждого аватара есть определенный шаблон движений и логика, которые ему принадлежат. Например, герой может ходить влево или вправо в зависимости от того, к какой части экрана игрок прикасается. Таким образом, лучше поместить логику, которая перемещает позицию героя и анимирует ноги, в класс Hero, что-то вроде:

 @interface Hero : CCSprite {
   EnumDirection currentDirection;
}

- (void)walkTowardsPoint:(CGPoint)touchPoint;

@end
  

Сделайте то же самое для класса enemies. Затем в классе CCLayer / CCScene вам просто нужно сделать:

 - (void)ccTouchBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    CGPoint location = [self convertTouchToNodeSpace:touch];        
    [hero walkTowardsPoint:location]; 
}
  

Создайте базовый суперкласс, который обобщает большой класс

Обычно у вас будет несколько врагов, которые почти одинаковы, но с небольшими различиями в их поведении, силе, искусственном интеллекте и т.д. Вместо того, чтобы реализовывать этих врагов в совершенно отдельных классах, создайте базовый класс ‘Enemy’, который инкапсулирует общую логику и код среди классов enemies, и производите эти классы enemies от этого суперкласса. Например:

 @interface Enemy : CCSprite {
   EnumEnemyState state;
   CGFloat hitpoint;
}

- (void)spawnAt:(CGPoint)spawnLocation;
- (void)observeHeroLocation:(CGPoint)location;
- (BOOL)slashedByHeroWithDamage:(CGFloat)damage;

@end

@interface Goomba : Enemy {
   EnumGoombaColor color;
}
@end

@interface Koopa : Enemy {
}    
- (void)shootHammerAt:(EnumDirection)direction;
@end
  

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

И многое другое

Рефакторинг кода — это искусство. Вы должны проявить творческий подход к тому, как вы хотите спроектировать структуру своего кода. Помимо двух методов, которые я объяснил выше, вы также можете предусмотреть, как вы захотите создать обновление для своей игры на ранних стадиях процесса, и сформировать свои классы объектов, чтобы обеспечить такое обновление с меньшими трудностями позже. Или вы даже можете создать свой собственный игровой фреймворк, который охватывает общие аспекты ваших игр (я надеюсь, вы не остановитесь после создания только одной игры, не так ли?), Такие как аудио, физика, правила и т.д. Обобщая то, что я уже написал в первом предложении этого параграфа, программирование — это искусство. Представьте свою IDE (Xcode) в виде чистого холста, Objective-C в качестве кисти и Cocos2d в качестве цветовой палитры, и вам понравится создавать игру так же, как вам понравилось бы играть в конечный продукт 🙂

Удачи!