Namespaces

Variants
Actions

Please note that as of October 24, 2014, the Nokia Developer Wiki will no longer be accepting user contributions, including new entries, edits and comments, as we begin transitioning to our new home, in the Windows Phone Development Wiki. We plan to move over the majority of the existing entries over the next few weeks. Thanks for all your past and future contributions.

Classe utilitária para teclado em jogos

From 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 04:35.
201 page views in the last 30 days.

Was this page helpful?

Your feedback about this content is important. Let us know what you think.

 

Thank you!

We appreciate your feedback.

×