2009-01-15 23 views

Respuesta

49

insuficiente representante a Upvote Tom, pero tiene toda la razón. Dentro del contexto de esta pregunta, NSTimer es la solución INCORRECTA. El marco Cocos2d proporciona un programador que se integra con otras funciones del juego como Pausa/Reanudar (y lo más probable es que use NSTimer bajo el capó).

Ejemplo desde el enlace anterior:

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

y uso similar [self unschedule: @selector (tick2 :)] dentro de tick2: cuando quieras que deje de repetirse. – adam

+1

[self schedule: @selector (tick :)]; cuando intento hacerlo en mi código ... mi aplicación no puede encontrar el programa ... ¿es función de qué clase ...? –

+0

@mihir CCLayer Creo, generalmente como una superclase –

-5

Mira NSTimer, es muy probable que pueda proporcionar cualquier funcionalidad de temporizador necesaria.

NSTimer class reference

-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

Gracias por tu respuesta. funciona ... – Nasir

+5

Esta es la forma incorrecta de hacer esto usando cocos2d, necesita hacer lo que otros han dicho y usar el material [self schedule:]. Las principales razones son que usar NSTimer no admitirá pacos2d pause, start, stop commands whild schedule will. – Solmead

+0

Debe decirse otra vez: ¡NO USE NSTimer! Esto está mal. – Sneakyness

16

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

  • Trate NO utilizar NSTimer de cacao. En su lugar, use el propio programador de cocos2d.
  • Si utiliza planificador cocos2d, se tendrá:
    • pausa automática/hoja de vida.
    • cuando la capa (escena, Sprite, CocosNode) entra en el escenario, el temporizador se activará automáticamente, y cuando abandone el escenario, se desactivará automáticamente.
    • Su objetivo/selector se llamará con un tiempo de Delta ...
4

En cocos 2d hay sección de actualización predeterminado de temporizador.

Prueba esto:

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

Para aquellos que quieren utilizar NSTimer en lugar del método "programa", se puede crear una clase como la siguiente:

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 
Cuestiones relacionadas