我对改变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]];
这两张图片有两种不同的尺寸。但是,当我更改纹理时,精灵不会改变大小。相反,图像缩放到精灵的大小。我认为精灵应该改变大小。
有人可以澄清一下吗?
答案 0 :(得分:2)
图像文件可能具有不同的大小,但纹理可能使用相同的大小,因为它们通常会扩展到下一个最接近的2的幂(默认情况下在cocos2d中禁用NPOT纹理支持)。
含义:如果一个图像是150x150而另一个图像是250x250,那么它们的纹理都将具有256x256的尺寸。如果从图像文件加载精灵,cocos2d会调整绘制到图像大小的纹理的实际部分(contentSize)。如果更改纹理,cocos2d将只使用纹理的大小而不管纹理中存储的图像的大小 - 因为在创建纹理后该信息会丢失。
在这种情况下,您必须在sprite上手动调用setTextureRect:以仅绘制纹理中实际图像的区域。
更好的解决方案是使用两个纹理create a texture atlas,然后只更改精灵显示的精灵框架。它也更容易,也可以节省内存。
答案 1 :(得分: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的顺序很重要。否则它将无效。
答案 2 :(得分:0)
据我所知,CCSprite使用它的contentSize属性和位置来计算要使用OpenGL绘制的顶点数组。这样,精灵在改变它的contentSize属性之前不会改变它的vizible大小。
答案 3 :(得分:0)
CCTexture2D * tex2d = [[CCTexture2D alloc] initWithImage:[UIImage imageNamed:_texture]]; CGSize texSize = [tex2d contentSize]; [精灵 的SetTexture:tex2d]; [sprite setTextureRect:CGRectMake(0,0, texSize.width,texSize.height)];
警告强>
此代码存储纹理但可能导致内存泄漏,因为永远不会调用dealloc函数。
您可以通过继承CCTexture2D类来检查它。对于CCSprite对象,至少alloc-init总是以错误的方式工作