locked
Optimizar entrada teclas RRS feed

  • Pregunta

  • Hola compañeros, estoy llevando a cabo un proyecto de videojuego 2D con unos amigos para practicar. El tema es que según he podido husmear aquí y allá la entrada de datos, por teclado por ejemplo, suele controlarse (en el update) con una ristra de if-else del tipo "si pulso abajo --> posiciónYRectángulo++", "si pulso derecha --> posiciónXRectángulo++", etc.

    Mi pregunta es ¿podríamos optimizar esas sentencias? no puedo evitar pensar que así debe ser. En un principio pensamos usar HasTable/HasMap con correspondencias tecla-acción. Otra idea sería hacer una clase Movimiento, esta comprendería las acciones posibles a realizar. Generar al inicio del juego un array de Movimientos, instanciar aquellos cuyo índice se corresponda con las teclas que permitimos pulsar y al presionarlas ejecutar dicho movimiento. El coste de acceso a un vector es constante, lo cual agilizaría en gran medida el programa.

    //La implementación En el juego PONG con 2 raquetas con HashTable quedó tal que así y funciona

    public void Update(KeyboardState estadoteclado){
               foreach(Keys k in estadoteclado.GetPressedKeys()){
                    if (tabla1[k] != null && tabla2[k] != null){
                        raqueta1.moveY((int)tabla1[k]);
                        raqueta2.moveY((int)tabla2[k]);
                    }
                }

    }

    Pero no tengo claro si realmente es más óptimo que un bloque de if-else ya que tiene que recorrer el array de GetPressedKeys

    ¿Es posible lo que planteo?¿Alguno conoce algún patrón de diseño aplicable en este caso? 

    Muchas gracias :D


    • Editado AkrXna viernes, 4 de enero de 2013 22:47
    viernes, 4 de enero de 2013 21:20

Todas las respuestas

  • Coincido contigo en que recorrer el array de GetPressedKeys es mas lento, ya que algunas de las teclas que se pulsan puede que no nos interesen, ya que podríamos pulsar teclas inintencionadamente por error.

    Hace poco, estaba diseñando a papel y bolígrafo el nivel funcional de los controles de mi proyecto actual, y al final decidí usar una variable entera ( Int ) que gestionaría el estado del jugador ( Vivo, muerto, volando, etc ), a la que denomino "Modo", que podemos controlar desde el propio MainGame o desde la Consola si es que le diseñaste alguna a tu proyecto. En otra clase gestionar los controles con la ayuda de un selector switch para saber en cada momento el valor de la variable "Modo" y actuar de distinta forma dentro de cada valor de este, de esta forma, podrías aplicar varias formas de juego, tanto en gráficos como en jugabilidad, juego relentizado, acelerado, color negativo, etc, hasta donde te llege la imaginación.

    Para la detección de teclas uso if-else.

    sábado, 5 de enero de 2013 6:16
  • Bueno, seguiré investigando y si encuentro algo lo pondré :). Lo malo de if-else para algo así es que, pensando que pueden ser varios players y unas cuantas teclas, debe comprobar todos y cada uno de ellos hasta encontrar el correcto (sabéis que un switch internamente también son if-else) todo eso  ejecutándose 60 veces por segundo...

    Gracias a todos por vuestra dedicación en el foro! :D

    domingo, 6 de enero de 2013 14:37
  • Verdad, verdadera, ... la gestión de teclado no es un cuello de botella... así que no te empeñes en optimizar algo que no te supone ningún problema...

    Simplemente guarda el KeyboardState anterior y para comprobar si acabas de pulsar un tecla haz:

         

    if (Old_keyboard_state.isKeyUp(Keys.Space) && Current_keyboard_state.isKeyDown(Keys.Space) {
    
       // Cambia el estado tras la pulsacion de la tecla espacio
    }



    Tambien conocido como Blau www.youtube.com/malditis www.charcostudios.com

    lunes, 7 de enero de 2013 7:56