Forum > Spanish
ayuda sobre la creacion de objetos con freepascal y allegro5
(1/1)
zelda16bit:
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 [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---{$mode objfpc} {$H+}program alegro8; (* allegro5 -> biblioteca alegro al5image -> biblioteca para imagenes*) uses allegro5,al5image; //clase jugador----------------------------------type Tjugador = class strict private imagen: ALLEGRO_BITMAPptr; estado_de_teclas: ALLEGRO_KEYBOARD_STATE; x,y: real; public constructor Create(); procedure pintar(); procedure mover(); destructor Destroy(); override; end; constructor Tjugador.Create(); begin imagen := al_load_bitmap('alien.png'); x := 320; y := 240; end; procedure Tjugador.pintar(); begin //pintamos imagen(imagen,x,y,voltear) al_draw_bitmap(imagen,x,y,0); end; procedure Tjugador.mover(); begin al_get_keyboard_state(estado_de_teclas); if(al_key_down(estado_de_teclas,ALLEGRO_KEY_LEFT)) then begin x := x - 5; end else if(al_key_down(estado_de_teclas,ALLEGRO_KEY_RIGHT)) then begin x := x + 5; end; if(al_key_down(estado_de_teclas,ALLEGRO_KEY_UP)) then begin y := y - 5; end else if(al_key_down(estado_de_teclas,ALLEGRO_KEY_DOWN)) then begin y := y + 5; end; end; destructor Tjugador.Destroy(); begin al_destroy_bitmap(imagen); imagen := nil; end;//fin clase jugador--------------------------------- var ventana: ALLEGRO_DISPLAYptr = nil; evento: ALLEGRO_EVENT; cola_de_eventos: ALLEGRO_EVENT_QUEUEptr = nil; tiempo: ALLEGRO_TIMERptr = nil; ejecutar: Boolean; jugador: Tjugador; begin //iniciar allegro al_init(); //instalar teclado al_install_keyboard(); //iniciar imagen al_init_image_addon(); //configurar ventana en modo ventana al_set_new_display_flags(ALLEGRO_WINDOWED); //crear ventana(ancho,alto) ventana := al_create_display(640,480); //poner titulo a la ventana al_set_window_title(ventana,'objeto jugador'); //ocultar raton al_hide_mouse_cursor(ventana); //crear cola de eventos cola_de_eventos := al_create_event_queue(); //crear tiempo para fps tiempo := al_create_timer(1/60); //registrar eventos al_register_event_source(cola_de_eventos,al_get_keyboard_event_source()); al_register_event_source(cola_de_eventos,al_get_display_event_source(ventana)); al_register_event_source(cola_de_eventos,al_get_timer_event_source(tiempo)); //inicio de variables ejecutar := true; jugador := Tjugador.Create(); //iniciamos el tiempo al_start_timer(tiempo); while (ejecutar = true) do begin //esperamos a la cola de eventos al_wait_for_event(cola_de_eventos,@evento); case evento.ftype of //manejo de fps ALLEGRO_EVENT_TIMER: begin //limpiar pantalla con un color cualquiera al_clear_to_color(al_map_rgb(0,0,160)); jugador.mover(); jugador.pintar(); //actualizar pantalla al_flip_display(); end; //si pulso escape salgo del bucle ALLEGRO_EVENT_KEY_DOWN: begin if (evento.keyboard.keycode = ALLEGRO_KEY_ESCAPE) then begin ejecutar := false; end; end; end; //fin case end; //fin bucle while al_destroy_display(ventana); //destruir ventana ventana := nil; al_destroy_event_queue(cola_de_eventos); //destruir cola cola_de_eventos := nil; al_destroy_timer(tiempo); //destruir tiempo tiempo := nil; al_uninstall_keyboard(); //desinstalar teclado jugador.Free(); //liberar jugador jugador := nil end. //fin programa
BlueIcaro:
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:
--- Quote from: BlueIcaro 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
--- End quote ---
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:
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 [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} --- {$mode objfpc} {$H+} program alegro8; (* allegro5 -> biblioteca alegro al5image -> biblioteca para imagenes *) uses sysutils, { Para manejar excepciones. } allegro5,al5image; //clase jugador---------------------------------- type Tjugador = class strict private imagen: ALLEGRO_BITMAPptr; estado_de_teclas: ALLEGRO_KEYBOARD_STATE; x,y: real; public constructor Create(); { Este método es el que carga la imagen. } function CargaImagen (const aNombreArchivo: String): Boolean; procedure pintar(); procedure mover(); destructor Destroy(); override; end; constructor Tjugador.Create(); begin imagen := Nil; { <-- Dejar claro que NO existe la imagen. } x := 320; y := 240; end; (* Carga la imagen dada. *) function TJugador.CargaImagen (const aNombreArchivo: String): Boolean; begin { Primero: si existe una imagen anterior, elimínala. } if Assigned (Self.imagen) then al_destroy_image (Self.imagen); { Ahora, carga la imagen. } Self.imagen := al_load_bitmap (aNombreArchivo); Result := Assigned (Self.imagen) end; procedure Tjugador.pintar(); begin //pintamos imagen(imagen,x,y,voltear) al_draw_bitmap(imagen,x,y,0); end; procedure Tjugador.mover(); begin al_get_keyboard_state(estado_de_teclas); if(al_key_down(estado_de_teclas,ALLEGRO_KEY_LEFT)) then begin x := x - 5; end else if(al_key_down(estado_de_teclas,ALLEGRO_KEY_RIGHT)) then begin x := x + 5; end; if(al_key_down(estado_de_teclas,ALLEGRO_KEY_UP)) then begin y := y - 5; end else if(al_key_down(estado_de_teclas,ALLEGRO_KEY_DOWN)) then begin y := y + 5; end; end; destructor Tjugador.Destroy(); begin al_destroy_bitmap(imagen); imagen := nil; end; //fin clase jugador--------------------------------- var ventana: ALLEGRO_DISPLAYptr = nil; evento: ALLEGRO_EVENT; cola_de_eventos: ALLEGRO_EVENT_QUEUEptr = nil; tiempo: ALLEGRO_TIMERptr = nil; ejecutar: Boolean; jugador: Tjugador; begin //iniciar allegro al_init(); //instalar teclado al_install_keyboard(); //iniciar imagen al_init_image_addon(); //configurar ventana en modo ventana al_set_new_display_flags(ALLEGRO_WINDOWED); //crear ventana(ancho,alto) ventana := al_create_display(640,480); //poner titulo a la ventana al_set_window_title(ventana,'objeto jugador'); //ocultar raton al_hide_mouse_cursor(ventana); //crear cola de eventos cola_de_eventos := al_create_event_queue(); //crear tiempo para fps tiempo := al_create_timer(1/60); //registrar eventos al_register_event_source(cola_de_eventos,al_get_keyboard_event_source()); al_register_event_source(cola_de_eventos,al_get_display_event_source(ventana)); al_register_event_source(cola_de_eventos,al_get_timer_event_source(tiempo)); //inicio de variables ejecutar := true; { Crea el jugador. } jugador := Tjugador.Create(); { Carga la imagen del jugador. } if not jugador.CargaImagen ('alien.png') then begin { CERRAR EL CONTEXTO GRÁFICO para que muestre el error. } al_destroy_display (ventana); { Lanza una excepción. Deberías capturarla, pero así está bien porque mostrará una ventana de error explicando lo que pasa. } raise exception ('No pudo cargarse el archivo "alien.png"') end; //iniciamos el tiempo al_start_timer(tiempo); while (ejecutar = true) do begin //esperamos a la cola de eventos al_wait_for_event(cola_de_eventos,@evento); case evento.ftype of //manejo de fps ALLEGRO_EVENT_TIMER: begin //limpiar pantalla con un color cualquiera al_clear_to_color(al_map_rgb(0,0,160)); jugador.mover(); jugador.pintar(); //actualizar pantalla al_flip_display(); end; //si pulso escape salgo del bucle ALLEGRO_EVENT_KEY_DOWN: begin if (evento.keyboard.keycode = ALLEGRO_KEY_ESCAPE) then begin ejecutar := false; end; end; end; //fin case end; //fin bucle while al_destroy_display(ventana); //destruir ventana ventana := nil; al_destroy_event_queue(cola_de_eventos); //destruir cola cola_de_eventos := nil; al_destroy_timer(tiempo); //destruir tiempo tiempo := nil; al_uninstall_keyboard(); //desinstalar teclado jugador.Free(); //liberar jugador jugador := nil end. //fin programa
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.
zelda16bit:
Gracias por la ayuda Ñuño_Martínez. :)
Navigation
[0] Message Index