• SomethingCoolDev Week1

De VGAFIB

Contingut

Previo

Para esta primera semana haremos una base donde construir encima nuestro juego. Podeis usar SFML (aunque si queréis podéis hacerlo en SDL), una librería multimedia que nos proporcionará una ventana donde empezar a mostrar cosas. Lo que debéis hacer es entrar en la página de la SFML, y a base de ir leyendo la documentación consigáis abrir una ventana, hacer el bucle principal de un juego, controlar eventos y dibujar geometría (un cuadrado).

Recursos

Nombre Enlace
SFML http://www.sfml-dev.org/
SDL http://www.libsdl.org/
Plantilla juego en SDL Plantilla SDL
Tutorial de bucle principal Bucle principal

Enunciado

El objetivo de esta semana es:

  • Abrir una ventana de 800x600 con el fondo negro
  • Permitir el cierre apretando ESC y la "X" de la ventana.
  • Mostrar un cuadrado blanco moviéndose por pantalla, y que este rebote en caso de que se salga por pantalla.


Solución

Solución para SFML 2.0 por Cristian Pallarés: Fichero CPP [1]

En esta solución usamos un Clock para obtener el incremento de tiempo entre el frame actual y el frame anterior. Para calcular la posición actual de la pelota uso la formula: posición = posición_anterior + velocidad * incremento_tiempo;

Quiza os suene esta formula, se da en batxiller. Es la formula de un movimiento rectilinio uniforme. Con este método permitimos que si una maquina es suficiente capaz para generar más frames intermedios, esta pueda calcular la posición de la pelota correctamente.

Preguntas

  • Q: Que pasa si usas un ordenador poco potente (un 486 por ejemplo) y va menos de un frame por segundo, ¿no se romperían las colisiones con ese código que propones?
  • A: Si tuviesemos un ordenador que va a menos de 1 frame / sec, tendríamos deltaTimes > 1.0f. El calculo de la posición seguiría siendo correcto, lo que si es shitty es el código de colisiones, que lo que hace es que si te pasas en un frame, al final de este te clava en el borde de la pantalla. Hay mil formas de hacerlo bien, pero como en realidad este ejercicio no es un videojuego real ya nos valdría. Ahora bien, ¿como se haría? La forma más correcta de hacerlo en realidad seria:
  1. Obtenemos el deltaTime.
  2. Calculamos la trayectoria de la bola.
  3. De todos las posibles cosas con las que la bola colisiona dada su trayectoria, nos quedamos con la más cercana.
  4. Si no hay colisión con nada, ves al paso 8, sino ves al paso 5.
  5. Calcular un deltaTimeParcial con el que se llega justo al colisionador más cercano.
  6. Se mueve la pelota usando deltaTimeParcial, se modifica su velocidad (se aplica el rebote), y se calcula: deltaTime -= deltaTimeParcial
  7. Si deltaTime > 0 volvemos al paso 2.
  8. Fin del update.

Otras soluciones

Solución en HTML5 por Ferran Bertomeu: Enlace [2]

Para llegar a esta solución recomiendo que miréis esta presentación de Google que habla al respecto: http://blog.sethladd.com/2011/05/source-code-slides-and-video-for-html5.html


Solución para SFML 1.6: Fichero CPP [3]


Solución para Pebble SDK 2.0 por Alvaro Sauca: Fichero C [4] El archivo está en la carpeta src