Código C++:
Ver original#include <stdio.h>
#include <allegro.h>
#include <cstdlib>
#include <iostream>
#include <time.h>
#define ROJO 0x1AA9D1
#define GRIS 0x333333
#define BLANCO 0xFFFFFF
using namespace std;
int main() {
allegro_init();
install_keyboard();
set_color_depth ( 32 );
set_gfx_mode ( GFX_AUTODETECT_WINDOWED, 800, 531, 0, 0 );
bool salida = false;
int tiempo_ticks;
int ticks;
int op = 0;
int sw = 0;
ticks = CLOCKS_PER_SEC / 20;
tiempo_ticks = 0;
BITMAP *buffer = create_bitmap ( 800, 531 );
BITMAP *fondo;
BITMAP *fondo2;
BITMAP *fondo3;
clear_to_color ( buffer, 0x000000 );
fondo = load_bitmap ( "fondo1.bmp", NULL );
fondo2 = load_bitmap ( "instrucciones.bmp", NULL );
fondo3 = load_bitmap ( "creditos1.bmp", NULL );
if ( fondo == NULL ){
cout << "ERROR" << endl;
return 1;
}
int escena = 0;
while ( !salida ) {
if ( clock() > tiempo_ticks
+ ticks
) {
clear_to_color ( buffer, 0x000000 );
switch ( escena ) {
case 1:
break;
case 2:
break;
case 3: //instruciones
blit ( fondo2, buffer, 0, 0, 0, 0, 800, 531 );
if ( key[KEY_ESC] ){
escena = 0;
}
break;
case 4: //salir
blit ( fondo3, buffer, 0, 0, 0, 0, 800, 531 );
break;
default:
//por defecto inicia pintando esta
if ( !key[KEY_UP] && !key[KEY_DOWN] && sw == 1 ) {sw = 0;}
if ( key[KEY_UP] && sw == 0 ) { op--; if ( op == 0 ) op = 5; sw = 1; }
if ( key[KEY_DOWN] && sw == 0 ) { op++; if ( op == 6 ) op = 1; sw = 1; }
if ( op == 5 && key[KEY_ENTER] ) { salida = true; }
if ( op == 3 && key[KEY_ENTER] ) { escena = 3; op = 0; }
if ( op == 4 && key[KEY_ENTER] ) {escena = 4; op = 0; }
blit ( fondo, buffer, 0, 0, 0, 0, 800, 531 );
if ( op == 1 ) { textout_centre_ex ( buffer, font, "Nueva Partida" , 390, 260, ROJO, GRIS );
} else { textout_centre_ex ( buffer, font, "Nueva Partida" , 390, 260, BLANCO, GRIS ); }
if ( op == 2 ) { textout_centre_ex ( buffer, font, "Niveles" , 385, 318, ROJO, GRIS );
} else { textout_centre_ex ( buffer, font, "Niveles" , 385, 318, BLANCO, GRIS ); }
if ( op == 3 ) { textout_centre_ex ( buffer, font, "Instrucciones" , 390, 368, ROJO, GRIS );
} else { textout_centre_ex ( buffer, font, "Instrucciones" , 390, 368, BLANCO, GRIS ); }
if ( op == 4 ) { textout_centre_ex ( buffer, font, "Creditos" , 380, 417, ROJO, GRIS );
} else { textout_centre_ex ( buffer, font, "Creditos" , 380, 417, BLANCO, GRIS ); }
if ( op == 5 ) { textout_centre_ex ( buffer, font, "Salir" , 381, 467, ROJO, GRIS );
} else { textout_centre_ex ( buffer, font, "Salir" , 381, 467, BLANCO, GRIS ); }
break;
}
blit ( buffer, screen, 0, 0, 0, 0, 800, 531 );
}
}
destroy_bitmap ( buffer );
destroy_bitmap ( fondo );
destroy_bitmap ( fondo2 );
destroy_bitmap ( fondo3 );
return 0;
}
END_OF_MAIN();
no adelanta escapar jajajaja
te dije que tienes que usar un gestor de escenas si o si. XD
La medida que tu juego va creciendo se va haciendo insostenible mantener todo eso bajo un solo bucle. Debes ir desviando el juego por escenas, cada escena tiene su proprio sistema de teclas y su proprio blit(pueden ser varios blits).
Cada escena debería ser una clase con su proprio bucle, su propria gestión de teclas (eventos) etc. Es lo que hace cada case más o menos, pero mucho más elaborado XDDD.
Meter todo un juego bajo un solo bucle es una locura XDDD. Vaya planteándote eso.