Otimizando codigo j2me

3 respostas
cu_ringa

tava lendo um tutorial da sun sobre j2me game api e vi o seguinte codigo

private void input() {
    int keyStates = getKeyStates();
    if ((keyStates & LEFT_PRESSED) != 0)
      mX = Math.max(0, mX - 1);
    if ((keyStates & RIGHT_PRESSED) != 0)
      mX = Math.min(getWidth(), mX + 1);
    if ((keyStates & UP_PRESSED) != 0)
      mY = Math.max(0, mY - 1);
    if ((keyStates & DOWN_PRESSED) != 0)
      mY = Math.min(getHeight(), mY + 1);
  }

codigo completo: http://developers.sun.com/techtopics/mobility/midp/articles/game/

Ai vi o seguinte essas linhas de código como essa:

não poderia ser modificada para isso:

e com a vantagem de q não precisava fazer um and bit a bit, ou seja seria mais rápido de executar, já q teria somente uma comparação.

3 Respostas

F

a comparação com == não funcionaria no caso de vc pressionar o direcional tanto na vertical quanto horizontal simultaneamente (como “cima-esquerda” por exemplo).

Desenvolvendo melhor o exemplo:

Seja LEFT = 1, RIGHT = 2, UP = 4 e DOWN = 8

Se vc pressionar “esquerda” apenas, a variavel keystate vai assumir o valor 1, e no caso a comparação “keystate == LEFT” vai funcionar.

Mas se vc pressionar “cima-esquerda” simultaneamente, a variavel keystate vai assumir o valor 5 e a comparação direta (usando ==) vai falhar jah que keystate vai ser diferente de LEFT (1) e de UP (4).

cu_ringa

existe esse estado UP_LEFT_PRESSED ? pq se não existir, não como pegar esse evento cima esquerda, já q o metodo getKeyStates() retorna apenas um valor. E no caso de existir o == vai dar conta.

F

Não existe estado UP_LEFT_PRESSED, mas o int devolvido pelo metodo getKeyStates() é um mapa de bits, onde cada bit do valor inteiro representa uma tecla. Se valor do bit for 1, a tecla correspondente está/foi pressionada. Caso não tenha sido o valor será zero. É por isso que se usa o operador bit a bit &.

Quando vc quer saber que o botão DOWN foi pressionado por exemplo, vc quer checar apenas o bit correspondente a ele, e não os demais valores do mapa de bits. Se vc checar o valor todo do inteiro, ao invés do bit especifico sendo testado, a comparação usando == falhará sempre que houver o acionamento simultâneo de mais de uma tecla.

Voltando ao exemplo que escrevi acima, considere que a tecla “baixo” for pressionada. O keystate será 8.

keystate & DOWN == 8 (que é diferente de zero, logo a tecla está pressionada)

Usando == diretamente temos que keystate == DOWN, logo essa comparação tb funciona.

Mas considere agora que a tecla “cima” for pressionada simultaneamente com “esquerda”. O keystate será 5.

Fazendo a checagem conforme o código original temos:

keystate & LEFT == 1 (que é != 0, logo tecla pressionada)
keystate & UP == 4 (que é != 0, logo tecla tb pressionada)

Mas usando diretamente == temos:

keystate != LEFT
keystate != UP

De forma que vc não consiguirá checar o estado das teclas de forma correta.

Criado 13 de julho de 2006
Ultima resposta 14 de jul. de 2006
Respostas 3
Participantes 2