Una de las actividades que más gusta a mis alumnos de programación, en los cursos de Bachillerato, consiste en intentar programar videojuegos. Naturalmente, los videojuegos que pueden abordar son sencillos juegos de acción, con móviles simples, del tipo que popularizaron las clásicas máquinas Arcade.
Prácticamente todos esos juegos tienen que enfrentarse al problema de los rebotes: ¿Cómo calcular el ángulo con el que debe salir el móvil que ha rebotado con un obstáculo? Esta pregunta abre un trabajo de investigación muy interesante, porque el ángulo de la trayectoria reflejada no se calcula del mismo modo en las paredes verticales y en las horizontales.
El lenguaje MSWLogo tiene algunos recursos para manejar la trayectoria del trazador (popularmente conocido como La Tortuga). Podemos conocer, en cualquier momento la posición del trazador, con la instrucción primitiva pos, y la dirección hacia la que está orientada, con la instrucción rumbo. El origen de los ángulos para definir el rumbo es la vertical: el rumbo 0 grados dirige la tortuga verticalmente hacia arriba. Además, disponemos de un modo sencillo de saber si el trazador ha impactado con un objeto: averiguar el color del píxel que hay debajo del trazador, con la instrucción píxel, y poner en marcha un procedimiento que pondrá en marcha las acciones convenientes.
Pero la primera dificultad con la que nos encontramos es el cálculo del ángulo del rebote. Analicemos el rebote de un móvil, con cuatro ejemplos de posibles colisiones con las paredes de un recinto rectangular simple:
- Pared izquierda: Si la trayectoria incidente forma un ángulo de 20º con la pared (rumbo inicial 340º) por ejemplo, la trayectoria del rebote debe formar un ángulo divergente idéntico (nuevo rumbo 20º). El nuevo rumbo es el resultado de restar a 360º el rumbo inicial.
- Pared superior: Si la trayectoria incidente forma un ángulo de 15º con la pared (rumbo 75º) por ejemplo, la trayectoria del rebote debe formar un ángulo divergente idéntico (rumbo 105º). El nuevo rumbo es el resultado de restar a 180º el rumbo inicial.
- Pared derecha: Si la trayectoria incidente forma un ángulo de 30º con la pared (rumbo inicial 150º) por ejemplo, la trayectoria del rebote debe formar un ángulo divergente idéntico (nuevo rumbo 210º). El nuevo rumbo es el resultado de restar a 360º el rumbo inicial.
- Pared inferior: Si la trayectoria incidente forma un ángulo de 20º con la pared (rumbo inicial 250º) por ejemplo, la trayectoria del rebote debe formar un ángulo divergente idéntico (nuevo rumbo -70º). El nuevo rumbo es el resultado de restar a 180º el rumbo inicial.
Asi pues, el cálculo del rebote es distinto en las paredes verticales y horizontales. El código de los procedimientos que calculen el rebote deben recibir la información de si el impacto ha sido con una pared vertical u horizontal.
