Для вашего подкласса CCScene и подкласса CCLayer вполне нормально быть достаточно большим (как в сотнях строк кода реализации), поскольку именно в них реализована большая часть игровой механики, такой как спрайт-анимация, обработка сенсорных событий, игровая логика и т. Д.,Тем не менее, вот некоторые из методов, которые я использую для разбиения кодов на более мелкие классы:
Коды рефакторинга, относящиеся к конкретным игровым объектам, в классы объектов
Предположим, что ваша игра содержит аватар героя и несколько движущихся по экрану аватаров врагов, взаимодействующих друг с другом.Как правило, у каждого аватара есть определенный паттерн движений и логика, которые ему принадлежат.Например, герой может идти влево или вправо в зависимости от того, где игрок касается экрана.Таким образом, лучше поместить логику, которая перемещает положение героя и анимировать ноги в класс Героя, что-то вроде:
@interface Hero : CCSprite {
EnumDirection currentDirection;
}
- (void)walkTowardsPoint:(CGPoint)touchPoint;
@end
Сделайте то же самое для класса врагов.Затем в классе CCLayer / CCScene вам просто нужно сделать:
- (void)ccTouchBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
CGPoint location = [self convertTouchToNodeSpace:touch];
[hero walkTowardsPoint:location];
}
Создать базовый суперкласс, который обобщает большой класс
Обычно вы должны иметьнесколько врагов, которые почти одинаковы, но с небольшими различиями в их поведении, силе, ИИ и т. д. Вместо того, чтобы реализовывать этих врагов в совершенно отдельных классах, создайте базовый класс «Враг», который инкапсулирует общую логику и код среди классов врагов,и вывести этот класс врагов из этого суперкласса.Например:
@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 - цветовая палитра, и вы получите удовольствие от создания игры так, как вам нравится играть в конечный продукт:)
Удачи!