1

我想了解更多关于对 CCSprite 进行子类化以及仅在初始化时创建 CCSprite 的优势。

iOS 开发和 Cocos2d 的新手。

我的游戏在初始化时创建了几个 CCSprite,并在触摸/拖动/碰撞时克隆了其中一些

也在寻找子类化的植入

更新:

此外,我的 Sprite 有一个文本标签以及一个音频文件和一个图像文件,它们与每个 sprite 略有不同。示例所有精灵具有相同的图像,但文本和音频不同。并且在碰撞时图像文件可能会改变

4

2 回答 2

6

当你应该继承 CCSprite 时:

  • 几乎从不
  • 当您必须更改精灵的显示方式时(自定义绘制)

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

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

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

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

您不会继承 UIButton 以使其在屏幕上移动或使其在文本字段上执行操作。这就是视图控制器的工作。视图控制器允许您按原样使用视图,没有子类化。你想要的是一个视图控制器,而不是 CCSprite 的子类。它已经做得太频繁了。

长话短说:

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

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

如果您使用 MVC 设计中惯用的控制器对象,您几乎不需要继承 CCSprite 或任何其他节点类。更重要的是,使用 userObject 属性,您可以将控制器对象与节点一起存储,因此当节点被释放时它会被释放。

当然,这两种方法都有效,最后只能归结为一个人想要使用最佳实践还是不良实践。

于 2012-09-28T16:32:50.973 回答
1

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

我应该继承 CCSprite、CCNode 还是 NSObject?

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

如果您像您说的那样创建大量精灵,Texture Packer 也非常适合减少内存使用。所有纹理都以二维的幂存储在内存中,因此如果您有一个 130x130 的精灵,它实际上作为 256x256 未压缩图像存储在内存中。这会给应用程序增加大量内存。Texture Packer 通过将所有图像存储在一个二次方纹理中来避免这个问题,cocos2d 然后可以只提取每个精灵所需的部分。

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

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

于 2012-09-27T22:21:17.743 回答