2012-03-31 34 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); 
}