搜尋

首頁  >  問答  >  主體

objective-c - 如何在cocos2d中建立定時器?

我想用cocos2d創建一個2DiPhone遊戲,需要設定一個定時器,應該如何進行操作呢?

原問題:How can I create a count down timer for cocos2d?

PHP中文网PHP中文网2872 天前878

全部回覆(1)我來回復

  • 伊谢尔伦

    伊谢尔伦2017-04-22 09:01:26

    答:JustinB
    (最佳答案)
    就這個問題本身來講,不應該用NSTimer來操作。 Coco2d框架可以提供一個排程程式(scheduler),將停止/繼續這種指令融入遊戲中,使用方法如下:

    -(id) init
    {
        if( ! [super init] )
            return nil;
    
        // schedule timer
        [self schedule: @selector(tick:)];
        [self schedule: @selector(tick2:) interval:0.5];
    
        return self;
    }
    
    -(void) tick: (ccTime) dt
    {
        // bla bla bla
    }
    
    -(void) tick2: (ccTime) dt
    {
        // bla bla bla
    }
    

    答:seenu
    在cocos2d中,定時器有一種預設更新的功能,所以可以嘗試以下方法:

    [self schedule:@selector(update:)];
    - (void)update:(ccTime)dt {
    }
    

    答:Ziminji
    如果不用"schedule"的方法,而是想用NSTimer創建定時器的話,你可以按照下述方法創建一個類別(class):
    ZIMCountdownTicker.h

    #import <Foundation/Foundation.h>
    
    extern NSString * const ZIMCountdownTickerTickAction;
    extern NSString * const ZIMCountdownTickerResetAction;
    
    @protocol ZIMCountdownTickerProtocol;
    
    /*!
     @class             ZIMCountdownTicker
     @discussion        This class creates a countdown ticker.
     @updated           2011-03-05
     */
    @interface ZIMCountdownTicker : NSObject {
    
        @private
            NSTimer *_timer;
            id<ZIMCountdownTickerProtocol> _delegate;
            NSTimeInterval _interval;
            double _period;
            double _value;
    
    }
    
    /*!
     @method                initWithDelegate:withTimeInterval:forTimePeriod:
     @discussion            This method instantiate an instance of this class with the specified parameters.
     @param delegate        A reference to a class that has implemented ZIMCountdownTickerProtocol.
     @param interval        The time interval in seconds to be used when running the countdown ticker.
     @param period          The time period in seconds for which countdown ticker will run.
     @updated               2011-03-05
     */
    - (id) initWithDelegate: (id<ZIMCountdownTickerProtocol>)delegate withTimeInterval: (NSTimeInterval)interval forTimePeriod: (double)period;
    /*!
     @method                start
     @discussion            This method will start the countdown ticker.
     @updated               2011-03-05
     */
    - (void) start;
    /*!
     @method                stop
     @discussion            This method will stop the countdown ticker.
     @updated               2011-03-05
     */
    - (void) stop;
    /*!
     @method                reset
     @discussion            This method will reset the countdown ticker.
     @updated               2011-03-06
     */
    - (void) reset;
    /*!
     @method                value
     @discussion            This method will return the countdown ticker's current value; however, using this method will cause
                        the ticker to stop.
     @return                The countdown ticker's current value.
     @updated               2011-03-05
     */
    - (double) value;
    
    @end
    
    @protocol ZIMCountdownTickerProtocol <NSObject>
    
    @optional
    /*!
     @method                countdownTicker:didUpdateValue:withAction:
     @discussion            This method will notify the delegate with the current value.
     @param ticker          A reference to tiggering ticker.
     @param value           The current value.
     @param action          The action that tiggered this method.
     @updated               2011-03-05
     */
    - (void) countdownTicker: (ZIMCountdownTicker *)ticker didUpdateValue: (double)value withAction: (NSString *)action;
    /*!
     @method                countdownTickerDidFinish:
     @discussion            This method will notify the delegate that the countdown ticker finished.
     @param ticker          A reference to tiggering ticker.
     @updated               2011-03-05
     */
    - (void) countdownTickerDidFinish: (ZIMCountdownTicker *)ticker;
    
    @end
    

    ZIMCountdownTicker.m

    // Ziminji Classes
    #import "ZIMCountdownTicker.h"
    
    NSString * const ZIMCountdownTickerTickAction = @"ticker.tick";
    NSString * const ZIMCountdownTickerResetAction = @"ticker.reset";
    
    /*!
     @category          ZIMCountdownTicker (Private)
     @discussion        This category defines the prototypes for this class's private methods.
     @updated           2011-03-05
     */
    @interface ZIMCountdownTicker (Private)
        /*!
         @method            countdown:
         @discussion        This method is called by the timer to decrement the counter's value and will send
                        the delegate the updated value.
         @param timer       The timer currently in use.
     @updated           2011-03-06
        */
        - (void) countdown: (NSTimer *)timer;
    @end
    
    @implementation ZIMCountdownTicker
    
    - (id) initWithDelegate: (id<ZIMCountdownTickerProtocol>)delegate withTimeInterval (NSTimeInterval)interval forTimePeriod: (double)period {
        if (self = [super init]) {
            _delegate = delegate;
            _interval = interval;
            _period = period;
            _value = period;
            _timer = nil;
        }
        return self;
    }
    
    - (void) start {
        if (_timer == nil) {
            _timer = [NSTimer scheduledTimerWithTimeInterval: _interval target: self selector: @selector(countdown:) userInfo: nil repeats: YES];
        }
    }
    
    - (void) stop {
        if (_timer != nil) {
            [_timer invalidate];
            _timer = nil;
        }
    }
    
    - (void) reset {
        [self stop];
        _value = _period;
        if ((_delegate != nil) && [_delegate respondsToSelector: @selector(countdownTicker:didUpdateValue:withAction:)]) {
            [_delegate countdownTicker: self didUpdateValue: _value withAction: ZIMCountdownTickerResetAction];
        }
    }
    
    - (double) value {
        [self stop];
        return _value;
    }
    
    - (void) countdown: (NSTimer *)timer {
        _value -= 1;
        if ((_delegate != nil) && [_delegate respondsToSelector: @selector(countdownTicker:didUpdateValue:withAction:)]) {
            [_delegate countdownTicker: self didUpdateValue: _value withAction: ZIMCountdownTickerTickAction];
        }
        if (_value <= 0) {
            [self stop];
            if ((_delegate != nil) && [_delegate respondsToSelector: @selector(countdownTickerDidFinish:)]) {
                [_delegate countdownTickerDidFinish: self];
            }
        }
    }
    
    - (void) dealloc {
        if (_delegate != nil) {
            [_delegate release];
        }
        if (_timer != nil) {
            [_timer invalidate];
        }
        [super dealloc];
    }
    
    @end
    

    答:lostInTransit
    (反面教材)

    -(id) init
    {
        if( ! [super init] )
            return nil;
    
        // schedule timer
        [self schedule: @selector(tick:)];
        [self schedule: @selector(tick2:) interval:0.5];
    
        return self;
    }
    
    -(void) tick: (ccTime) dt
    {
        //some function here
    }
    
    -(void) tick2: (ccTime) dt
    {
        //some function here
    }
    

    回覆
    0
  • 取消回覆