Estoy jugando con un pequeño proyecto de juego y como no tengo mucha experiencia en TDD me encantaría obtener algunas opiniones de expertos sobre un par de cosas.TDD And Game Physics
Antes que nada, me di cuenta desde el principio que el TDD no parecía ideal para el desarrollo de juegos. Parece que las opiniones varían bastante sobre el tema. Mi opinión inicial sin educación fue que TDD parecía que funcionaría muy bien para toda la lógica del juego. Pensé que todo lo que se ocupara de la salida de video y el sonido se resumiría en clases que se probarían visualmente.
Las cosas empezaron bien. El objetivo era crear un juego de vuelo espacial 2d (asteroides para aquellos que se preocupan). Creé una serie de pruebas unitarias para la clase Ship. Cosas como la inicialización, la rotación, se pueden probar fácilmente en una serie como: GetRotation(), TurnRotateRightOn(), Update (1), GetRotation(), Expect_NE (rotation1, rotation2). Luego llegué al primer problema.
Mi comprensión de TDD es que debes escribir la prueba sobre cómo crees que deberías usar la clase. Quiero que la nave se pueda mover, así que escribí una clase que básicamente decía. GetCoordinates(), ThrustOn(), Update (1), GetCoordinates(). Eso estuvo bien para asegurarse de que el barco se movió a algún lugar. Sin embargo, rápidamente me di cuenta de que tenía que asegurarme de que la nave se movía en la dirección correcta y con la velocidad correcta. Lo que siguió fue una prueba de unidad de 75 líneas donde básicamente tuve que inicializar la rotación, verificar las coordenadas, inicializar el empuje, actualizar la nave, obtener las nuevas coordenadas, verificar la nueva rotación. Además, no veo la necesidad de obtener la velocidad del barco en el juego (solo las coordenadas, el barco debería actualizarse). Debido a esto, no tenía forma directa de obtener la velocidad. Así que la prueba básicamente tuvo que volver a calcular cuál debería haber sido la velocidad para poder asegurarme de que coincida con las coordenadas que obtenía después de la actualización. En general, esto fue muy complicado y llevó mucho tiempo, pero funcionó. La prueba falló, hizo pasar la prueba, etc.
Esto estuvo bien hasta más tarde cuando me di cuenta de que quería refactorizar el código de actualización del barco en una clase abstracta "Actor". Me di cuenta de que si bien cada subclase de Actor necesitaría poder calcular correctamente una nueva posición, no todas las subclases necesariamente actualizarían su velocidad de la misma manera (algunas colisionan, otras no, algunas tienen velocidades estáticas). Ahora, básicamente me enfrento a la posibilidad de duplicar y alterar ese enorme y enorme código de prueba y no puedo evitar pensar que debería haber una mejor manera.
¿Alguien tiene alguna experiencia en el manejo de pruebas unitarias de este tipo de funcionamiento de caja negra compleja? Parece que básicamente tengo que escribir exactamente el mismo código de física en la prueba para saber cuál es el resultado. Parece realmente contraproducente, y estoy seguro de que me estoy perdiendo el sentido de todo esto en algún punto del camino. Agradecería mucho cualquier ayuda o consejo que cualquiera pueda ofrecer.
¿Esta pregunta no pertenece al gamedev SE? Probablemente podrían responder mejor allí. – Spoike
¡No estaba al tanto del Gamedev SE! Haré preguntas similares allí en el futuro. ¡Gracias! – Landon