селектор расписания cocos2d вне класса

#iphone #objective-c #cocos2d-iphone #schedule

#iPhone #objective-c #cocos2d-iphone #Расписание

Вопрос:

Я хочу запланировать интервал @selector (count): 1.0f для подсчета оставшегося времени. вот мой код: (В файле GameManager.m)

 -(void) count {
duration  ;
[[[GameScene sharedScene] gadgetLayer] updateTimerLabel];
if (timeLimit - duration <= 5 amp;amp; 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];
}
  

Но метка времени не изменится. Метод 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, поэтому, я думаю, он не будет выделен и инициализирован снова.

Комментарии:

1. Запланировано ли количество ваших методов? Достигает ли программа этого метода?

2. он достигает метода onEnter в GameScene без ошибок, но не достигает метода count в классе GameManager

3. и я попытался вызвать scheduleCount и метод unscheduleCount GameManager, scheduleCount равен: [self schedule: @selector (count) интервал: 1.0f] unscheduleCount равен: [self unschedule: @selector(count)]; но результат тот же.

4. Вы проверяли с помощью debugger, что он не достигает, или вы просто думаете, что это не так, потому что вы не видите то, что хотите на экране? Также от какого класса наследуется GameManager?

5. странно, я пробовал scheduleUpdate в методе инициализации GameManager.m и добавлял точку останова внутри метода update: (ccTime) delta, но она не может быть достигнута

Ответ №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 работает идеально. Ваша проблема в том, что вы не получаете события касания, потому что вы забыли [super onEnter] (и кстати super onExit ) в HelloWorld.m и super onEnter это место, где CCLayer производит самостоятельную регистрацию с помощью touchDispatcher. Если вы добавите это, все будет работать.

Комментарии:

1. привет, @selector (count) не останавливается, когда я нажимаю PauseScene и вызываю метод [GameManager sharedManager] unschedule …], уже отправил вам электронное письмо. Спасибо!

2. попробуйте использовать [[CCScheduler sharedScheduler] вне расписания …]

3. да, я пробовал это, но все то же самое. Не могли бы вы попробовать это в моем приложении? второе электронное письмо. Спасибо