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 顺序...
它们将始终呈现在房屋上,直到我更改这些批处理节点的顺序

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

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

我有点坚持......有没有办法实现这一点,有不同的精灵 bacth 节点?或者可以以编程方式合并两个batchnodes?(或类似的东西)

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

4

3 回答 3

0

我发现改变 a 的vertexZ属性CCNode(比如 a CCSprite)它实际上改变了它的 Z 位置(所以它会稍微大一点/小一点,并且也翻译)

所以,为了在 z-index CCSprites 上安排不同的 spriteSheet,我必须使用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];

我还将每个精灵添加到 aNSMutableArray 然后在 for 循环中(在update预定方法内):

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

希望这可以帮助某人:)

于 2012-04-03T16:13:15.163 回答
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];
于 2014-02-12T12:03:53.407 回答
0

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

void LocalGameController::SetZOrderForObject(cocos2d::Sprite *object){
  int objectZOrder = visibleSize.height - object->getPositionY();
  context->reorderChild(object, objectZOrder);
}
于 2017-06-05T10:38:40.023 回答