我有两个层控制层,其中包含用于得分的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!:(
答案 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更改,它将不会自动更新。我认为您需要在控制层中安排一个更新方法来更新分数标签。