2010-04-13 13 views
7

Pensé que había entendido esta pregunta, pero algo está bastante mal aquí. Cuando el usuario (yo, hasta ahora) intenta presionar las teclas, no sucede realmente nada, y me cuesta mucho entender qué es lo que me he perdido.¿Cuáles son los conceptos básicos para tratar los eventos de entrada de usuario en Android?

Considere esto antes de presentar algunos códigos para ayudar a aclarar mi problema: Estoy usando el ejemplo Lunar Lander de Android para hacer mi primer programa "real" de Android. En ese ejemplo, por supuesto, existe una clase LunarView, y clase anidada en ella LunarThread. En mi código, los equivalentes de estas clases son Graphics y GraphicsThread, respectivamente.

También puedo hacer animaciones de sprites en 2D muy bien en Android. Tengo una clase de Jugador, y digamos GraphicsThread tiene un miembro de Jugador al que se hace referencia como "jugador". Esta clase tiene cuatro coordenadas, x1, y1, x2 e y2, y definen un rectángulo en el que se debe dibujar el sprite. Lo he resuelto para poder manejarlo perfectamente. Siempre que se invoque el método doDraw (lienzo de lienzo), simplemente observará los valores de esas coordenadas y dibujará el sprite en consecuencia.

Digamos - y esto no es realmente lo que estoy tratando de hacer con el programa - Estoy tratando de hacer que el programa donde todo lo que hace es mostrar el sprite del reproductor en una ubicación de la pantalla HASTA el PRIMERA vez que el usuario presiona el botón izquierdo del Dpad. Luego, la ubicación cambiará a otra posición establecida en la pantalla, y el sprite se dibujará en esa posición para el resto del programa invariablemente.

También tenga en cuenta que el miembro GraphicsThread en Graphics se llama "hilo", y que el miembro SurfaceHolder en GraphicsThread se llama "mSurfaceHolder".

Así que considera este método en la clase Graphics:

@Override 
public boolean onKeyDown(int keyCode, KeyEvent msg) { 
    return thread.keyDownHandler(keyCode, msg); 
} 

También por favor considere este método en GraphicsThread clase:

boolean keyDownHandler(int keyCode, KeyEvent msg) { 
    synchronized (mSurfaceHolder) { 
     if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) { 
      player.x1 = 100; 
      player.y1 = 100; 
      player.x2 = 120; 
      player.y2 = 150; 
     } 
    } 
    return true; 
} 

Ahora bien asumiendo las coordenadas de ese jugador comienzan como (200, 200, 220 , 250), ¿por qué no hará nada diferente cuando presiono Dpad: izquierda?

Gracias!

+2

dejó algunos puntos de quiebre y asegúrese de que su llegar a las líneas de código en el que se está ajustando la posición del jugador. Si se están estableciendo los valores, es muy probable que su método de sorteo no se llame después de que se establezca la posición. Si no, entonces está comprobando el código de clave incorrecto o tiene un problema de enhebrado. –

+1

¿está seguro de que está repintando el lienzo de forma adecuada? call invalidate() para forzar que se dibuje una vista – YGL

Respuesta

1

Antes de que yo me preocuparía por movimiento real y el yo consideraría como Log ...

Algo así como:

Log.d("lunar", "keyCode = ["+String.valueOf(keyCode)+"] // msg = ["+String.valueOf(msg)+"]"); 

En al hacerlo, puedo obtener una idea de lo que el sistema está registrando antes de preocuparme por lo que hago con dichos datos registrados ... Después de eso, puede decidir si está enviando las cosas correctas y luego puede preocuparse por el trabajo del hilo, etc.

suerte que puede ayudar a diagnosticar etc. (Todo esto fue escrito a mano alzada, puede contener errores)

Cuestiones relacionadas