我以为我了解 z order 在 cocos2d 中的工作原理,但我遇到了一个我无法解释的问题。
我有许多 CCSprites 作为 CCSpriteBatchNode 的子节点,使用下面的代码创建。这些精灵中的每一个都有几个子 CCSprite。只要我传递给 addChild 的 z 值为正,一切都可以正常工作。当它们为负时,它会按我的预期停止工作,而且我找不到任何关于为什么会出现这种情况的信息。我正在使用 cocos2d 1.0.1 版。
CCSprite *pikaSprite = [CCSprite spriteWithSpriteFrameName:@"PikaLarge.png"];
[pikaSprite setAnchorPoint:ccp(0.0f, 0.5f)];
[pikaSprite setPosition:ccp(pikaX, pikaBox.boundingBox.size.height * 0.6f)];
[pikaBatchNode addChild:pikaSprite z:0];
CCSprite *sprite1 = [CCSprite spriteWithSpriteFrameName:@"Sprite1.png"];
[sprite1 setPosition:ccp(pikaSprite.boundingBox.size.width * 0.7f, pikaSprite.boundingBox.size.height * 0.9f)];
[pikaSprite addChild:sprite1 z:-1];
CCSprite *sprite2 = [CCSprite spriteWithSpriteFrameName:@"Sprite2.png"];
[sprite2 setPosition:ccp(pikaSprite.boundingBox.size.width * 0.8f, pikaSprite.boundingBox.size.height * 0.9f)];
[pikaSprite addChild:sprite2 z:-10];
sprite2 出现在 sprite1 前面,但在 pikaSprite 后面。据我了解,它应该在 sprite1 之后,因为它们是兄弟姐妹,而 sprite2 的 z 值较低。
我希望 sprite2 在 sprite1 之后,都在 pikaSprite 之后,除非我更改添加它们的顺序,否则我无法获得,这是可能的,但有点困难。
我尝试了四种不同的顺序,这是唯一一个不起作用的顺序。
1.
[pikaSprite addChild:sprite1 z:1];
...
[pikaSprite addChild:sprite2 z:10]; // sprite2 is in front, correct
2.
[pikaSprite addChild:sprite1 z:10]; // sprite1 is in front, correct
...
[pikaSprite addChild:sprite2 z:1];
3.
[pikaSprite addChild:sprite1 z:-10];
...
[pikaSprite addChild:sprite2 z:-1]; // sprite2 is in front, correct
4.
[pikaSprite addChild:sprite1 z:-1];
...
[pikaSprite addChild:sprite2 z:-10]; // sprite2 is in front - ???
当它们为负数时,似乎最后添加的总是在前面。
有可能重写一些东西来处理这个问题,但我很好奇为什么会发生这种情况,并且想知道我是否可能误解了一些东西。
感谢您能给我的任何见解。