【问题标题】:Subclassing a sprite in cocos2d在 cocos2d 中子类化一个精灵
【发布时间】:2011-05-12 17:39:12
【问题描述】:

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

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

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

谢谢!

【问题讨论】:

    标签: iphone cocos2d-iphone sprite


    【解决方案1】:

    你应该有一个 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 框架,那么不久前我实际上正在制作一个学习项目,而史蒂夫·麦康奈尔本人会过来如果他看到了就打我。

    如果您正在单独开发一款游戏并且它是一个小项目,请继续进行子类化,如果它对您来说更易于管理,那么包括“设计正确性”在内的所有内容都需要适当量化(除了可能使用“ goto" 语句 :) )。

    【讨论】:

    • 当然,让你的答案比我的好。我只能假设@Nick 将会有一些学习要做,如果他的第一次尝试不像他希望的那样干净且易于扩展,希望不会气馁。
    • @Grady Player 我只是提出了一些不同的建议,清洁不应该是构建学习项目时最关心的问题。然而,这是一个设计问题,所以我觉得我必须回答它并指出我认为是设计缺陷的某件事,无论如何,我编辑了我的答案,我最不想阻止任何人:)
    • @Grady Player 也是将对象添加到场景的 cocos2d 范例确实似乎非常恳求您将对象子类化并将它们添加到场景中的敌人和炮塔,所以正如我在原文中提到的回答,如果这是cocos的常规做事方式,请有人把我放在我的位置
    • 我总是子类化精灵,如果你不这样做,你可能不得不最终继承它以保持对控制对象的引用。
    【解决方案2】:

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

    您可能需要将它们组合起来,但在开始之前先计划一下,最终会节省大量时间。

    【讨论】:

      【解决方案3】:

      你应该继承 CCNode 而不是继承 CCSprite。

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

      现在您可以覆盖逻辑以适应您在特定类中的需求。现在您将能够使用多态性,这很好。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多