cari

Rumah  >  Soal Jawab  >  teks badan

objective-c - 如何在cocos2d中创建定时器?

我想用cocos2d创建一个2DiPhone游戏,需要设定一个定时器,应该如何进行操作呢?

原问题:How can I create a count down timer for cocos2d?

PHP中文网PHP中文网2768 hari yang lalu858

membalas semua(1)saya akan balas

  • 伊谢尔伦

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

    Jawapan: JustinB
    (Jawapan terbaik)
    Setakat masalah itu sendiri, NSTimer tidak boleh digunakan untuk operasi. Rangka kerja Coco2d boleh menyediakan penjadual untuk menyepadukan arahan berhenti/terus ke dalam permainan. Kaedah penggunaan adalah seperti berikut:

    -(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
    }
    

    Jawapan: seenu
    Dalam cocos2d, pemasa mempunyai fungsi kemas kini lalai, jadi anda boleh mencuba kaedah berikut:

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

    Jawapan: Ziminji
    Jika anda tidak menggunakan kaedah "jadual" tetapi ingin menggunakan NSTimer untuk mencipta pemasa, anda boleh membuat kelas seperti berikut:
    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
    

    Jawapan: lostInTransit
    (bahan pengajaran negatif)

    -(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
    }
    

    balas
    0
  • Batalbalas