كيف يمكنني إنشاء العد التنازلي الموقت لمدة cocos2d?
-
22-07-2019 - |
سؤال
أنا النامية 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، فإنه من المرجح أن توفر أي وظيفة الموقت الحاجة.
-(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
}