【问题标题】:iOS and Cocos2d - Changing CCSprite's image AND new dimensions = FAILiOS 和 Cocos2d - 更改 CCSprite 的图像和新尺寸 = FAIL
【发布时间】:2012-01-05 08:14:51
【问题描述】:

我的游戏中的一个增强功能是减小主要精灵的大小。 因此,为了记忆起见,我没有在每一帧中循环 sprite.scale,而是以低于原始 sprite 的百分比大小重新保存了 sprite,并且只是希望替换它。然后一旦“死亡”发生或计时器用完,原始精灵就会返回。

所以,我正在使用此代码使其变小:

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

还有这段代码用于恢复正常:

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

但是,原始图像(在初始化和重置时)看起来正常。但是当我将它更改为新精灵(其尺寸正好是原始精灵的 75%)时,它会改变它,但只显示新精灵的一个象限,但具有原始尺寸。

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

以下是一些视觉示例:

原文:


带有 contentSize 修改的纹理图像:


将图像重新纹理化为原始图像,而 contentSize 未正确重置(哎呀,但这根本不是问题 - 我只是忘记读取尺寸代码):

PS——我的所有精灵都有“-hd.png”版本,所以我只想补充一点,以防有人想知道(到目前为止,图像和测试只在“nonretina”模拟器上进行)。

谢谢!


编辑:在视网膜模拟器上进行测试时也会出现问题。

【问题讨论】:

    标签: ios cocos2d-iphone openfeint


    【解决方案1】:

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

    我将您的原始图像复制到图像编辑程序中以查看其尺寸。图像大小为 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 图像。

    【讨论】:

    • 我想出了一个懒惰的解决方法:P [[balls objectAtIndex:i] setDisplayFrame:[CCSpriteFrame frameWithTexture:[[CCSprite spriteWithFile:@"ball-small.png"] texture] rect:CGRectMake(0,0, 53, 53)]];
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 2011-10-17
    • 1970-01-01
    • 2011-09-26
    相关资源
    最近更新 更多