Código
int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) { UNREFERENCED_PARAMETER(lpszCmdLine); // Para que no moleste al compilar, no lo usamos. IdAplicacion = hInstance; // Guardo el identificador del programa, luego lo usamos. // Cargo los arrays para simular la funcion seno y coseno, siempre que sea en grados enteros. // Las funciones sen y cos admiten el angulo en radianes asi que lo convierto a grados: // grados = (radianes * PI)/180. for(int i=0; i<360; i++) { seno[i]=sin((double) (i*PI/180)); coseno[i]=cos((double)(i*PI/180)); } // Voy a rellenar el array de los ladrillos del muro con los datos del array auxiliar que contiene // al principio los datos. En el array original estara siempre el muro y el segundo array sera el // que usemos en el juego y en el que iremos borrando los ladrillos segun juguemos. Antes de cada // partida tendremos que volver a rellenar el array con los datos originales. // Pongo la variable con el numero de ladrillos a 0 NLadrillos=0; // Cargo los datos del array "ladrillos" con los del array "muro" (el que siempre tiene los datos), // el nivel 0, el primero. Mientras, cuento los ladrillos. for(int i=0; i<NUMERO_LADRILLOS; i++) { ladrillos[i] = muro[0][i]; if(muro[0][i] != 0) NLadrillos++; } CreaVentana(); // Funcion que crea la ventana. Definida mas arriba. // Definimos un timer de windows con identificativo 1 y // que se ejecuta cada 15 segundos. // Sera el que nos indique si debemos cambiar el punto // de vista del juego. SetTimer(IdVentana, 1, 15000, NULL); IniciaGL(); // Funcion para inicializar OpenGL. Definida mas arriba. // Este es el bucle habitual de windows que se esta ejecutando continuamente hasta que recibe // el mensaje de acabar (ya lo hemos preparado en la funcion "ProcesaMensajes" asociada a // la ventana, tambien asociada a este programa atraves de su identificativo). MSG Mensaje; // Varible para contener los mensajes que van llegando. // Definimos tres variables de 64 bits que usaremos para // obtener el dato de tiempo en cada pasada del bucle LARGE_INTEGER t1,t2,frecuencia; // Esta variable de tipo coma flotante de doble precision // para guardar el tiempo en segundos que tarda cada pasada // del programa. double segundos=0; // Obtenemos la primera toma de tiempo en t1. QueryPerformanceCounter(&t1); // Obtenemos la frecuencia del procesador para // calcular, despues, en segundos lo que tarda // nuestro bucle en base a dos tomas de tiempo // con "QueryPerformanceCounter". QueryPerformanceFrequency(&frecuencia); // Entramos en el bucle del programa while(TRUE) // Se ejecuta continuamente. { // Tratamos los mensajes que haya de la forma habitual // Exploramos la cola de mensajes. if(PeekMessage(&Mensaje, NULL, 0, 0, PM_NOREMOVE)) {// procesándolos adecuadamente // En este caso terminamos. if(!GetMessage(&Mensaje, NULL, 0, 0)) return (int)Mensaje.wParam; TranslateMessage(&Mensaje); DispatchMessage(&Mensaje); } // Eliminamos la espera. Ahora queremos ejecutar continuamente // aunque no haya mensajes. //else WaitMessage(); // en caso contrario esperamos un mensaje // Tomo el segundo tiempo en t2 QueryPerformanceCounter(&t2); // Calculo los segundos en base a los dos tiempos, t1 y t2. // t2, excepto en la primera pasada del bucle, sera siempre // mayor que t1 (segundos es un decir, sera muuucho menos // de un segundo). segundos = (double)(t2.QuadPart-t1.QuadPart)/(double)frecuencia.QuadPart; // Si, en base a los segundos calculados y el frame rate que queremos, // toca ya pintar otra vez la escena, tomamos de nuevo tiempo en t1 y // pintamos de nuevo. Si no toca volvemos al principio del bucle, vemos // si hay mensajes y tomamos de nuevo el segundo tiempo y comprobamos // otra vez. // Aprovechamos para calcular el frame rate real (si la maquina fuera muy // lenta o tuvieramos algun problema en el codigo, podria ser menor de lo // que hemos fijado) if( (segundos) >= 1.0f/(double)FPS_que_queremos ) { // Tomamos el primer tiempo en t1. QueryPerformanceCounter(&t1); // Calculamos frame rate real. // Sera el numero de veces que el trocito de segundo que tarda // nuestro bucle, cabe en 1 segundo entero. FPS_reales = 1.0f/segundos; // Pintamos nuestra escena si la ventana // esta activa. if(PROGRAMA_ACTIVO) Pinta(); // Al terminar el bucle pongo a 0 nuestro // valor para la rueda del raton Raton.rueda=0; // Guardo las coordenadas del raton como las anteriores // ahora que las he usado como actuales. Raton.prev_x = Raton.x; Raton.prev_y = Raton.y; } } // Fin while. } // fin WinMain. //------------------------------------------------------------------