在cocos2d中对精灵进行子类化

时间:2011-05-12 17:39:13

标签: iphone cocos2d-iphone sprite

几天前,我开始使用cocos2d。我非常喜欢这个框架。我想用cocos2d创建一个游戏,并且有一个简单的问题......

我正在制作一个有4个角色的游戏,它们都具有相似的特征,但有一些不同的属性,如“类型”和“点”。我想将精灵子类化为一个处理所有逻辑,绘图和动画的类。

我的问题是,如何用一个“类型”参数1,2,3或4来调用sprite类,然后让类使用它的所有单独逻辑将正确的sprite绘制到我的场景中?

谢谢!

3 个答案:

答案 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)

这种方式的多态性可以通过几种不同的方式完成,有些方式比其他方式更好。 1)您可以尝试覆盖init或node方法并在那里设置对象。

+(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添加为子项。