Recent

Author Topic: ayuda sobre la creacion de objetos con freepascal y allegro5  (Read 5620 times)

zelda16bit

  • Full Member
  • ***
  • Posts: 118
ayuda sobre la creacion de objetos con freepascal y allegro5
« on: December 22, 2021, 05:16:55 pm »
Pues queria saber si estoy creando correctamente una clase para pintar y mover un objeto en allegro 5,me gustaria saber si todo esta correctamente programado.

Otra cosa que queria saber es que estoy cargando la imagen en el constructor de la clase ,pero pienso que si cada vez que creo una clase se estaria cargando ese grafico y no lo veo muy optimo,lo que pasa es que no me deja inicializar la variable imagen desde el principio y no me queda mas remedio que inicializarla desde el constructor,entonces me gustaria saber como inicializarla fuera del constructor pero dentro de la clase,es decir,en el momento en el que la creo.

Pongo codigo.
Code: Pascal  [Select][+][-]
  1. {$mode objfpc} {$H+}
  2. program alegro8;
  3.  
  4. (*
  5.   allegro5 -> biblioteca alegro
  6.   al5image -> biblioteca para imagenes
  7. *)
  8.  
  9. uses
  10.   allegro5,al5image;
  11.  
  12. //clase jugador----------------------------------
  13. type
  14.   Tjugador = class
  15.     strict private
  16.      imagen: ALLEGRO_BITMAPptr;
  17.      estado_de_teclas: ALLEGRO_KEYBOARD_STATE;
  18.      x,y: real;
  19.     public
  20.       constructor Create();
  21.       procedure pintar();
  22.       procedure mover();
  23.       destructor Destroy(); override;
  24.   end;
  25.  
  26.   constructor Tjugador.Create();
  27.   begin
  28.     imagen := al_load_bitmap('alien.png');
  29.     x := 320;
  30.     y := 240;
  31.   end;
  32.  
  33.   procedure Tjugador.pintar();
  34.   begin
  35.     //pintamos imagen(imagen,x,y,voltear)
  36.     al_draw_bitmap(imagen,x,y,0);
  37.   end;
  38.  
  39.   procedure Tjugador.mover();
  40.   begin
  41.     al_get_keyboard_state(estado_de_teclas);
  42.     if(al_key_down(estado_de_teclas,ALLEGRO_KEY_LEFT)) then
  43.     begin
  44.       x := x - 5;
  45.     end
  46.     else if(al_key_down(estado_de_teclas,ALLEGRO_KEY_RIGHT)) then
  47.     begin
  48.       x := x + 5;
  49.     end;
  50.  
  51.     if(al_key_down(estado_de_teclas,ALLEGRO_KEY_UP)) then
  52.     begin
  53.       y := y - 5;
  54.     end
  55.     else if(al_key_down(estado_de_teclas,ALLEGRO_KEY_DOWN)) then
  56.     begin
  57.       y := y + 5;
  58.     end;
  59.   end;
  60.  
  61.   destructor Tjugador.Destroy();
  62.   begin
  63.     al_destroy_bitmap(imagen);
  64.     imagen := nil;
  65.   end;
  66. //fin clase jugador---------------------------------
  67.  
  68. var
  69.   ventana: ALLEGRO_DISPLAYptr = nil;
  70.   evento: ALLEGRO_EVENT;
  71.   cola_de_eventos: ALLEGRO_EVENT_QUEUEptr = nil;
  72.   tiempo: ALLEGRO_TIMERptr = nil;
  73.   ejecutar: Boolean;
  74.   jugador: Tjugador;
  75.  
  76. begin
  77.  
  78.   //iniciar allegro
  79.   al_init();
  80.   //instalar teclado
  81.   al_install_keyboard();
  82.   //iniciar imagen
  83.   al_init_image_addon();
  84.  
  85.   //configurar ventana en modo ventana
  86.   al_set_new_display_flags(ALLEGRO_WINDOWED);
  87.   //crear ventana(ancho,alto)
  88.   ventana := al_create_display(640,480);
  89.  
  90.   //poner titulo a la ventana
  91.   al_set_window_title(ventana,'objeto jugador');
  92.  
  93.   //ocultar raton
  94.   al_hide_mouse_cursor(ventana);
  95.  
  96.   //crear cola de eventos
  97.   cola_de_eventos := al_create_event_queue();
  98.  
  99.   //crear tiempo para fps
  100.   tiempo := al_create_timer(1/60);
  101.  
  102.   //registrar eventos
  103.   al_register_event_source(cola_de_eventos,al_get_keyboard_event_source());
  104.   al_register_event_source(cola_de_eventos,al_get_display_event_source(ventana));
  105.   al_register_event_source(cola_de_eventos,al_get_timer_event_source(tiempo));
  106.  
  107.   //inicio de variables
  108.   ejecutar := true;
  109.   jugador := Tjugador.Create();
  110.  
  111.   //iniciamos el tiempo
  112.   al_start_timer(tiempo);
  113.   while (ejecutar = true) do
  114.   begin
  115.  
  116.     //esperamos a la cola de eventos
  117.     al_wait_for_event(cola_de_eventos,@evento);
  118.     case evento.ftype of
  119.       //manejo de fps
  120.       ALLEGRO_EVENT_TIMER: begin
  121.         //limpiar pantalla con un color cualquiera
  122.         al_clear_to_color(al_map_rgb(0,0,160));
  123.  
  124.         jugador.mover();
  125.         jugador.pintar();
  126.  
  127.         //actualizar pantalla
  128.         al_flip_display();
  129.       end;
  130.       //si pulso escape salgo del bucle
  131.       ALLEGRO_EVENT_KEY_DOWN: begin
  132.         if (evento.keyboard.keycode = ALLEGRO_KEY_ESCAPE) then
  133.         begin
  134.           ejecutar := false;
  135.         end;
  136.       end;
  137.     end; //fin case
  138.  
  139.   end; //fin bucle while
  140.  
  141.   al_destroy_display(ventana); //destruir ventana
  142.   ventana := nil;
  143.   al_destroy_event_queue(cola_de_eventos); //destruir cola
  144.   cola_de_eventos := nil;
  145.   al_destroy_timer(tiempo); //destruir tiempo
  146.   tiempo := nil;
  147.   al_uninstall_keyboard(); //desinstalar teclado
  148.   jugador.Free(); //liberar jugador
  149.   jugador := nil
  150.  
  151. end. //fin programa
  152.  
  153.  

