几天前,我开始使用cocos2d。我非常喜欢这个框架。我想用cocos2d创建一个游戏,并且有一个简单的问题......
我正在制作一个有4个角色的游戏,它们都具有相似的特征,但有一些不同的属性,如“类型”和“点”。我想将精灵子类化为一个处理所有逻辑,绘图和动画的类。
我的问题是,如何用一个“类型”参数1,2,3或4来调用sprite类,然后让类使用它的所有单独逻辑将正确的sprite绘制到我的场景中?
谢谢!
答案 0 :(得分:0)
你应该有一个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,而不是它的子类。敌人不是精灵,所以除非我遗漏了某些东西,正如我所看到的,敌人不应该从精灵那里继承。我读到了when to contain and when to inherit。
修改强> Another nice post to read这似乎非常相关,可能会传达一些其他可能比我更好的事情。
无论如何,我的目的不是让你认为你应该重新考虑你的整个设计。我提议的是“更好”MVC明智,但这并不意味着它对你的游戏更好。如果你把所有时间都花在“设计正确性”上,你将永远不会完成游戏,特别是如果你刚学习cocos2d框架,我实际上是在不久前制作一个学习项目而Steve McConnel自己也会过来如果他看到的话,打我一巴掌。
如果你正在单独开展一个游戏并且它是一个小项目继续进行,如果它对你来说更易于管理,那么包括“设计正确性”在内的所有内容都需要进行适当的量化(除非使用“转到“陈述:))。
答案 1 :(得分:0)
+(CCSprite *)node
{
MySprite * returnSprite = [super node];
returnSprite.hat = @"fedora";
returnSprite.hatImage = [CCSprite spriteWithImage:...];
}
2)使用反射(伪代码)
-(void)drawingMethodHere
{
[self.hat drawAtPoint:somePoint];
}
然后覆盖-(CCNode *)hat
以反映类型。
你可能需要对它们进行一些组合,但在开始之前做一点计划,最终会节省很多时间。
答案 2 :(得分:0)
您应该子类化CCNode而不是子类化CCSprite。
我认为你的问题很容易。只需创建一个名为Character的基类,它具有通用的逻辑,属性等等。然后你创建另外4个类,如敌人,玩家等等,并从Character base创建子类。请注意,字符库应该是CCNode的子类。
现在,您可以覆盖逻辑以满足特定类中的需求。现在你将能够使用多态,这很好。
对于你的精灵,我会说创建一个CCSprite类型的实例变量,然后创建用图像初始化的方法。然后,您将在初始化对象时将该sprite添加为子项。