Para o pessoal experiente em Canvas, keycodes

Pessoal, pesquisei MUITO (e não foi só um dia não), mas não encontrei uma solução ideal para o seguinte problema.
Tenho minhas telas em Canvas, mas para mapear a ação do usuário com as teclas, o keyCode do keyPressed muda de aparelho para aparelho.

Já tentei pegar o cógigo da tecla, nome da tecla. mas nada me resolve, então fui atrás de como o MIDP faz isso, e vi que ele usa a constante Display.KEYPRESSED_UP, algo assim, mas ela não está disponível quando tento acessá-la. Então, qual seria a solução que o pessoal que já implementou bibliotecas em Canvas (já vi alguns cometando que fizeram bibliotecas em Canvas) usou para driblar essa diferença entre aparelhos?

Já tentou usar as Game Actions?

Ao invés de usar diretamente o keyCode, use assim:

[code]public void keyPressed(int keyCode) {
int gameAction = getGameAction(keyCode);

switch(gameAction) {
    case UP: // FAZER ALGUMA COISA
            break;
    case DOWN: // FAZER ALGUMA COISA
            break;
    case LEFT: // FAZER ALGUMA COISA
            break;
    case RIGHT: // FAZER ALGUMA COISA
            break;
    case FIRE: // FAZER ALGUMA COISA
            break;
    case GAME_A: // FAZER ALGUMA COISA
            break;
    case GAME_B: // FAZER ALGUMA COISA
            break;
    case GAME_C: // FAZER ALGUMA COISA
            break;
    case GAME_D: // FAZER ALGUMA COISA
            break;
    default: // FAZER ALGUMA COISA
}

}[/code]

[quote=Will_HRock]Já tentou usar as Game Actions?

Ao invés de usar diretamente o keyCode, use assim:

[code]public void keyPressed(int keyCode) {
int gameAction = getGameAction(keyCode);

switch(gameAction) {
    case UP: // FAZER ALGUMA COISA
            break;
    case DOWN: // FAZER ALGUMA COISA
            break;
    case LEFT: // FAZER ALGUMA COISA
            break;
    case RIGHT: // FAZER ALGUMA COISA
            break;
    case FIRE: // FAZER ALGUMA COISA
            break;
    case GAME_A: // FAZER ALGUMA COISA
            break;
    case GAME_B: // FAZER ALGUMA COISA
            break;
    case GAME_C: // FAZER ALGUMA COISA
            break;
    case GAME_D: // FAZER ALGUMA COISA
            break;
    default: // FAZER ALGUMA COISA
}

}[/code][/quote]

Sim, mas tbm não resolve o caso…

Olha aqui a solucao foi apresentar uma tela para “calibrar” os botoes na primeira vez que o usuario acessa a app.

Então essas teclas seriam armazenadas no aparelho?
Foi a única solução?

Você já tentou usar o GameCanvas ?

Não, mas ele resolveria o problema?

Me responda você ! Detesto postar sem ser a resposta definitiva, mas depois do seu “choro”, imaginei que vc não tivesse tentado tudo. Eu estava certo.

GameCanvas, FullCanvas (Nokia) e outros tipos de Canvas são objetos que muitos se esquecem que estão aí para ajudar o desenvolvedor.

[quote=boone]Me responda você ! Detesto postar sem ser a resposta definitiva, mas depois do seu “choro”, imaginei que vc não tivesse tentado tudo. Eu estava certo.

GameCanvas, FullCanvas (Nokia) e outros tipos de Canvas são objetos que muitos se esquecem que estão aí para ajudar o desenvolvedor.[/quote]

Estarei testando esse fds e posto o resultado, de qualquer forma, obrigado pelas dicas…
E além disso, olhando a classe GameCanvas rapidamente, vi o getKeyStates() e me surgiu uma dúvida:
posso usar o keyPressed() normalmente?

Pode:

http://developers.sun.com/mobility/midp/ttips/gamecanvas/

[quote]Estarei testando esse fds e posto o resultado, de qualquer forma, obrigado pelas dicas…
E além disso, olhando a classe GameCanvas rapidamente, vi o getKeyStates() e me surgiu uma dúvida:
posso usar o keyPressed() normalmente?[/quote]

Aí teria que passar false no super(), não seria melhor usar um loop para dar o poll nas teclas?

[quote=Will_HRock][quote]Estarei testando esse fds e posto o resultado, de qualquer forma, obrigado pelas dicas…
E além disso, olhando a classe GameCanvas rapidamente, vi o getKeyStates() e me surgiu uma dúvida:
posso usar o keyPressed() normalmente?[/quote]

Aí teria que passar false no super(), não seria melhor usar um loop para dar o poll nas teclas?[/quote]

Será que um while(true) verificando as teclas não seria mais custoso?

O GameCanvas funciona quase da mesma forma que o Canvas. Você não precisa de “while (true)” ou outro mecanismo. Se esta construindo uma aplicação normal (que não seja um jogo) pode confiar nos eventos keyPressed(), keyReleased() etc. O método getGameAction() também funciona bem para as teclas direcionais e SELECT. Porém você precisa tomar cuidado com os SOFTKEYS pois em alguns aparelhos estas teclas possuem códigos negativos e ao passá-las para getGameAction() uma Exception é gerada (Samsung). Isso significa também que em alguns aparelhos você não tem como saber se é SOFTKEY esquerdo ou SOFTKEY direito (por causa do exception). Então não há outra forma senão a velha “tentativa e erro”. Felizmente a maioria dos aparelhos usa o mesmo código e você pode então assumir que valores como -6 ou -21 são SOFTKEY esquerdo, -7 ou -22 SOFTKEY direito e -8 a tecla CLEAR.

Mais mastigado do que isto impossível né…

Nossa aleantonello, vc vai pro céu. Eu já não tenho mais esta paciência toda para explicar assim não…

[quote=boone]Mais mastigado do que isto impossível né…

Nossa aleantonello, vc vai pro céu. Eu já não tenho mais esta paciência toda para explicar assim não…[/quote]

E quem disse que quero mastigado?
Queria saber das experiências de vcs, agora se não quiser ajudar e acha que quero mastigado, nem perca seu tempo postando…

Eu disse que o aleantonello entrou num nível de detalhe que eu não entraria, até porquê minha indicação do link já era o suficiente, basta usá-la como ponto de partida.
Por isto que quando vi que ele postou mastigado, faleu que ELE iria pro céu, pois este “raciocínio” que ele teve, espera-se de quem leu o artigo do link e fez mais buscas sobre o GameCanvas depois.