Ver Mensaje Individual
  #2 (permalink)  
Antiguo 20/05/2015, 21:27
Avatar de vangodp
vangodp
 
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 3 meses
Puntos: 38
Respuesta: Mantener Fondo fijo

Código C++:
Ver original
  1. #include <stdio.h>
  2. #include <allegro.h>
  3. #include <cstdlib>
  4. #include <iostream>
  5. #include <time.h>
  6.  
  7.  
  8. #define ROJO 0x1AA9D1
  9. #define GRIS 0x333333
  10. #define BLANCO 0xFFFFFF
  11.  
  12. using namespace std;
  13.  
  14. int main() {
  15.     allegro_init();
  16.     install_keyboard();
  17.  
  18.     set_color_depth ( 32 );
  19.     set_gfx_mode ( GFX_AUTODETECT_WINDOWED, 800, 531, 0, 0 );
  20.  
  21.  
  22.     bool salida = false;
  23.     int tiempo_ticks;
  24.     int ticks;
  25.     int op = 0;
  26.     int sw = 0;
  27.  
  28.     ticks = CLOCKS_PER_SEC / 20;
  29.     tiempo_ticks = 0;
  30.  
  31.  
  32.     BITMAP *buffer = create_bitmap ( 800, 531 );
  33.     BITMAP *fondo;
  34.     BITMAP *fondo2;
  35.     BITMAP *fondo3;
  36.  
  37.     clear_to_color ( buffer, 0x000000 );
  38.  
  39.  
  40.     fondo = load_bitmap ( "fondo1.bmp", NULL );
  41.     fondo2 = load_bitmap ( "instrucciones.bmp", NULL );
  42.     fondo3 = load_bitmap ( "creditos1.bmp", NULL );
  43.  
  44.     if ( fondo == NULL ){
  45.         cout << "ERROR" << endl;
  46.         return 1;
  47.     }
  48.  
  49.     int escena = 0;
  50.     while ( !salida ) {
  51.         if ( clock() > tiempo_ticks + ticks ) {
  52.             tiempo_ticks = clock();
  53.  
  54.  
  55.  
  56.             clear_to_color ( buffer, 0x000000 );
  57.            
  58.             switch ( escena ) {
  59.                 case 1:
  60.                     break;
  61.                 case 2:
  62.                     break;
  63.                 case 3: //instruciones
  64.                     blit ( fondo2, buffer, 0, 0, 0, 0, 800, 531 );
  65.                     if ( key[KEY_ESC] ){
  66.                         escena = 0;
  67.                     }
  68.                     break;
  69.                 case 4: //salir
  70.                     blit ( fondo3, buffer, 0, 0, 0, 0, 800, 531 );
  71.                     break;
  72.                 default:
  73.                     //por defecto inicia pintando esta
  74.                     if ( !key[KEY_UP] && !key[KEY_DOWN] && sw == 1 ) {sw = 0;}
  75.                     if ( key[KEY_UP] && sw == 0 ) { op--; if ( op == 0 ) op = 5; sw = 1; }
  76.                     if ( key[KEY_DOWN] && sw == 0 ) { op++; if ( op == 6 ) op = 1; sw = 1; }
  77.                     if ( op == 5 && key[KEY_ENTER] ) { salida = true; }
  78.                     if ( op == 3 && key[KEY_ENTER] ) { escena = 3; op = 0; }
  79.                     if ( op == 4 && key[KEY_ENTER] ) {escena = 4; op = 0; }                
  80.                    
  81.                     blit ( fondo, buffer, 0, 0, 0, 0, 800, 531 );
  82.                    
  83.                     if ( op == 1 ) { textout_centre_ex ( buffer, font, "Nueva Partida" , 390, 260, ROJO, GRIS );
  84.                     } else {         textout_centre_ex ( buffer, font, "Nueva Partida" , 390, 260, BLANCO, GRIS ); }
  85.                     if ( op == 2 ) { textout_centre_ex ( buffer, font, "Niveles" , 385, 318, ROJO, GRIS );
  86.                     } else {         textout_centre_ex ( buffer, font, "Niveles" , 385, 318, BLANCO, GRIS ); }
  87.                     if ( op == 3 ) { textout_centre_ex ( buffer, font, "Instrucciones" , 390, 368, ROJO, GRIS );
  88.                     } else {         textout_centre_ex ( buffer, font, "Instrucciones" , 390, 368, BLANCO, GRIS ); }
  89.                     if ( op == 4 ) { textout_centre_ex ( buffer, font, "Creditos" , 380, 417, ROJO, GRIS );
  90.                     } else {         textout_centre_ex ( buffer, font, "Creditos" , 380, 417, BLANCO, GRIS ); }
  91.                     if ( op == 5 ) { textout_centre_ex ( buffer, font, "Salir" , 381, 467, ROJO, GRIS );
  92.                     } else {         textout_centre_ex ( buffer, font, "Salir" , 381, 467, BLANCO, GRIS ); }
  93.                     break;
  94.             }
  95.        
  96.            
  97.             blit ( buffer, screen, 0, 0, 0, 0, 800, 531 );
  98.         }        
  99.     }
  100.  
  101.  
  102.     destroy_bitmap ( buffer );
  103.     destroy_bitmap ( fondo );
  104.     destroy_bitmap ( fondo2 );
  105.     destroy_bitmap ( fondo3 );
  106.  
  107.     return 0;
  108. }
  109. 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.


Última edición por vangodp; 20/05/2015 a las 21:41