对CCSprite进行子类化的优点

时间:2012-09-27 22:06:42

标签: objective-c ios cocos2d-iphone subclass

我想了解更多有关CCSprite的子类化以及仅在init上创建CCSprite的优势。

iOS dev和Cocos2d的新功能。

我的游戏在init上创建了几个CCSprites,并在触摸/拖动/碰撞时克隆了其中的一些

寻找子类化的植入

更新:

此外,我的Sprites还有一个文本标签以及一个音频文件和一个图像文件,它们与每个精灵稍有不同。示例所有精灵都具有相同的图像,但文本和音频是不同的。碰撞时图像文件可能会改变

2 个答案:

答案 0 :(得分:6)

何时应该继承CCSprite:

  • 几乎没有
  • 当您必须更改精灵显示自身的方式时(自定义绘图)

精灵以可可术语称“观点”。所有其他节点也是如此。问题是,Sprite是一个在屏幕上呈现纹理的对象。如果您想要更改Sprite的绘制方式,可能通过将两个纹理混合为一个,但通过运行不同的着色器代码,通过添加自定义OpenGL绘图来添加遮罩功能,则子类化是有意义的。

如果不清楚,请再次提出相同的问题,但是关于不同的视图类:

"What's the advantage of subclassing UIButton? When does it make sense?"

答案:仅当您需要更改按钮的显示方式时才会显示。

您不要将UIButton子类化为使其在屏幕上移动或使其在文本字段上执行操作。这是视图控制器的工作。视图控制器允许您逐字使用视图,不使用子类。你想要的是一个视图控制器,而不是CCSprite的子类。已经经常这样做了。

长话短说:

仅当您无法通过其公共接口执行预期任务时,才会对CCSprite(等)进行子类化。

更改位置,旋转,缩放,纹理,精灵框架等是您可以从外部类(控制器)更改的所有属性。对于精灵动画也是如此,无论是使用CCAnimation还是运行动作。

如果在MVC设计中使用类似于它的控制器对象,则几乎不需要子类化CCSprite或任何其他节点类。更重要的是,使用userObject属性可以将控制器对象与节点一起存储,因此在取消分配节点时会取消分配。

当然这两种方法都有效,最后只能归结为是否要使用最佳做法或不良做法。

答案 1 :(得分:1)

通常,标准做法是在init期间继承CCNode并向其添加CCSprite。基本上,它归结为如果您实际上在基础精灵类中添加功能,您将重复使用所有精灵,或者如果您只是创建说具有健康和法力或其他东西的玩家对象。在这个问题中有一些非常好的信息。

Should I subclass CCSprite, CCNode, or NSObject?

至于创建大量精灵并克隆它们,你应该看看 CCSpriteBatchNode 。批处理节点将在一次绘制调用中绘制具有相同纹理的所有精灵,这可以真正有助于提高性能。您还可以使用纹理图集将许多精灵的纹理组合到一个纹理中并批量处理整个事物。有一些很棒的工具可以提供此功能,我强烈推荐Texture Packer或者这个。

如果您正在创建许多精灵,那么Texture Packer也非常适合减少内存使用量。所有纹理都以二维幂存储在内存中,因此如果你有一个130x130的精灵,它实际上作为256x256无压缩图像存储在内存中。这可以为应用程序添加大量内存。 Texture Packer通过将所有图像存储在两个纹理的一个幂中来避免这个问题,cocos2d然后只能拉出每个sprite所需的部分。

有关所有这些的更多信息以及有关Texture Packer和批处理节点的精彩教程,请点击此处:

http://www.raywenderlich.com/2361/how-to-create-and-optimize-sprite-sheets-in-cocos2d-with-texture-packer-and-pixel-formats