BlueIcaro

  • Hero Member
  • *****
  • Posts: 792
    • Blog personal
Re: ayuda sobre la creacion de objetos con freepascal y allegro5
« Reply #1 on: December 24, 2021, 05:06:23 pm »
Hola, si una variable pertenece a un objeto, hasta que este no esté creado no se puede acceder a ella. Porque no existe el objeto que "la contiene".

Saludos
/BlueIcaro

zelda16bit

  • Full Member
  • ***
  • Posts: 118
Re: ayuda sobre la creacion de objetos con freepascal y allegro5
« Reply #2 on: December 25, 2021, 05:32:40 pm »
Hola, si una variable pertenece a un objeto, hasta que este no esté creado no se puede acceder a ella. Porque no existe el objeto que "la contiene".

Saludos
/BlueIcaro

Lo que pasa es que las variables son privadas y no se puede acceder a ellas desde fuera,tendre que cambiarlas a publicas.

Ñuño_Martínez

  • Hero Member
  • *****
  • Posts: 1186
    • Burdjia
Re: ayuda sobre la creacion de objetos con freepascal y allegro5
« Reply #3 on: December 29, 2021, 09:38:32 pm »
Es fácil:  añade un método "CargaImagen".

He cambiado varias cosas en tu código y añadido algunos comentarios explicando esos cambios.

