2009-01-15 61 views

回答

49

没有足够的代表处,以给予好评汤姆,但他是绝对正确的。在这个问题的背景下,NSTimer是错误的解决方案。 Cocos2d框架提供了一个与其他游戏功能集成的调度程序,如Pause/Resume(并且最有可能使用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 
} 
-13
-(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

谢谢你的回答。它的工作.... – Nasir 2009-01-22 10:31:10

+5

这是使用cocos2d做到这一点的错误方法,你需要做别人所说的并使用[self schedule:]东西。最大的原因是使用NSTimer将不会支持cocos2d暂停,启动,停止命令。 – Solmead 2009-06-25 19:46:57

16

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

  • 尝试使用Cocoa的的NSTimer。而是使用cocos2d自己的调度程序。
  • 如果你使用cocos2d的调度程序,你将有:
    • 自动暂停/恢复。
    • 当Layer(Scene,Sprite,CocosNode)进入舞台时,定时器会自动启动,当它离开舞台时,它会自动关闭。
    • 你的目标/选择器将与增量时间被称为...
4

在茯苓2d将有定时器缺省更新部。

试试这个:

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

对于那些想使用的,而不是 “日程安排” 方法的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