Hola a todos!
Llevo ya unas semanas trabajando en el juego del Pong basado en FreeRTOS, y aunque aun no esta terminado, voy a empezar con la pequeña documentacion que necesita el proyecto y así ver si me podéis ayudar con los problemas que aun me quedan por solucionar.
El objetivo del proyecto es jugar un poco con los RTOS, con la POO y con el lenguaje C en general. En un principio intenté realizar el space invaders, pero tras darle unas cuantas vueltas me di cuenta de que el juego del pong me iva a resultar más sencillo sin dejar de lado los objetivos del proyecto. A pesar de que el juego es muy simple he tenido que pelearme para realizar un programa bien estructurado y robusto.
De momento tengo prevista una interfaz con 5 pulsadores( ONOFF, I1, D1, I2 y D2) y un LCD grafico con un controlador pcd8544, como el del los nokia 3310.
El aspecto del juego podría ser este:
Preo lo primero es dividir el juego en tareas, tras hacer muchos dibujos y delegar responsabilidades la cosa quedo así:
La tarea PONG se ocupa de mostrar mensajes al inicio y al fin del juego y lleva la cuenta de las rondas jugadas.
Las tareas PLAYER mantiene actualizado a su jugador en la pantalla, con su puntuación y sus vidas.
La tarea BALL mantiene actualizada la pelota en la pantalla y comprueba si rebota contra un jugador o si pasa.
La tarea KEY lee los pulsadores y periodicamente envia un mensaje indicando su estado.
La tarea LCD recibe todos los elementos a mostrar en el LCD y los va mostrando.
Las tareas se envian informacion mediante recursos como queues o semaforos o memoria compartida que aun no tengo del todo decididos. Pero esta es la info que deben compartir:
Key: Es el estado de los pulsadores.
LCD: Es la primitiva a representar. Un circulo con parametros x0, y0 y r por ejemplo.
Start: Informa de que el juego va a empezar.
Position: Es la posición en la que se encuentra un jugador
Kill: Informa de que la bola a "entrado en la portería".
GameOver: Informa de que el jugador X se ha quedado sin vidas.
También he repartido el codigo en objetos, de esta manera hay un ojeto de la clase BALL almacena la posicion de la bola y define todas las funciones que necesita la bola. Ademas este objeto esta "vivo", ya que crea una tarea en el RTOS que le permite interactuar por si solo.
Estos son los metodos de la clase BALL:
BALL *BALLConstruct( xBALLResources resources, int iBallID );
void BALLDestruct( BALL *this );
static void BALLReset( BALL *this );
static void BALLTask( void * pvParameters );
static void BALLMove( BALL *this );
static void BALLDraw( BALL *this );
static int BALLBounce( BALL *this, int jugador );
static int BALLGoal( BALL *this, int pared );
Estos son los atributos de la calse BALL:
typedef struct{
xTaskHandle xHandle;
xBALLResources resources;
float px;
float py;
int iBallID;
}BALL;
Saludos