2012-03-31 9 views
0

私はCCSpriteBatchNodeをcocos2d olnyで使用すると、zオーダーのスプライトを子として追加することができることを理解しました(これは明らかです)。ココス2dを使ってアイソメトリックマップのスプライトを作成する最も良い方法

[[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順序を変更することができます方法はありません...
彼らは常にhでレンダリングされます私は

ところでこれらのバッチノードの順序を変更するまでウーズは、私はそれは、スプライトの座標を使用してスプライトを注文することが可能となったそう...一つの大きな単一バッチノードにすべてのスプライト芸術「マージ」でき

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

私はちょっとそれに固執しています......それを達成する方法はありますか?スプライトバクトノードが違うのですか? 2つのバッチ技術をプログラムでマージすることは可能ですか? (またはそのような何か)

iはKnightFight、彼は代わりにバッチノードで、CCSpriteFrameCCSpritesetDisplayFrame方法を使用.. LozArcherによってgithubの上で本当に面白い開いているプロジェクトを見つけました...しかし、私は以来、それを実行することはできません私が(CCSpriteのような)CCNodevertexZプロパティを変更することは、実際にそのZ位置を変更する(それが少し大きくなりますことを発見したcocos2dの古いバージョン(明らかにXcodeの4で作業していない)

答えて

0

のようです/より小さい、また翻訳された)

それで、z-index CCSpr上記の例の少しリファクタリング後..

を私は(ちょうどレンダリング順序を変更する)reorderChildメソッドを使用していたと、ほとんど私がCCSpriteBatchNodeを使用しないように必要な異なるspriteSheetとITESは、私が持っている必要があります。

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

私はまた、(update予定方式内部)ループの中NSMutableArray し、その後に各スプライトを追加しました:

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

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

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

マップ上でスプライトZオーダーをY位置に設定します。更新ループで動的スプライトの順序を変更します。スプライトの現在のY位置と地図の目に見える高さを使用してZ次数を計算します。

void LocalGameController::SetZOrderForObject(cocos2d::Sprite *object){ 
    int objectZOrder = visibleSize.height - object->getPositionY(); 
    context->reorderChild(object, objectZOrder); 
} 
関連する問題