Como posso criar uma contagem regressiva para cocos2d?
-
22-07-2019 - |
Pergunta
Estou desenvolvendo um iPhone jogo 2D usando cocos2d. Eu preciso de um temporizador de contagem regressiva. Como posso criar uma contagem regressiva em cocos2d?
Solução
Não rep suficiente para upvote Tom, mas ele está absolutamente certo. No contexto desta questão, NSTimer é a solução errada. O quadro Cocos2d fornece um programador que se integra com outros jogo apresenta como Pause / Resume (e provavelmente usa NSTimer sob o capô).
Exemplo da ligação acima:
-(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
}
Outras dicas
http://www.cocos2d-iphone.org/wiki /doku.php/prog_guide:best_practices
- Tente não para usar NSTimer do Cacau. Em vez disso próprio agendador uso de cocos2d.
- Se você usar o programador cocos2d, você terá:
- pausa automática / currículo.
- quando o Layer (Cena, Sprite, CocosNode) entra no palco o temporizador será ativado automaticamente, e quando ele deixa o palco será desactivado automaticamente.
- Seu alvo / seletor será chamado com um tempo delta ...
Em cocos 2d há seção de atualização padrão para timer.
Tente isto:
[self schedule:@selector(update:)];
- (void)update:(ccTime)dt {
}
Para aqueles que querem usar NSTimer em vez do método "schedule", você pode criar uma classe, como a seguir:
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
Olhe para NSTimer, pode provavelmente fornecer qualquer funcionalidade temporizador necessária.
NSTimer referência de classe
-(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
}