Code: Pascal  [Select][+][-]
  1.     {$mode objfpc} {$H+}
  2.     program alegro8;
  3.      
  4.     (*
  5.       allegro5 -> biblioteca alegro
  6.       al5image -> biblioteca para imagenes
  7.     *)
  8.      
  9.     uses
  10.       sysutils, { Para manejar excepciones. }
  11.       allegro5,al5image;
  12.      
  13.     //clase jugador----------------------------------
  14.     type
  15.       Tjugador = class
  16.         strict private
  17.          imagen: ALLEGRO_BITMAPptr;
  18.          estado_de_teclas: ALLEGRO_KEYBOARD_STATE;
  19.          x,y: real;
  20.         public
  21.           constructor Create();
  22.         { Este método es el que carga la imagen. }
  23.           function CargaImagen (const aNombreArchivo: String): Boolean;
  24.           procedure pintar();
  25.           procedure mover();
  26.           destructor Destroy(); override;
  27.       end;
  28.      
  29.       constructor Tjugador.Create();
  30.       begin
  31.         imagen := Nil; { <-- Dejar claro que NO existe la imagen. }
  32.         x := 320;
  33.         y := 240;
  34.       end;
  35.  
  36.  
  37.  
  38.   (* Carga la imagen dada. *)
  39.       function TJugador.CargaImagen (const aNombreArchivo: String): Boolean;
  40.       begin
  41.       { Primero:  si existe una imagen anterior, elimínala. }
  42.         if Assigned (Self.imagen) then al_destroy_image (Self.imagen);
  43.       { Ahora, carga la imagen. }
  44.         Self.imagen := al_load_bitmap (aNombreArchivo);
  45.         Result := Assigned (Self.imagen)
  46.       end;
  47.  
  48.  
  49.      
  50.       procedure Tjugador.pintar();
  51.       begin
  52.         //pintamos imagen(imagen,x,y,voltear)
  53.         al_draw_bitmap(imagen,x,y,0);
  54.       end;
  55.      
  56.       procedure Tjugador.mover();
  57.       begin
  58.         al_get_keyboard_state(estado_de_teclas);
  59.         if(al_key_down(estado_de_teclas,ALLEGRO_KEY_LEFT)) then
  60.         begin
  61.           x := x - 5;
  62.         end
  63.         else if(al_key_down(estado_de_teclas,ALLEGRO_KEY_RIGHT)) then
  64.         begin
  65.           x := x + 5;
  66.         end;
  67.      
  68.         if(al_key_down(estado_de_teclas,ALLEGRO_KEY_UP)) then
  69.         begin
  70.           y := y - 5;
  71.         end
  72.         else if(al_key_down(estado_de_teclas,ALLEGRO_KEY_DOWN)) then
  73.         begin
  74.           y := y + 5;
  75.         end;
  76.       end;
  77.      
  78.       destructor Tjugador.Destroy();
  79.       begin
  80.         al_destroy_bitmap(imagen);
  81.         imagen := nil;
  82.       end;
  83.     //fin clase jugador---------------------------------
  84.      
  85.     var
  86.       ventana: ALLEGRO_DISPLAYptr = nil;
  87.       evento: ALLEGRO_EVENT;
  88.       cola_de_eventos: ALLEGRO_EVENT_QUEUEptr = nil;
  89.       tiempo: ALLEGRO_TIMERptr = nil;
  90.       ejecutar: Boolean;
  91.       jugador: Tjugador;
  92.      
  93.     begin
  94.      
  95.       //iniciar allegro
  96.       al_init();
  97.       //instalar teclado
  98.       al_install_keyboard();
  99.       //iniciar imagen
  100.       al_init_image_addon();
  101.      
  102.       //configurar ventana en modo ventana
  103.       al_set_new_display_flags(ALLEGRO_WINDOWED);
  104.       //crear ventana(ancho,alto)
  105.       ventana := al_create_display(640,480);
  106.      
  107.       //poner titulo a la ventana
  108.       al_set_window_title(ventana,'objeto jugador');
  109.      
  110.       //ocultar raton
  111.       al_hide_mouse_cursor(ventana);
  112.      
  113.       //crear cola de eventos
  114.       cola_de_eventos := al_create_event_queue();
  115.      
  116.       //crear tiempo para fps
  117.       tiempo := al_create_timer(1/60);
  118.      
  119.       //registrar eventos
  120.       al_register_event_source(cola_de_eventos,al_get_keyboard_event_source());
  121.       al_register_event_source(cola_de_eventos,al_get_display_event_source(ventana));
  122.       al_register_event_source(cola_de_eventos,al_get_timer_event_source(tiempo));
  123.      
  124.       //inicio de variables
  125.       ejecutar := true;
  126.     { Crea el jugador. }
  127.       jugador := Tjugador.Create();
  128.     { Carga la imagen del jugador. }
  129.       if not jugador.CargaImagen ('alien.png') then
  130.       begin
  131.       { CERRAR EL CONTEXTO GRÁFICO para que muestre el error. }
  132.         al_destroy_display (ventana);
  133.       {  Lanza una excepción.  Deberías capturarla, pero así está bien porque
  134.           mostrará una ventana de error explicando lo que pasa. }
  135.         raise exception ('No pudo cargarse el archivo "alien.png"')
  136.        end;
  137.      
  138.       //iniciamos el tiempo
  139.       al_start_timer(tiempo);
  140.       while (ejecutar = true) do
  141.       begin
  142.      
  143.         //esperamos a la cola de eventos
  144.         al_wait_for_event(cola_de_eventos,@evento);
  145.         case evento.ftype of
  146.           //manejo de fps
  147.           ALLEGRO_EVENT_TIMER: begin
  148.             //limpiar pantalla con un color cualquiera
  149.             al_clear_to_color(al_map_rgb(0,0,160));
  150.      
  151.             jugador.mover();
  152.             jugador.pintar();
  153.      
  154.             //actualizar pantalla
  155.             al_flip_display();
  156.           end;
  157.           //si pulso escape salgo del bucle
  158.           ALLEGRO_EVENT_KEY_DOWN: begin
  159.             if (evento.keyboard.keycode = ALLEGRO_KEY_ESCAPE) then
  160.             begin
  161.               ejecutar := false;
  162.             end;
  163.           end;
  164.         end; //fin case
  165.      
  166.       end; //fin bucle while
  167.      
  168.       al_destroy_display(ventana); //destruir ventana
  169.       ventana := nil;
  170.       al_destroy_event_queue(cola_de_eventos); //destruir cola
  171.       cola_de_eventos := nil;
  172.       al_destroy_timer(tiempo); //destruir tiempo
  173.       tiempo := nil;
  174.       al_uninstall_keyboard(); //desinstalar teclado
  175.       jugador.Free(); //liberar jugador
  176.       jugador := nil
  177.      
  178.     end. //fin programa
  179.  

También deberías comprobar que se han creado los elementos (ventana, cola de eventos, etc.) incluso aunque es muy poco probable que fallen, pero pueden fallar.
Are you interested in game programming? Join the Pascal Game Development community!
Also visit the Game Development Portal

zelda16bit

  • Full Member
  • ***
  • Posts: 118
Re: ayuda sobre la creacion de objetos con freepascal y allegro5
« Reply #4 on: December 30, 2021, 04:57:20 pm »
Gracias por la ayuda Ñuño_Martínez. :)

 

TinyPortal © 2005-2018