0

いくつか頭を悩ませた後CCSpriteBatchNode、cocos2d olny を使用すると、子として追加されたスプライトを z オーダーできることがわかりました (これは明らかです。今ではわかりました..)

    [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"token_default.plist"];
    CCSpriteBatchNode *tokenSpriteSheet = [CCSpriteBatchNode batchNodeWithFile:@"token_default.png"];
    [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"objects_default.plist"];
    CCSpriteBatchNode *objectsSpriteSheet = [CCSpriteBatchNode batchNodeWithFile:@"objects_default.png"];

    CCSprite *token = [[[CCSprite alloc] initWithSpriteFrameName:@"token_SE.png"] autorelease];
    [token setPosition:tokenSpawnPoint];
    CCSprite *enemy = [[[CCSprite alloc] initWithSpriteFrameName:@"token_blak_SE.png"] autorelease];
    [enemy setPosition:enemySpawnPoint];
    CCSprite *houseA = [[[CCSprite alloc] initWithSpriteFrameName:@"house_small.png"] autorelease];
    [houseA setPosition:[self randomHousePosition]];
    CCSprite *houseB = [[[CCSprite alloc] initWithSpriteFrameName:@"house_big.png"] autorelease];
    [houseB setPosition:[self randomHousePosition]];

    [tokenSpriteSheet addChild:token];
    [tokenSpriteSheet addChild:enemy];
    [objectsSpriteSheet addChild:houseA];
    [objectsSpriteSheet addChild:houseB];

そして、次のように表示リストに追加する必要があるため..

    [_isoMap addChild:objectsSpriteSheet];
    [_isoMap addChild:tokenSpriteSheet];

他の家の間で単一のトークンの z オーダーを変更する方法はありません...
これらのバッチ ノードの順序を変更するまで、それらは常に家の上にレンダリングされます

ところで、すべてのスプライトのアーツを 1 つの大きな単一のバッチ ノードに「マージ」できます...そうすることで、スプライトの座標を使用してスプライトを並べ替えることが可能になりました

    [fullSpriteSheet reorderChild:token z:token.position.y];

私はそれに少し立ち往生しています......異なるスプライトバックノードを持つことでそれを達成する方法はありますか? またはプログラムで2つのバッチノードをマージすることは可能ですか? (またはそのようなもの)

LozArcherによる github の非常に興味深いオープン プロジェクトであるKnightFightを見つけました。彼はバッチ ノードの代わりにCCSpriteFrameandCCSpriteのメソッドを使用しました... setDisplayFramexcode 4)

4

3 に答える 3

0

マップ上のオブジェクトが動的に移動している場合でも、z オーダーの問題でスタックする可能性があります。

私はその非常に古い投稿を知っており、人々はGoogle検索でここに来続けているので、ここに解決策を投稿しています.

float lowestZ = tilemap.map.width +tilemap.map.height ;
float currentZ = self.gridLocation.x + self.gridLocation.y ;
int zOrderDecided = lowestZ + currentZ - 1 ;
[self.parent reorderChild:self z:zOrderDecided];
于 2014-02-12T12:03:53.407 に答える
0

( a のような)のvertexZプロパティを変更すると、実際にそのZ位置が変更されることがわかりました(したがって、わずかに大きく/小さくなり、また変換されます)CCNodeCCSprite

したがって、異なるスプライトシートを使用して z-index CCSprites を配置するには、reorderChildメソッドを使用する必要があり (レンダリング順序を変更するだけ)、ほとんどの場合、使用する必要はありませんCCSpriteBatchNode..

上記の例を少しリファクタリングした後、次のようにする必要があります。

CCSprite *token = [CCSprite spriteWithSpriteFrameName:@"token_SE.png"];
[token setPosition:tokenSpawnPoint];
CCSprite *enemy = [CCSprite spriteWithSpriteFrameName:@"token_blak_SE.png"];
[enemy setPosition:enemySpawnPoint];

CCSprite *houseA = [CCSprite spriteWithSpriteFrameName:@"house_small.png"];
[houseA setPosition:[self randomHousePosition]];
CCSprite *houseB = [CCSprite spriteWithSpriteFrameName:@"house_big.png"];
[houseB setPosition:[self randomHousePosition]];

[_isoMap addChild:token];
[_isoMap addChild:enemy];
[_isoMap addChild:houseA];
[_isoMap addChild:houseB];

また、各スプライトを a に追加しNSMutableArray 、次に for ループ (updateスケジュールされたメソッド内)に追加しました。

CCSprite *sprite = [mySpritesArray objectAtIndex:i];
[_isoMap reorderChild:sprite z:(_isoMap.mapSize.height - sprite.y)];

これが誰かを助けることを願っています:)

于 2012-04-03T16:13:15.163 に答える