Heyyyyyyyyyyyyyyy

Aprende a programar microcontroladores en C... http://tecdigitaldelbajio.com/software-tarjeta.html

sábado, 4 de septiembre de 2010

Ejemplo #20 Como detectar Eventos de teclado del celular



Hoy se va a mostrar el código para detectar las teclas presionadas por el usuario, se va a seguir trabajando con el código del ejemplo #19 y del ejemplo # 18, para ahora, mover la pelotita con las teclas del celular.

Usando la clase GameCanvas, de una forma por demás sencilla es posible detectar las teclas que se han presionado, algunas de las teclas ya vienen definidas en la clase, y son mostradas en la figura siguiente, con su respectivo nombre en Java:



Las mismas teclas están presentes en los números del teclado del celular, como se observa en la figura:

El método que detecta las teclas presionadas es el siguiente:

getKeyStates();

El método regresa un valor entero que corresponde a la tecla presionada, si regresa un valor entonces se debe declarar una variable así:

int ValorDeTeclado;

Ya con la variable declarada se puede usar el método así:

ValorDeTeclado = getKeyStates

La misma documentación de la clase GameCanvas muestra que con un simple if puedes detectar cualquiera de las teclas, por ejemplo, si deseas saber cuando se presiona la tecla que va hacia arriba (UP, que es la misma que la tecla del número 2) se coloca el if así:

if ((ValorDeTeclado & UP_PRESSED) != 0) {

    // Se ejecuta el código cuando se presiona la tecla UP

}

De igual forma se puede hacer para todas y cada una de las demás teclas.

Ahora vamos a aplicar esto para mover la pelotita del ejemplo anterior, recordando un poquito, este par de instrucciones, mueven automáticamente a la pelotita:

coordX = coordX + velX;
coordY = coordY + velY;

Ahora esas instrucciones o algo parecido debe ir dentro de los ifs que detectan las teclas ya que ahora se desea que la pelotita se mueva con respecto a la tecla presionada, por ejemplo, imagine el lector que la pelotita se encuentra en las coordenadas (150, 100), si se presiona la tecla UP la pelotita debe ir “para arriba”, pero “para arriba” significa la coordenada 0 en Y, recuerde el sistema de coordenadas de Java el primer pixel está en la coordenada (0, 0), entonces cada que se presione la tecla se debe realizar una resta así:

if ((valorDeTeclado & UP_PRESSED) != 0)
    coordY = coordY - velY;

Con eso basta para que la pelotita se mueva hacia arriba, no fueron necesarias las { } cuando menos no ahorita porque solo sigue una instrucción después del if.

Ahora, imagine el lector el que la pelotita esta en la coordenada Y en 100 y se presiona continuamente la tecla UP, llega un momento que la pelotita llega a la coordenada 0, si se deja intacto el código visto en el ejemplo #18 y #19, la pelotita rebota y cambia de dirección (cambiando el signo de la variable velY) eso, no es bueno, porque al cambiar el signo, ahora cambian las condiciones, y la pelotita no haría lo que se desea.

Mejor es, eliminar los ifs que hacían que la pelotita rebote. Ahora si se realiza esto, surge otro problema, regresando a las condiciones anteriores, la coordenada Y en 100 y se presiona continuamente la tecla UP, llega un momento en que la pelotita desaparece, esto debido a que se presiono la tecla UP de tal forma que rebaso la coordenada 0 y como se sigue restando, la coordenada Y se hizo negativa y la pelotita desaparece de nuestra visión.

Para resolver el conflicto, sería mejor que cuando llegue a la coordenada 0, la pelotita no se mueva aunque se siga presionando la tecla UP, esto se hace fácilmente con la instrucción siguiente:

if ((valorDeTeclado & UP_PRESSED) != 0)  {
    if ((coordY >0 )
           coordY = coordY - velY;
}

Otra opción quizá mas fácil es usar la función “max” de la clase Math, esta función, simplemente regresa el valor más alto, de los dos que se ponen como parámetros. Por ejemplo : Math.Max( 10, 5) regresa el valor de 10, otro ejemplo Math.Max(0, -5) regresa el 0, concluimos que siempre que ponga el 0 con un número negativo el valor máximo que regresa siempre va a ser 0, y con esta simple instrucción se resuelve el problema, inclusive si hago la resta de coordY con velY se puede reducir el código a algo tan simple como esto:

if ((valorDeTeclado & UP_PRESSED) != 0)
    coordY = Math.Max(0, coordY - velY);

Por otro lado, si se presiona la tecla hacía abajo (DOWN), Basta con hacer una suma dentro de un if parecido al anterior, pero ahora con DOWN_PRESSED, el código queda así:

if ((valorDeTeclado & DOWN_PRESSED) != 0)
   coordY = coordY + velY;

Pero, el ir para abajo no es tan sencillo, porque no se está tomando en cuenta el alto de la pelotita, el código anterior no funcionaría bien. Para resolver este problema, basta con colocar un if que nos detecte si se ha llegado al borde de la pantalla, algo como esto

if ((ValorDeTecla & DOWN_PRESSED) != 0) {
    if ((coordY + pelota.getHeight()) < alto )
         coordY = coordY + velY;
}

Listo se resuelve el problema en la coordenada Y, algo idéntico es usado para la coordenada X, cuando se presiona la tecla LEFT y RIGHT, no se muestra aquí para no ser repetitivo, pero en el video tutorial se ve claramente cúal es el código.

Bueno eso es todo en el post de hoy, termino presentando el video tutorial, para que como siempre no quede duda alguna en donde deben ir las instrucciones.


7 comentarios:

  1. Excelente post, muchas gracias, espero postees mas seguido, me gustaria ver algo de comunicación inalambrica, en especial bluetooth, pero todo a su tiempo jejeje

    ResponderEliminar
  2. Que bueno que te gusto el blog, ya me hice el proposito de postear una vez a la semana, yo quisiera más seguido pero si me es dificil, y si a su tiempo trabajare en varios post sobre bluetooth solo ruego mucha pacienca... saludos

    ResponderEliminar
  3. Excelentes tutoriales, muy claros, pero tengo una duda y perdón pero soy novato en java y mi duda es como puedo ejecutar estas aplicaciones por ejemplo en un samsung gt-s5230, me dice "Tipo de archivo no compatible", de que modo en Neatbeans puedo evitar este detalle, gracias.

    ResponderEliminar
  4. Hola¡ si no lo puedes ejecutar en tu celular Samsung, quizá no soporte java, busca en la página del fabricante y verifica que tu télefono soporte Java, no tiene que ver nada NetBeans. Saludos

    ResponderEliminar
  5. me pregunto si podría ayudarme con este ejercicio, NetBeans - Ejemplo #10 Aplicación de los ChoiceGroup, el que ya practique, pero que los forms fueran aleatorios, y no así en el mismo orden siempre, se que algo hay que hacer con random, pero ni idea, , de ante mano muchas gracias

    ResponderEliminar
  6. Hay alguna forma de poner las aplicaciones gráficas camvas en pantalla completa o eso ya es otra biblioteca. gracias

    ResponderEliminar
  7. Hola¡¡¡ mmmm, lo de los ChoiceGroup, no lo habia pensado en hacerlo aleatorio, nunca lo he hecho, tendría que probar no tengo código que te pueda ayudar, en verdad lo siento mucho, en cuanto a las aplicaciones gráficas en toda la pantalla, cuando hago los ejemplos en mi Sony Ericsson ya me aparece en pantalla comleta, no se que celular sea el tuyo o no entiendo por que no te parece completa, saludos y siento no poder ayudar como ustedes quisieran.

    ResponderEliminar