Join Now
Quality Rating:
  • Currently 0.0 / 5
(0.0 / 5 - 0 votes cast)
Expertise Level:
  • Currently 0.0 / 5
(0.0 / 5 - 0 votes cast)

This page was last modified 21:45, 26 October 2007.

Temporizador simples para jogos

From Forum Nokia Wiki

Este artigo apresenta um temporizador (timer) simples para jogos, baseado na classe CIdle.

A classe CIdle é um objeto ativo que é executado quando não existe nenhum outro com prioridade maior esperando para ser executado. Ao contrário de outras alternativas encontradas no Symbian OS, CIdle não usa um intervalo de tempo pré-definido para gerar eventos.

Definindo a classe

class CCustomTimer : public CBase
{
  public:
 
    // Cria uma instância da classe. MTimerListener
    // é um objeto interessado ("interessado") em tratar o evento de tempo.
    static CCustomTimer* NewL (MTimerListener & aListener);
		
    ~CCustomTimer ();
		
    // Iniciar o temporizador.
    void Start  ();
 
    // Cancelar o temporizador.
    void Cancel ();
			
 
  private:
 
    // Função que é usada internamente para notificar o interessado
    // que vai receber o evento de tempo. Requerida pelo CIdle.
    static TInt IdleCallBack (TAny* aPtr);
 
  private:
 
    // Construtor, guarda a referência para o interessado.
    CCustomTimer (MTimerListener & aListener)
    : iListener (& aListener)		   
    {}	
 
    // Segunda parte do construtor de duas fases.
    void ConstructL ();
		
  private:		
		
    
    MTimerListener * iListener;  // o interessado
    CIdle*  iIdle;		 
};

A interface MTimerListener é definida como a seguir:

class MTimerListener
{
  public:
    	
    virtual void OnTimer () = 0;		
};

A classe CCustomTimer é implementada deste modo:

void CCustomTimer::ConstructL ()
{
  iIdle = CIdle::NewL (CIdle::EPriorityIdle);	
}
 
CCustomTimer::~CCustomTimer ()
{
  if (iIdle)
  {	
     iIdle->Cancel ();
     delete iIdle;
  }
}
 
void CCustomTimer::Start ()
{
  if (!iIdle->IsActive () )
   iIdle->Start (TCallBack (IdleCallBack, this) );
}
 
void CCustomTimer::Cancel ()
{
  iIdle->Cancel();	
}
 
 
TInt CCustomTimer::IdleCallBack (TAny* aPtr)
{
  CCustomTimer* me = ((CCustomTimer*)aPtr);
  me->iListener->OnTimer ();
  return ETrue;
}

Uso

// Suponha que o jogo deve rodar a 30 quadros por segundo. Dessa forma,
// é necessário calcular o intervalo de tempo (time step) para atender
// a esse requisito. O tempo é especificado em microsegundos.
const TInt KTargetTimeStep = 1000000 / 30;
 
void MyGame::OnTimer ()
{
   // Tratar dados de entrada (teclado)
   ProcessInput ();
 
   // Nessa parte será calculado o número de time steps a serem
   // executados, para que jogo não fique atrasado.
 
   // Guardar o tempo atual.
   TTime time;
   time.HomeTime();
 
   // Calcular o tempo decorrido desde a última atualização.
   // iStartTime é membro da classe MyGame.
   TInt elapsed = I64LOW (time.MicroSecondsFrom (iStartTime).Int64());
 
   // Atualizar o tempo total até o momento. A variável iTotalTime
   // também é membro da classe MyGame.
   iTotalTime += elapsed;
 
   // Calcular quantas atualizações devem ser executadas. Observe que
   // a divisão é inteira (ou seja, 5 / 2 = 2).
   elapsed = iTotalTime / KTargetTimeStep;
 
   for (TInt i = 0; i < elapsed; ++i)
    Update ();
 
   // Subtrair o tempo correspondente aos time steps processados.
   iTotalTime -= elapsed * KTargetTimeStep;
   iStartTime = time.Int64();
 
   // Desenhar.
   Render ();
}
Related Discussions
Thread Thread Starter Forum Replies Last Post
Borrar aplicaciones del emulador dimaar Foro en Español (Spanish Forum) 3 2007-05-21 10:40
socket:// itx Mobile Java Networking & Messaging & Security 14 2003-06-13 05:29
Enviar 2 archivos a la vez con bluesoleil spidersoftware Foro en Español (Spanish Forum) 1 2008-10-01 09:04
how to construct this sip register message with authorization sodangerous VoIP 6 2007-10-25 18:38
Aplicación no válida am65 Foro en Español (Spanish Forum) 0 2007-12-26 20:34
 
Powered by MediaWiki
     
     RDF Facets:
     
     
     qfnZtypeQUqfnTypeZCommunityContentQ
     qfnZtypeQUqfnTypeZWebpageQ
     qfnZtypeQUqfnTypeZWikiContentQ
     qmarsZlanguageQUxhttpE3aE2fE2fswE2enokiaE2ecomE2flanguageE2d1E2fenX