كيف يمكنني إنشاء العد التنازلي الموقت لمدة cocos2d?

StackOverflow https://stackoverflow.com/questions/446717

سؤال

أنا النامية 2D لعبة فون باستخدام cocos2d.أحتاج العد التنازلي.كيف يمكنني إنشاء العد التنازلي الموقت في cocos2d?

هل كانت مفيدة؟

المحلول

وليس ما يكفي من مندوب لupvote توم، ولكن كان على حق تماما. في سياق هذا السؤال، NSTimer هو الحل الخاطئ. يوفر الإطار Cocos2d جدولة الذي يتكامل مع ميزات لعبة أخرى مثل وقفة / استئناف (وعلى الأرجح تستخدم NSTimer تحت غطاء محرك السيارة).

وعلى سبيل المثال من خلال الرابط أعلاه:

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

نصائح أخرى

http://www.cocos2d-iphone.org/wiki/doku.php/prog_guide:best_practices

  • محاولة لا استخدام الكاكاو NSTimer.بدلا من استخدام cocos2d الخاصة جدولة.
  • إذا كنت تستخدم cocos2d جدولة سوف يكون لديك:
    • التلقائي وقفة/استئناف.
    • عندما طبقة (المشهد العفريت ، CocosNode) يدخل مرحلة الموقت سيتم تفعيلها تلقائيا ، عندما يترك المسرح سيكون تلقائيا.
    • الهدف الخاص/المحدد سوف يطلق مع دلتا الوقت...

في كوكوس 2D هناك قسم التحديث الافتراضي للجهاز ضبط الوقت.

وجرب هذا:

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

وبالنسبة لأولئك الذين يريدون استخدام NSTimer بدلا من أسلوب "الجدول الزمني"، يمكنك إنشاء فئة مثل ما يلي:

و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

وانظروا NSTimer، فإنه من المرجح أن توفر أي وظيفة الموقت الحاجة.

NSTimer فئة مرجع

-(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
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top