0

@selector(count) interval: 1.0f をスケジュールして、残り時間をカウントします。これが私のコードです:(GameManager.mファイル内)

-(void) count {
duration++;
[[[GameScene sharedScene] gadgetLayer] updateTimerLabel];
if (timeLimit - duration <= 5 && ticking == NO) {
    ticking = YES;
    [self schedule:@selector(untick) interval:5];
    [[SimpleAudioEngine sharedEngine] playEffect:@"tick.caf"];
}
if (duration >= timeLimit) {
    [self lose];
}
}

gadgetLayer は、timerLayer と scoreLayer のものを置く場所です。カウントは GameManager.m でスケジュールされていません。代わりに、GameScene.m ファイルに入れました。

-(void) onEnter {
[[GameManager sharedManager] schedule:@selector(count) interval:1.0];
[super onEnter
}


- (void)onExit {
[[GameManager sharedManager] unschedule:@selector(count)];
[super onExit];
}

しかし、timerLabel は変更されません。count メソッドは GameManager.m ファイルにありますが、GameScene.m ファイル内にある必要がありますか? 何か問題がありますか?

+(GameManager*) sharedManager {
if (instanceOfGameManager == nil) {
    return [[GameManager alloc] init];
}
else return instanceOfGameManager;
}


-(id) init {
if ((self = [super init])) {
    instanceOfGameManager = self;

    [self scheduleUpdate];
}
return self;
}`


-(void) update: (ccTime) delta {
    int a = 2;

}

`

「int a = 2」行にブレークポイントを設定しましたが、到達できません。[GameManager sharedManager] は appDidFinishLaunching メソッドで呼び出されるため、割り当てられず、再度初期化されることはないと思います。

4

1 に答える 1

1

実際、理由はわかりませんが、機能します。

-(void) onEnter {
    GameManager *sharedManager = [GameManager sharedManager];
    [[CCScheduler sharedScheduler] scheduleSelector:@selector(count)
                                          forTarget:sharedManager
                                           interval:1.0
                                             paused:NO];

//    [self schedule:@selector(tick:) interval:0.5];
}

次の質問に答える:

sharedSchedulerを使用したスケジュール解除は完璧に機能します。あなたの問題は、HelloWorld.mで[super onEnter](そしてちなみに)忘れてしまったためにタッチイベントを受け取らないことであり、CCLayerがtouchDispatcherに自己登録する場所です。これを追加すると、すべてが機能します。super onExitsuper onEnter

于 2011-05-31T06:55:05.067 に答える