iOS和Cocos2d - 更改CCSprite的图像和新维度=失败

时间:2011-11-24 04:47:13

标签: ios cocos2d-iphone openfeint

我游戏中的一个亮点是主精灵的大小减少了。 因此,为了记忆,我不是通过每个帧循环sprite.scale,而是以比原始精灵低的百分比大小重新保存sprite,并且只想替换它。然后一旦“死亡”发生或计时器用完,原始精灵就会返回。

所以,我正在使用这段代码来缩小它:

[player setTexture:[[CCTextureCache sharedTextureCache] addImage:@"player-small.png"]];

此代码重置为正常:

[player setTexture:[[CCTextureCache sharedTextureCache] addImage:@"player-orig.png"]];

然而,原始图像(在初始化和复位时)看起来都很正常。但是当我将它更改为新的精灵(其尺寸恰好是原始尺寸的75%)时,它会改变它,但只显示新精灵的象限,但是只显示原始尺寸。

我尝试在重新构造精灵之前修改sprite.contentsize,但所做的只是改变了大小,但不会影响图像乱码的问题。

以下是一些视觉示例:

原件:

Original


使用contentSize修改的重新构图图像:

Retextured Image with contentSize modification


重新纹理化的图像到原始图像,而contentSize没有正确重置(哎呀,但这根本不是问题 - 我只是忘了读大小代码):

Retexted image to the Original image with the contentSize not reset properly (oops, but this isn't a problem at all - i just forgot to readd the size code):

PS - 我确实拥有所有精灵的“-hd.png”版本,所以我只想添加任何人想知道的内容(图片和测试到目前为止只在“nonretina”模拟器上)。

谢谢!


编辑:在视网膜模拟器测试过程中也会出现问题。

1 个答案:

答案 0 :(得分:2)

由于您主要关心的是内存,我建议您只使用纹理图集。

我将原始图像复制到图像编辑程序中,以查看其尺寸。图像大小为73x71像素,这意味着它作为纹理存储在内存中,尺寸为128x128,因为纹理将具有二维的力量。这将使纹理使用64 KB的内存(假设32位颜色深度)。使用纹理图集,您将能够更紧密地打包纹理,并且可以使用CCSprite setDisplayFrame方法更改显示的框架。

此外,您正在使用纹理缓存:

[CCTextureCache sharedTextureCache] addImage:@"player-small.png"]
[CCTextureCache sharedTextureCache] addImage:@"player-orig.png"]

除非您明确释放该纹理的内存,否则无论如何两种纹理都将保留在内存中。如果您释放了当前未使用的纹理内存并经常更换这些纹理,您的游戏将花费大量时间释放内存并从设备的闪存中重新加载图像 - 即使图像相对较小。

如果有多个精灵使用任何一个纹理,尝试卸载/重新加载纹理没有任何意义,因为会出现两个或多个精灵将使用这两个纹理的情​​况。

最后,我们最多谈的是64 KB的内存。如果您担心内存使用和性能,那么您应该做的是加载PVR纹理,它只是内存和磁盘上PNG文件大小的一小部分(但会失去一些颜色的活力)。

请查看TexturePacker以创建纹理图集和PVR图像。