Un diseño bueno o malo se revela por lo bien que satisface los requisitos inesperados, por lo que sugiero mantenerlo un inventario de posibles "características del juego" útiles para informar sus reflexiones de diseño. Ya que estás haciendo esto como un proyecto de aprendizaje, puedes permitirte el lujo de volverse loco.
Arkanoid es una muy buena opción para esto, ofrece tantas opciones. Haz que diferentes ladrillos obtengan diferentes cantidades de puntos. Haz que algunos ladrillos cambien el puntaje de otros ladrillos cuando los golpees. Hacer algunos ladrillos requiere múltiples golpes. Da superpoderes a la pelota, paleta o ladrillos. Varíe estos poderes: uno de ellos hace que la bola sea controlable por teclado, otra la hace transparente, otra invierte la "gravedad", y así sucesivamente. Haz que los ladrillos caigan objetos.
El objetivo es que cuando se realiza un cambio de este tipo, afecte la menor cantidad posible de clases y métodos. Obtenga una idea de cómo debe cambiar su diseño para ajustarse a este criterio.
Use un IDE que tenga un menú Refactoring, en particular método de movimiento refactorización.(Si no lo ha hecho, lea el libro Refactoring). Experimente colocando sus diversos métodos aquí y allá. Observe lo que se vuelve difícil de cambiar cuando el método se coloca "mal", y lo que se vuelve más fácil cuando lo coloca en otro lugar. Los métodos se colocan justo cuando los objetos se ocupan de su propio estado; puede "decirle" a un objeto que haga algo, en lugar de "preguntarle" sobre su estado y luego tomar decisiones en función de sus respuestas.
Supongamos que en su diseño cada sprite es una instancia de objeto. (Puedes elegir otras estrategias.) Generalmente, el movimiento altera el estado de un sprite, por lo que el método que describe el movimiento para un tipo particular de sprite probablemente pertenece a la clase de ese sprite.
La detección de colisiones es una parte sensible del código, ya que implica la posibilidad de verificar todos los pares posibles de sprites. Usted querrá distinguir marcando para colisiones y informando objetos de colisiones. Por ejemplo, tu bola de objeto necesita modificar su movimiento al colisionar con la pala. Pero el algoritmo para detectar colisiones en general no pertenecerá a la clase de bola, ya que otros pares de objetos pueden colisionar con las consecuencias que importan para el juego.
Y así sucesivamente ...
Creo que entiendo algunos de estos, como el primero: dado que un objeto de puntuación mantiene todo el puntaje, también debe tener los métodos que modifican el puntaje. No entiendo 1.1, sin embargo: dado que cada colisión ocurre dentro del tablero, debería tener board.collides (ball, goal1)? – Tordek
@ [Tordek]: sí, en realidad tendría board.CheckCollisions (AllObjects), para verificar colisiones entre todas las bolas y objetivos y cualquier otro objeto colisible con el alcance del juego activo. Utilice MoveObjects X CollidableObjects para la prueba de colisión y revise los rectángulos delimitadores para una prueba rápida. –