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]];

2つの画像には2つの異なるサイズがあります。ただし、テクスチャを変更してもスプライトのサイズは変更されません。代わりに、画像はスプライトのサイズに合わせて拡大縮小されます。スプライトのサイズが変わるはずだと思いました。

誰かが明確にできますか?

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

私の知る限り、CCSpriteはcontentSizeプロパティと位置を使用して、OpenGLを使用して描画される頂点の配列を計算します。このように、スプライトは、contentSizeプロパティを変更するまで、表示可能なサイズを変更しません。

于 2012-06-30T10:17:36.000 に答える
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 に答える