GameCanvas, getKeyStates() [Resolvido]

Olá pessoal, tenho uma dúvida em relação ao método getKeyStates().

Então, li a API e percebi que este é responsável por retornar se alguma tecla esta precionada (retornando um valor != de zero. ou retornando zero, caso contário).

Então usando o operador lógico & (sem entrar em curto (&&)):

int keyStates = getKeyStates();
if((keyStates & UP_PRESSED) !=0)
        {
            //TODO
        }

Mas, se eu fizer: (não da certo)

int keyStates = getKeyStates();
if((keyStates != 0) && (UP_PRESSED) != 0)
{
//TODO
}

Analisando o primeiro caso, o operador lógico & (sem entrar em curto) testa as duas condições, independete se a primeira condição já for falsa.
No entanto, usando o operador lógico com curto (&&) se a primeira condição já for falsa ele nem testa a segunda. Independente se eu usar && ou & ele só vai funcionar se as duas condições for verdadeira.Não consigo entender o porque a segunda maneira não fica funcional. Alguém pode explicar?

[]

Código diferente = resultado diferente

Vc quer comparar códigos diferentes e espera a mesma resposta ? Não dá né…o segundo trecho são 2 expressões, onde inclusive deveria estar assim “(UP_PRESSED != 0)”.
Falando nisto, vc sabe q esta expressao sempre vai ser verdadeira, então não faz sentido em testá-la, afinal UP_PRESSED vale 2, portanto, SEMPRE diferente de zero…
Isto indica claramente que o 2o modo está errado de se usar UP_PRESSED. Esta constante tem que ser usada conforme o 1o trecho, que é igualzinho ao que está no javadoc.

Quando ao curto, aprendeu certinho, é isto mesmo como funciona.

Ainda não saquei completamente a lógica deste teste:

if((keyStates & UP_PRESSED) !=0)

Tal como você disse, UP_PRESSED sempre é 2. Logo não entendo o porque usar o UP_PRESSED alí tb (tal como você disse que não faz lógica usando o &&).

Faria muito mais lógica para mim se fosse:

if(keyStates == 2) // 2 == up.
{
//(...)
}

O que falta pra vc é estudar sobre operações bitwise.

Em qualquer linguagem você aplica isto.Me admirei agora por vc não saber !

Bom, depois deste dica, é só usar o tio Google que você de cara encontra material explicando porquê este teste faz sentido.

[quote=boone]O que falta pra vc é estudar sobre operações bitwise.

Em qualquer linguagem você aplica isto.Me admirei agora por vc não saber !

Bom, depois deste dica, é só usar o tio Google que você de cara encontra material explicando porquê este teste faz sentido.[/quote]

Hmm, vlw pela dica.

Pesquisei sobre bitwise. Agora entendo melhor o operador binário (sem curto).

Supondo:

if( (keyStates & UP_PRESSED) != 0)

Será realizado assim:
Ele irá comparar bit a bit a variável int keyStates com a variável int UP_PRESSED, como nesse caso o operador bitwise usado é &, somente será retornado 1 se todos os bits comparados forem iguais.

É isso mesmo?

vlw.

Exatamente ! Fez a lição de casa certinho.

Em resumo, a operação compara para ver se o respectivo bit que interessa está ligado em keyStates. Se estiver, o valor desta operação é diferente de zero.