2012-03-31 64 views
0

經過一些頭痛之後,我發現使用CCSpriteBatchNode與cocos2d olny可以將z-order sprite添加到它作爲孩子(這很明顯,現在我看到了..)在cocos2d上等軸測圖上z-sprite的最佳方法

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

我有點卡住了......有沒有辦法實現這一點,有不同的精靈bacth節點?或者可以以編程方式合併兩個batchnodes? (或類似的東西)

我發現KnightFight,由LozArcher github上一個非常有趣的開放項目。他用CCSpriteFrameCCSpritesetDisplayFrame方法,而不是一批節點...但我不能運行它,因爲這似乎是cocos2d中的舊版本

回答

0

(顯然不是在Xcode 4個工作日),我發現改變的CCNode(如CCSprite),它實際上改變其Z位置的vertexZ性質(所以這將是稍微大一點/更小,並且還翻譯)

所以,爲了對z索引CCSpr安排不同spriteSheet ITES我有上面的例子中的一個小重構後使用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]; 

我還添加了每個精靈的NSMutableArray ,然後在for循環(內update計劃法):

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

希望這可以幫助別人:)

0

我仍然認爲這不是更好的解決辦法,如果 在地圖上你的對象是動態的移動,你仍然可以停留在Z順序的問題。

我知道它很老的帖子,並不斷有人來到這裏通過谷歌搜索, 所以我在這裏張貼的解決方案。

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位置。在更新循環中重新排序動態精靈。使用Sprite當前的Y位置和地圖的可見高度計算Z順序。

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