首先感谢您抽出时间来研究这个问题。 我遇到的问题是使用Cocos2d和Z值来确定精灵相对于其他对象的位置。
我有一个使用CCLabelBMFont的精灵('Ball')和一个得分标签('scoreLabel'),我希望'Ball'精灵出现在得分标签的前面。我目前正在尝试通过z值,但它无法正常工作。
我不确定它是否因为一个是精灵而另一个不是因为当另一个对象是一个精灵时,下面的内容会起作用但是如果有人能指出我的方向我会出错的话赞赏。
下面列出了相关代码。
// Constants.h
// TestGame
//#ifndef SpaceViking_Constants_h
//#define SpaceViking_Constants_h
#define kBallSpriteZValue 10
#define kBallSpriteTagValue 0
#define kNewScoreTagValue 0
#define kNewScoreZValue 25
// GamePlayLayer.m
// TestGame
#import "Constants.h"
-(id)init {
self = [super init];
if (self !=nil) {
Ball *ball = [[Ball alloc]
initWithSpriteFrame:[[CCSpriteFrameCache
sharedSpriteFrameCache]
spriteFrameByName:@"Ball_1.png"]];
[ball setPosition:ccp(screenSize.width * 0.19f,
screenSize.height * 0.19f)];
[sceneSpriteBatchNode
addChild:ball
z:kBallSpriteZValue
tag:kBallSpriteTagValue];
scoreLabel = [CCLabelBMFont labelWithString:@"0"
fntFile:@"Test.fnt"];
scoreLabel.position = ccp(screenSize.width * 0.5f, screenSize.height * 0.9f);
[self addChild:scoreLabel
z:kNewScoreZValue tag:kNewScoreTagValue];
}
return self;
}
答案 0 :(得分:2)
z ordering
仅在您nodes
为siblings
时才有意义(他们拥有相同的父母); Cocos2d
children
的顺序用于确定它们呈现的顺序为z order
对象设置CCNode
不会产生任何影响,因为它们不是兄弟姐妹。
ball
是child
的{{1}},但标签是sceneSpriteBatchNode
的孩子。
这意味着self
已经显示在文本后面,假设这是您的层次结构:
ball
不要在代码中使用定义,而应考虑使用->sceneSpriteBatchNode->ball
->label
之类的
enum
这样做更好,因为编译器知道您使用了正确的typedef NS_ENUM(NSUInteger, UTzOrder) {
ballsZorder = 0,
labelsZorder = 1,
otherStuffZorder = 2
};
,它更漂亮,更容易更改。
请记住,只有当他们是兄弟姐妹时才会这样。
答案 1 :(得分:1)
查看你的代码我发现你给你的标签赋予了更高的z值。你应该把它给你的精灵(球),而不是给你的精灵更高的价值,这样它就会被放在标签上。
无论何时在cocos2d中创建任何对象,它都将被置于默认的z = 0,您可以设置z值以将对象置于当前对象之后或当前对象之上。你也可以设置负z值,把你的标签放在你的精灵后面。
例如:
您也可以稍后重新排序z值 [self reorderChild:spritename z:newzvalue];