Iphone 在cocos2d中对精灵进行子类化

Iphone 在cocos2d中对精灵进行子类化,iphone,cocos2d-iphone,sprite,Iphone,Cocos2d Iphone,Sprite,几天前,我开始使用cocos2d。我真的很喜欢这个框架。我想用cocos2d创建一个游戏,有一个可能很简单的问题 我正在制作一个有4个角色的游戏,它们都有相似的特征,但有一些不同的属性,比如类型和点数。我想将精灵分为一个子类,处理它们的所有逻辑、绘图和动画 但是,我的问题是,我如何使用1、2、3或4的类型参数调用sprite类,然后让该类使用所有单独的逻辑将正确的sprite绘制到我的场景中 谢谢 你应该有一个敌人类,它包含特定敌人的属性,并且不是特定类型的属性,比如位置、当前生命值、CCSpr

几天前,我开始使用cocos2d。我真的很喜欢这个框架。我想用cocos2d创建一个游戏,有一个可能很简单的问题

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

但是,我的问题是,我如何使用1、2、3或4的类型参数调用sprite类,然后让该类使用所有单独的逻辑将正确的sprite绘制到我的场景中


谢谢

你应该有一个敌人类,它包含特定敌人的属性,并且不是特定类型的属性,比如位置、当前生命值、CCSprite实例?以及一个EnemyType类,该类包含特定类型的所有敌人共享的属性max health、max speed、size和sprite filename。你应该在加载关卡之前加载你的敌人类型,而不是在构造器中使用适当的类型实例化每个敌人

例如,如果级别文件中的敌人元素如下所示

<enemy><type>spider</type>...more properties...</enemy>
同样,敌人类应该包含代表它的CCSprite,而不是它的子类。敌人不是精灵,所以除非我遗漏了什么,在我看来,敌人不应该从精灵那里继承。我曾读到过

编辑: 这似乎非常相关,可能比我更好地传达其他一些事情

无论如何,我的意图不是让你认为你应该重新考虑你的整个设计。我的建议是更好的MVC,但这并不意味着它更适合你的比赛。如果你把所有的时间都花在设计的正确性上,你将永远无法完成一个游戏,特别是如果你只是在学习cocos2d框架,不久前我实际上在做一个学习项目,如果史蒂夫·麦康奈尔看到它,他自己会过来打我一巴掌


如果你正在单独开发一个游戏,而这只是一个小项目,那么如果你想让它更易于管理,那么一切,包括设计正确性,都需要适当量化,除了goto语句的使用:。

这种多态性可以通过两种不同的方式来实现,有些方式比其他方式更好。 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以反映类型


您可能需要对它们进行一些组合,但在开始之前做一点计划,最终将节省大量时间。

您应该对CCNode进行子类化,而不是对CCSprite进行子类化

我认为你的问题很简单。只需创建一个名为Character的基类,该基类具有公共逻辑、属性等。然后您可以从Character base创建其他4个类,如、敌人、玩家等,以及子类。注意,字符库应该是CCNode的子类

现在,您可以重写逻辑以满足特定类中的需要。现在您将能够使用多态性,这很好


对于您的精灵,我会说创建一个CCSprite类型的实例变量,然后创建方法来初始化一个映像。然后,在初始化对象时,只需将该精灵作为子对象添加

当然,让你的答案比我的好。我只能假设@Nick将要学习一些东西,如果他的第一次尝试不像他希望的那样干净和容易扩展,我希望他不会气馁。@Grady Player我只是提出了一些不同的建议,清洁不应该是构建学习项目时最关心的问题。但是这是一个设计问题,所以我觉得我必须回答它,并指出我认为是设计缺陷的某个东西,无论如何,我编辑了我的答案,我最不想让任何人失望的是:@Grady Player同时,cocos2d向场景中添加对象的范例似乎非常希望你对对象进行子类化,只需将它们添加到场景中的敌人和炮塔,所以正如我在原始答案中提到的,如果这是cocos中的一种常规做法,有人请把我放在我的位置,我总是只是子类sprite,如果你不这样做,你可能最终不得不子类化它,以保持对控制对象的引用。
-(void)drawingMethodHere
{
     [self.hat drawAtPoint:somePoint];
}