精灵和标签之间的Cocos2D Z值

时间:2014-04-10 12:48:20

标签: cocos2d-iphone

首先感谢您抽出时间来研究这个问题。 我遇到的问题是使用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;
}

2 个答案:

答案 0 :(得分:2)

您需要知道的事情

  1. z ordering仅在您nodessiblings时才有意义(他们拥有相同的父母); Cocos2d
  2. 中的 z顺序不是全局
  3. 如果没有定义z顺序,则添加children的顺序用于确定它们呈现的顺序
  4. 这对您的用例意味着什么

    z order对象设置CCNode不会产生任何影响,因为它们不是兄弟姐妹。

    ballchild的{​​{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值,把你的标签放在你的精灵后面。

例如:

define kBallSpriteZValue 0 //在你的情况下,这个值应该更大

定义kNewScoreZValue -1

您也可以稍后重新排序z值 [self reorderChild:spritename z:newzvalue];