0

スコア用のCCLabelTTFを含む2つのレイヤーコントロールレイヤーと、オブジェクト間の衝突を検出する最初のレイヤーがあります。最初のレイヤーからコントロール レイヤーのスコア (CCLabelTTF 値) を更新したいと考えています。

これが私のコードです...

私のシーン.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;


       }

コントロールレイヤー.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 !:(

4

2 に答える 2

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 への参照が得られます。

于 2013-01-05T13:38:44.483 に答える
-1

一見すると、新しいスコア値をコントロール レイヤーに送信していると思いますが、一度しか設定していないため、ラベルを更新していません。score_value が変更された場合、自動的に更新されません。スコア ラベルを更新するコントロール レイヤーで update メソッドをスケジュールする必要があると思います。

于 2013-01-05T12:52:24.480 に答える