CCLabelTTF值未更新(cocos2d)

时间:2013-01-05 12:30:20

标签: iphone cocos2d-iphone

我有两个层控制层,其中包含用于得分的CCLabelTTF,以及第一层,其中我检测到碰撞btwn我的对象。我想从我的第一层更新控制层中的分数(即CCLabelTTF值)。

这是我的代码......

my scene.m

-(id)init{

    self=[super init];   

    FirstLayer *fl=[FirstLayer node];

    [self addChild:fl];

    controlLayer *cl=[controlLayer node];

    [self addChild:cl z:3 tag:1];

    return self;


       }

control layer.h

@interface controlLayer : CCLayer{
     CCLabelTTF * score ;
     int score_value;        
}

@property(nonatomic,retain)CCLabelTTF * score ;
@property int score_value;

-(void)displayScore;    
@end

controlLayer.m

-(id)init{        
   // my code..            
        [self displayScore];            
    }

    return self;
}


-(void)displayScore{        
    CGSize screenSize=[[CCDirector sharedDirector]winSize];    
    CCLabelTTF * score_lbl = [CCLabelTTF labelWithString:@"Score" fontName:@"Arial" fontSize:16.0];    
    score_lbl.position=ccp(screenSize.width*0.10,screenSize.height*0.90);        
    [self addChild:score_lbl z:99];

    score =[CCLabelTTF labelWithString:[NSString stringWithFormat:@"test:%d",score_value] fontName:@"Arial" fontSize:16.0] ;          
    NSString *str = [score string];        
    NSLog(@"SCORE control:%@",str);    
    score.position=ccp(screenSize.width*0.20,screenSize.height*0.90);        
    [self addChild:score];        
}

firstLayer.h

@interface FirstLayer : CCLayer     
{           
    controlLayer *cl;                
    }

@property(nonatomic,retain)controlLayer *cl;    

@end

firstLayer.m

@implementation FirstLayer

@synthesize cl;    
    -(id)init{

 ---

cl=[controlLayer new];
[self schedule:@selector(tick:)];

    return self;

}


-(void)tick:(ccTime)dt{           
    bool blockFound=false;        
    world->Step(dt, 10, 10);      

    std::vector<MyContact>::iterator pos;
    for(pos = _contactListener->_contacts.begin(); 
        pos != _contactListener->_contacts.end(); ++pos) {
        MyContact contact = *pos;          

        b2Body *bodyA = contact.fixtureA->GetBody();
        b2Body *bodyB = contact.fixtureB->GetBody();
        if (bodyA->GetUserData() != NULL && bodyB->GetUserData() != NULL) {
            CCSprite *spriteA = (CCSprite *) bodyA->GetUserData();
            CCSprite *spriteB = (CCSprite *) bodyB->GetUserData();                         

            // Sprite A = ball, Sprite B = Block
            if (spriteA.tag == 1 && spriteB.tag == 2) {                    

                cl.score_value=cl.score_value+5;

                [cl.score setString:[NSString stringWithFormat:@"%d",cl.score_value]];                                   

                NSString *str = [cl.score string];

                NSLog(@"SCORE in GAME:%@",str);

               // [cl displayScore];                        

                if (std::find(toDestroy.begin(), toDestroy.end(), bodyB) 
                    == toDestroy.end()) {
                    toDestroy.push_back(bodyB);

                }
            }
            // Sprite B = block, Sprite A = ball
            else if (spriteA.tag == 2 && spriteB.tag == 1) {                      

                cl.score_value=cl.score_value+5;

               [cl.score setString:[NSString stringWithFormat:@"%d",cl.score_value]];

                NSString *str = [cl.score string];

                NSLog(@"SCORE in GAME:%@",str);

             //    [cl displayScore];                    

            }               

        }                 
    }

出错了什么? ,我总是得分:测试0!:(

2 个答案:

答案 0 :(得分:1)

您的声明cl=[controlLayer new];未获得添加到游戏场景中的controlLayer的引用。正如您的游戏scene.m代码所示,FirstLayer和controlLayer实例都被初始化并作为子项添加到CCScene中。要从FirstLayer内部获得对controlLayer的正确引用,请执行以下操作:

FirstLayer.m

-(void) onEnter {
[super onEnter];
cl = (controlLayer*)[self.parent getChildByTag:1];
}

你必须把它放在onEnter上的原因是因为self.parent在FirstLayer的init方法中无效。初始化完成后调用onEnter。这应该为您提供添加到游戏场景中的实际controlLayer的参考。

答案 1 :(得分:-1)

我认为从它的外观来看,您正在向控制层发送新的分数值,但您没有更新标签,因为您只设置了一次。如果score_value更改,它将不会自动更新。我认为您需要在控制层中安排一个更新方法来更新分数标签。