×
Namespaces

Variants
Actions

Classe utilitária para teclado em jogos

From Nokia Developer Wiki
Jump to: navigation, search
Article Metadata

Artigo
Criado por lpvalente em Lpvalente
Última alteração feita por hamishwillee em 09 Dec 2011

Este artigo apresenta uma classe utilitária simples para armazenar dados sobre o estado das teclas.

Declaração da classe

// INCLUDES
#include <e32keys.h>
#include <e32std.h>
 
// CLASSES
 
/**
* Simples wrapper para os dados do teclado.
*/

class TKeyboardWrapper
{
public:
 
// códigos de teclas não encontrados nos arquivos .h
enum TKeys {
EKey0 = 48,
EKey1,
EKey2,
EKey3,
EKey4,
EKey5,
EKey6,
EKey7,
EKey8,
EKey9,
EKeyShift = 127,
EKeyStar = 133
};
 
public:
 
/**
* Construtor padrão.
*/

TKeyboardWrapper ()
{ Clear (); }
 
 
/**
* Zerar o estado de todas as teclas.
*/

void Clear ()
{ Mem::FillZ (iKeys, 256); }
 
 
/**
* Perguntar se uma tecla está pressionada.
*/

TBool IsKeyDown (TInt aKey) const
{ ASSERT (aKey >= 0 && aKey < 256); return iKeys [aKey]; }
 
 
/**
* Determinar que uma tecla está pressionada.
*/

void SetKey (TInt aKey)
{ ASSERT (aKey >= 0 && aKey < 256); iKeys [aKey] = ETrue; }
 
 
/**
* Determinar que uma tecla não está mais pressionada.
*/

void ClearKey (TInt aKey)
{ ASSERT (aKey >= 0 && aKey < 256); iKeys [aKey] = EFalse; }
 
 
/**
* Verificar se alguma tecla está pressionada.
*/

TBool AnyKeyDown () const
{
for (TInt16 i = 0; i < 256; ++i)
{
if (iKeys [i])
return true;
}
 
return false;
}
 
private:
TBool iKeys [256];
};

Uso

Para se usar efetivamente essa classe, é necessário coletar os dados do teclado em funções que recebam os eventos de entrada, por exemplo HandleKeyEventL da appUI ou OfferKeyEventL das classes de view. Um exemplo usando o método HandleKeyEventL da classe appUI:

TKeyResponse CMyAppUi::HandleKeyEventL (const TKeyEvent& aKeyEvent, 
TEventCode aType)
{
if (aType == EEventKeyDown)
iKeyboard.SetKey (aKeyEvent.iScanCode);
else
if (aType == EEventKeyUp)
iKeyboard.ClearKey (aKeyEvent.iScanCode);
 
return EKeyWasConsumed;
}

No exemplo, iKeyboard é um objeto da classe TKeyboardWrapper. Para se consultar o estado das teclas, é preciso usar as constantes definidas pelo tipo enumerado TStdScanScode, que está no arquivo e32keys.h. Um exemplo de uso:

void CMyAppUi::ProcessInput ()
{
if (iKeyboard [EStdKeyLeftArrow] )
// seta esquerda foi pressionada
 
if (iKeyboard [TKeyboardWrapper::EKey0] )
// tecla "0" foi pressionada
 
}

É importante não usar por descuido as constantes definidas em TKeyCode (que estão no mesmo arquivo e32keys.h), pois seu uso não resulta na intenção inicial e também podem causar acessos inválidos no array da classe (pois alguns são maiores que 256).

This page was last modified on 9 December 2011, at 07:35.
70 page views in the last 30 days.
×