好的,所以当我开始学习时,我只有一个游戏课。我一直搞乱代码,并添加了东西,现在它变得荒谬了。我是Objective-c的新手,并且不太了解它的结构那么棒,但我确实理解良好的编程实践,并希望将类分解为更小的更具体的类。我似乎无法找到解释如何做到这一点。任何帮助将不胜感激。我现在不知道如果它改变了什么,但我正在使用cocos2d,现在一切都在gmaescene.m和.h
答案 0 :(得分:0)
你的CCScene子类和CCLayer子类相当普通(如数百行实现代码)是很正常的,因为这些是大多数游戏机制,如精灵动画,触摸事件处理,游戏逻辑等等。也就是说,这里有一些我用来将代码分解成更小类的技术:
将特定游戏对象的相关代码重构为对象类
假设您的游戏包含一个英雄化身,并且一些在屏幕上移动的敌人头像互相交互。通常,每个化身都具有特定的运动模式和属于它的逻辑。例如,英雄可以根据玩家在屏幕上触摸的位置向左或向右走。因此,最好将移动英雄位置和动画腿的逻辑放入Hero类中,例如:
@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];
}
创建一个推广大类的基础超类
通常情况下,你会有一些几乎相同的敌人,但他们的行为,力量,人工智能等方面略有不同。而不是在完全独立的类中实现这些敌人,创建一个基类'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
这样你就不会重复产生的实现,对Hero的新位置做出反应,在所有类中由Hero等大幅减少HP,因为你的敌人子类将继承超类方法,按照OOP继承。
还有更多
代码重构是一门艺术。您必须在如何设计代码结构方面发挥创意。除了上面介绍的两种技术之外,您可能还希望预测在过程早期如何创建游戏升级,并塑造对象类,以便以后减少麻烦。或者您甚至可以创建自己的自定义游戏框架,涵盖游戏的一般方面(我希望您不会在创建一个游戏后停止,不是吗?),如音频,物理,规则等。概括我已经写过的内容编程本段是本段的第一句话。想象一下你的IDE(Xcode)作为空白画布,Objective-C作为画笔,Cocos2d作为调色板,你会喜欢创建游戏,因为你喜欢玩最终产品:)
祝你好运!