0

我对更改 CCSprite 的纹理有点困惑。

我有:

aTexture[NUM_WALLS+11] = [[CCTexture2D alloc]initWithImage:[UIImage imageNamed:@"shop1.png"]];
[aSprite setTexture:aTexture[NUM_WALLS+11]];

aTexture[NUM_WALLS+9] = [[CCTexture2D alloc]initWithImage:[UIImage imageNamed:@"bush2.png"]];
[aSprite setTexture:aTexture[NUM_WALLS+9]];

这两个图像有两种不同的尺寸。但是,当我更改纹理时,精灵不会改变大小。相反,图像会缩放到精灵的大小。我认为精灵应该改变大小。

有人可以澄清一下吗?

4

4 回答 4

2

图像文件可能有不同的大小,但纹理可能使用相同的大小,因为它们通常会放大到下一个最接近的 2 次方(在 cocos2d 中默认禁用 NPOT 纹理支持)。

含义:如果一张图像是 150x150 而另一张是 250x250,它们的纹理都将具有 256x256 尺寸。如果从图像文件加载精灵,cocos2d 会将绘制的纹理的实际部分调整为图像的大小(contentSize)。如果更改纹理,cocos2d 将简单地使用纹理的大小,而不管存储在纹理中的图像的大小——因为在创建纹理后该信息会丢失。

在这种情况下,您将不得不在精灵上手动调用 setTextureRect: 以仅在纹理中绘制实际图像的区域。

更好的解决方案是创建一个包含两种纹理的纹理图集,然后只更改精灵显示的精灵帧。它更容易,也可以节省内存。

于 2012-06-30T12:21:47.060 回答
2

对于那些仍然想使用 setTexture 的人。

我发现这在这里有效:

CCTexture2D* tex2d = [[CCTexture2D alloc] initWithImage:[UIImage imageNamed:_texture]]; CGSize texSize = [tex2d contentSize]; [sprite setTexture:tex2d]; [sprite setTextureRect:CGRectMake(0, 0, texSize.width, texSize.height)];

setTexture 和 setTextureRect 的顺序很重要。否则它将无法正常工作。

于 2012-07-26T12:40:25.430 回答
0

CCTexture2D* tex2d = [[CCTexture2D alloc] initWithImage:[UIImage imageNamed:_texture]]; CGSize texSize = [tex2d contentSize]; [精灵 setTexture:tex2d]; [精灵 setTextureRect:CGRectMake(0, 0, texSize.width, texSize.height)];

警告

此代码存储纹理,但它可能会导致内存泄漏,因为从不调用 dealloc 函数。

您可以通过继承 CCTexture2D 类来检查它。至少 alloc-init 对于 CCSprite 对象总是以这种错误的方式工作

于 2013-04-22T20:02:50.283 回答
0

据我所知,CCSprite 使用它的 contentSize 属性和位置来计算要使用 OpenGL 绘制的顶点数组。这样,精灵不会改变它的可见大小,直到你改变它的 contentSize 属性。

于 2012-06-30T10:17:36.000 回答