0

私はゲームをプログラミングしており、SKLabel を使用して現在のスコアを表示しています。問題は、スコアが変更されたときに、その時点で画面に変更が表示されず、1 秒後に変更が表示されることです。使用した瞬間の変化を確認するにはどうすればよいですか[sklabelscore setTextScore:++self.score]。レンダリングなどを強制できますか?

ユーザーが敵に触れたときに setTextScore を呼び出します。touchesBegan:withEvent:

setTextScore:実装は

SKLabelNode* scoreLabel=(SKLabelNode*)[self childNodeWithName:@"scoreLabel"];
scoreLabel.text=[NSString stringWithFormat:@"Score: %d",self.score];
4

2 に答える 2

2

++scoreあなたのインクリメントはローカル変数であり、 と同じではない可能性が最も高いようself.scoreです。

次のようにメソッドを呼び出します。

[sklabelscore setTextScore:++score]

つまり、コード付きの署名は次のようにする必要があります。

-(void) setTextScore:(int)theNewScore
{
    SKLabelNode* scoreLabel=(SKLabelNode*)[self childNodeWithName:@"scoreLabel"];
    scoreLabel.text=[NSString stringWithFormat:@"Score: %d",self.score];
}

したがって、渡してtheNewScoreいますが、使用するフォーマット文字列でそれを使用する代わりに、インクリメントされた変数がローカル変数であるself.score場合は更新されない可能性があります(つまり、新しい値を に割り当てません)。++scoreself.score

于 2014-02-20T09:39:01.360 に答える
1

解決しました...私はばかのように感じます:S

問題は、敵に触れたときに敵をフェードアウトさせ、0.5 秒後にラベルを変更することでした。私はそれをブロックの外に出し、すべて正常に機能しています。

setTextScore: メソッドが冗長だったので変更しました (@LearnCocos2D に感謝)

...
SKAction* fade=[SKAction fadeOutWithDuration:0.5];
[node runAction:fade completion:^{
    [node removeFromParent];
    self.enemyNumber--;
    self.score++;
    SKLabelNode* scoreLabel=(SKLabelNode*)[self childNodeWithName:@"scoreLabel"];
    scoreLabel.text=[NSString stringWithFormat:@"Score: %d",self.score];
}];

新しいフォーム (ブロックの外側):

...
self.score++;
SKLabelNode* scoreLabel=(SKLabelNode*)[self childNodeWithName:@"scoreLabel"];
scoreLabel.text=[NSString stringWithFormat:@"Score: %d",self.score];
SKAction* fade=[SKAction fadeOutWithDuration:0.5];
[node runAction:fade completion:^{
    [node removeFromParent];
}];

助けてくれてありがとう、そしてこのばかげた質問をして申し訳ありません...

于 2014-02-20T10:04:25.003 に答える