Cocos2d iphone 在等轴测地图上使用cocos2d对精灵进行z排序的最佳方法

Cocos2d iphone 在等轴测地图上使用cocos2d对精灵进行z排序的最佳方法,cocos2d-iphone,isometric,Cocos2d Iphone,Isometric,经过几次头痛之后,我发现将CCSpriteBatchNode与cocos2d olny一起使用,可以将z顺序的精灵作为子对象添加到其中(这一点很明显,现在我明白了……) 由于我必须将它们添加到显示列表中,如下所示 [_isoMap addChild:objectsSpriteSheet]; [_isoMap addChild:tokenSpriteSheet]; 我无法更改其他房屋之间单个代币的z顺序… 在我更改这些批处理节点的顺序之前,它们将始终在房屋上渲染 顺便说一句,我可

经过几次头痛之后,我发现将
CCSpriteBatchNode
与cocos2d olny一起使用,可以将z顺序的精灵作为子对象添加到其中(这一点很明显,现在我明白了……)

由于我必须将它们添加到显示列表中,如下所示

    [_isoMap addChild:objectsSpriteSheet];
    [_isoMap addChild:tokenSpriteSheet];
我无法更改其他房屋之间单个代币的z顺序…
在我更改这些批处理节点的顺序之前,它们将始终在房屋上渲染

顺便说一句,我可以“合并”在一个大的单批节点所有精灵的艺术。。。这样就可以使用精灵的坐标来订购精灵

    [fullSpriteSheet reorderChild:token z:token.position.y];
我有点受不了。。。。。。有没有办法做到这一点,使用不同的sprite Bath节点?或者可以通过编程方式合并两个BatchNode?(或诸如此类)


我发现,LozArcher在github上的一个非常有趣的开放项目。。他使用了
CCSpriteFrame
CCSprite
setDisplayFrame
方法,而不是批处理节点。。。但我无法运行它,因为它似乎是cocos2d的旧版本(显然不适用于xcode 4)

我发现更改
CCNode
vertexZ
属性(如
CCSprite
)实际上会更改其Z位置(因此它会稍微大一点/小一点,也会转换)

因此,为了使用不同的spriteSheet在z索引上排列ccsprite,我必须使用
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
scheduled方法中):


希望这能帮助某人:)

我仍然认为这不是更好的解决方案, 若你们在地图上的对象是动态移动的,你们仍然会陷入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];

将精灵Z顺序设置为其在地图上的Y位置。在更新循环中重新排列动态精灵。使用精灵当前的Y位置和贴图的可见高度计算Z顺序

void LocalGameController::SetZOrderForObject(cocos2d::Sprite *object){
  int objectZOrder = visibleSize.height - object->getPositionY();
  context->reorderChild(object, objectZOrder);
}
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];
void LocalGameController::SetZOrderForObject(cocos2d::Sprite *object){
  int objectZOrder = visibleSize.height - object->getPositionY();
  context->reorderChild(object, objectZOrder);
}