Skip to content

Eventos durante el juego: Crear variables auxiliares

by Pere Monfort on August 1st, 2012

Cuando empecé con mis primeros desarrollos fueron varias las veces en las que cometí el error que os explicaré a continuación.

Si recordamos el flujo básico de un juego (tuto 1, tuto 2), éste cuenta con una función “update” que es la que actualiza el estado de todas nuestras entidades, y de una función “draw” que dibuja todas las entidades actualizadas. Además, el juego está pendiente de ciertos eventos (keydown, mousemove, click…) que producen cambios de estado en las entidades. Un simple ejemplo: Evento keydown para mover a una entidad a través de las teclas.

Pues bien, el caso es que nuestra función update/draw va a ejecutarse a una velocidad constante: 60 veces por segundo o lo que es lo mismo cada 0.016 segundos. Por otro lado, no podemos saber en qué momento van a ejecutarse las funciones encargadas de gestionar los eventos ya que dependen de lo que el usuario haga. Es precisamente esto lo que puede llegar a ser un problema si dichas funciones modifican parámetros de nuestras entidades. ¿Por qué? Lo explicaré con un ejemplo:

Imaginemos un juego de disparos muy básico, en el que moviendo el mouse debemos hacer click (disparar) a los elementos que van apareciendo en pantalla. Si disparamos encima de uno de los elementos, este desaparece.

Sigamos imaginando: Tenemos en pantalla 20 dianas móviles. La función update se encarga de actualizar la posición X y Y de todas las dianas. Justo cuando la función update se está ejecutando, el usuario hace click encima de un elemento y este es eliminado por la función encargada de gestionar el evento “click“. Pues bien, el resultado de esto sería un TypeError. En el momento en que update ha empezado a ejecutarse había 20 elementos, y por lo tanto, el bucle encargado de recorrer los elementos va a ejecutarse 20 veces. Pero al hacer click, hemos eliminado un elemento, así que cuando el bucle llegué a la iteración 20 éste no va a existir y obtendremos el TypeError.

Éste es uno de los casos en los que podemos encontrarnos. Es un caso bastante “fácil” de detectar pero hay otros que no lo son tanto. Además, al ser un bug que depende de las acciones del usuario, no siempre es fácil reproducirlo.

Así pues, la solución (o la forma de evitarlo), es la de crear variables auxiliares en las funciones encargadas de gestionar eventos, y procesarlas en el propio método “update” antes o después de procesar las entidades.

From → Desarrollo

2 Comments
  1. No sé si es la mejor manera de hacerlo, pero la solución que tomé para ese tipo de casos es tener un array para los objetos a eliminar.
    Cuando un enemigo muere, o un disparo se sale de la pantalla, en vez de eliminarlo directamente, lo meto en un array de entidades a eliminar. Y el update, el último paso que realiza es recorrer los arrays de entidades a eliminar, eliminándolas de sus respectivos arrays.

    • Exacto, a eso me referia a crear variables auxiliares y procesarlas en el update.

      Yo para ese caso opté por la misma solución q comentas.

Leave a Reply

Note: XHTML is allowed. Your email address will never be published.

Subscribe to this comment feed via RSS