Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Mantener Fondo fijo

Estas en el tema de Mantener Fondo fijo en el foro de C/C++ en Foros del Web. Hola, buenas. Soy nuevo en el ámbito de la programación y comencé con el lenguaje c++ , me pidieron hacer un "proyecto" donde se debe ...
  #1 (permalink)  
Antiguo 20/05/2015, 19:27
Avatar de Jose_A  
Fecha de Ingreso: mayo-2015
Ubicación: México, Sonora.
Mensajes: 180
Antigüedad: 9 años
Puntos: 0
Mantener Fondo fijo

Hola, buenas. Soy nuevo en el ámbito de la programación y comencé con el lenguaje c++ , me pidieron hacer un "proyecto" donde se debe realizar un juego, elegí la librería Allegro para llevarlo acabo. Ahora mismo me encuentro en el menú donde me topé con un problema. Ya está casi terminado, sólo que cuando doy "enter" en "instrucciones" o "créditos" la imagen que mando a imprimir sólo aparece un instante y después se vuelve a quitar, no he podido solucionarlo por eso he venido a pedir ayuda, alguien sabe cuál puede ser el problema?, este es el código:

https://mega.co.nz/#!fVh2lDCI!Dd_hC-jEQe7BUPTXWDBh6pB4TV5lsJrnZq5VnsFS7a4


Gracias de antemano...
  #2 (permalink)  
Antiguo 20/05/2015, 21:27
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 7 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
  #3 (permalink)  
Antiguo 20/05/2015, 22:09
Avatar de Jose_A  
Fecha de Ingreso: mayo-2015
Ubicación: México, Sonora.
Mensajes: 180
Antigüedad: 9 años
Puntos: 0
Respuesta: Mantener Fondo fijo

Cita:
Iniciado por vangodp Ver Mensaje
no adelanta escapar jajajaja
te dije que tienes que usar un gestor de escenas si o si. XD
jajajjaja hola xD lo siento, pensé que había posibilidad de hacerlo simplemente mandando los fondos en un solo bucle pero definitivamente no se podrá. Con esto que me has dicho ya puedo seguir libremente por la vida xDDD gracias
  #4 (permalink)  
Antiguo 20/05/2015, 22:18
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 7 meses
Puntos: 38
Respuesta: Mantener Fondo fijo

Tu fiate que tu juego aun está en el menu, y va creciendo en complejidad. Imaginate cuando tengas mogollón de matrices que marcan posiciones, tengas que mostrar varias imagenes por pantalla etc etc. ¿Has imaginado el tamaño del bucle??? jaja

no te quiero asustar XDD. Hacer un juego es algo complicado, pero por eso es una de las cosas más gratificantes XDD

Tu hazte amigo del termino "Divide y venza" que consigues sin problemas. Para eso están las clases, funciones, estructuras etc etc.

Vaya aprendiendo bien el C++, y no dejes de buscar cosas como teoría de juegos etc.

Con el tiempo irás ganando experiencia y no te será tan difícil. No desista, si lo haces es que no quieres crear un juego XDDD

Suerte.

PD: cuando seas el dueño de una empresa de juegos no te olvides de contratarme jajaja.
  #5 (permalink)  
Antiguo 20/05/2015, 22:45
Avatar de Jose_A  
Fecha de Ingreso: mayo-2015
Ubicación: México, Sonora.
Mensajes: 180
Antigüedad: 9 años
Puntos: 0
Respuesta: Mantener Fondo fijo

Siii, tengo muy poco tiempo viendo c++ en clase y con las otras materias no me he enfocado al 100% en ver libros o cosas donde pueda aprender aparte, pero estas vacaciones me tomaré un tiempo para hacerlo. Es un gran reto este proyecto pero sin duda poco a poco le tomaré ritmo y ampliaré los recursos que tengo para poder lograrlo :3

Gracias de nueva cuenta ;D

Pd: Sin dudarlo jajaja

Etiquetas: fijo, lenguaje, programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:20.