Objective-Ccocos2d将方法分离为新的类



好的,所以当我刚开始的时候,我在学习的时候只有一节游戏课。我不断地篡改代码并添加一些内容,现在它变得很荒谬。我是objective-c的新手,并不真正理解它的结构,但我确实理解良好的编程实践,并希望将类分解为更小、更具体的类。不过,我似乎找不到如何做这件事的解释。如有任何帮助,我们将不胜感激。我现在不知道它是否改变了什么,但我正在使用cocos2d,现在一切都在gmaescene.m和.h 中

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]; 
}

创建一个基本超类来概括一个大类

通常,你会有一些几乎相同的敌人,但在行为、力量、AI等方面略有不同。与其在完全独立的类中实现这些敌人,不如创建一个基类"Enemy",封装敌人类之间的通用逻辑和代码,并从这个超类派生这些敌人类。例如:

@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

这样,你就不必在所有类中重复生成、对英雄的新位置做出反应、被英雄砍伤时降低生命值等实现,因为根据OOP继承,你的敌人子类将继承超类方法。

还有更多

代码重构是一门艺术。在设计代码结构时,你必须有创造性。除了我上面解释的两种技术之外,你可能还想预测一下你可能希望如何在游戏的早期创建升级,并塑造你的对象类,以便在以后的升级过程中减少麻烦。或者,你甚至可以创建自己的自定义游戏框架,涵盖游戏的一般方面(我希望你只创建一个游戏后不会停止,是吗?),如音频、物理、规则等。概括我在本段第一句中已经写的内容,编程是一门艺术。想象一下,你的IDE(Xcode)是一块空白画布,Objective-C作为画笔,Cocos2d作为调色板,你会喜欢创建游戏,就像你喜欢玩最终产品一样:)

祝你好运!

最新更新