How can I create a count down timer for cocos2d?

后端 未结 6 1627
灰色年华
灰色年华 2020-12-13 15:30

I am developing a 2D iPhone game by using cocos2d. I need a countdown timer. How can I create a count down timer in cocos2d?

6条回答
  •  夕颜
    夕颜 (楼主)
    2020-12-13 16:06

    For those that want to use NSTimer instead of the "schedule" method, you can create a class such as the following:

    ZIMCountdownTicker.h

    #import 
    
    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 _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)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 
    
    @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)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
    

提交回复
热议问题