Обратный отсчет / Таймер - PullRequest
       5

Обратный отсчет / Таймер

2 голосов
/ 20 ноября 2011

, пожалуйста, кто-нибудь может показать мне, как реализовать таймер обратного отсчета для запуска игры в cocos2d для iPhone.

Я имею в виду, что при нажатии «play» появляется новая сцена с отображаемыми числами «3», «2», «1» и затем словом «GO!».

Ответы [ 2 ]

3 голосов
/ 21 ноября 2011

Из "Cocos2d Best Practices":

Старайтесь НЕ использовать какао NSTimer. Вместо этого используйте собственный планировщик cocos2d.

Итак, это пример использования планировщика cocos2d для анимации вашей метки, даже с некоторым эффектом.

В @interface:

int timeToPlay;
CCLabelTTF * prepareLabel;
CCLabelTTF * timeoutLabel;
CCMenu *menu;

В init:

timeToPlay=4;

CGSize s = [CCDirector sharedDirector].winSize;
prepareLabel = [CCLabelTTF labelWithString:@"Prepare to play!" fontName:@"Marker Felt" fontSize:40];
prepareLabel.position = ccp(s.width/2.0f, 150);

timeoutLabel = [CCLabelTTF labelWithString:@"3" fontName:@"Marker Felt" fontSize:60];
timeoutLabel.position = ccp(s.width/2.0f, 90);

[self addChild:prepareLabel];
[self addChild:timeoutLabel];

timeoutLabel.visible=NO;
prepareLabel.visible=NO;

...
CCMenuItem *Play = [CCMenuItemFont itemFromString:@"PLAY" 
                                           target:self 
                                         selector:@selector(aboutToPlay:)];
...

aboutToPlay:

-(void) aboutToPlay: (id) sender {
    [self removeChild:menu cleanup:YES];
    timeoutLabel.visible=YES;
    prepareLabel.visible=YES;
    [self schedule: @selector(tick:) interval:1];
}

И отметьте галочкой:

-(void) tick: (ccTime) dt
{
    if(timeToPlay==1) [self play];
    else {
        timeToPlay--;
        NSString * countStr;

        if(timeToPlay==1)
        countStr = [NSString stringWithFormat:@"GO!"];
        else
        countStr = [NSString stringWithFormat:@"%d", timeToPlay-1];

        timeoutLabel.string = countStr;

        //and some cool animation effect
        CCLabelTTF* label = [CCLabelTTF labelWithString:countStr fontName:@"Marker Felt" fontSize:60];

        label.position = timeoutLabel.position;
        [self addChild: label z: 1001];
        id scoreAction = [CCSequence actions:
                            [CCSpawn actions:
                              [CCScaleBy actionWithDuration:0.4 scale:2.0],
                              [CCEaseIn actionWithAction:[CCFadeOut actionWithDuration:0.4] rate:2],
                              nil],
                            [CCCallBlock actionWithBlock:^{
                              [self removeChild:label cleanup:YES];
                            }],
                            nil];
        [label runAction:scoreAction];

    }

}

Play:

-(void) play {
    [[CCDirector sharedDirector] replaceScene:[CCTransitionSlideInL transitionWithDuration:0.4 scene:[GamePlay node]]];
}
2 голосов
/ 20 ноября 2011

Если вам требуется использование cocos2d, во что бы то ни стало сделайте это, однако было бы проще сделать это без . Настройте UILabel с необходимыми выходами в IB, объявите countdownTimer в качестве объекта NSTimer, а затем в своем viewDidLoad или где-то еще значимом:

     countdownTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updateTime) userInfo:nil repeats:YES];
     label.text = @"3";
     [countdownTimer fire];

, а затем обновите время:

- (void)updateTime {
     if ([label.text isEqualToString:@"3"]) {
          label.text = @"2";
     } else if ([label.text isEqualToString:@"2"]) {
          label.text = @"1";
     } else {
          label.text = @"GO!";
          [countdownTimer invalidate];
          //continue with app
     }
}

Не проверяли действительность этого кода, но он должен заставить вас двигаться в правильном направлении!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...