Forum > Spanish
Como destruir un objeto del juego en allegro5
zelda16bit:
Hola. :)
Estaba mirando la documentacion de allegro5 y no veo ni funciones para destruir objetos ni para colisiones(no entiendo porque),entonces estoy utilizando una lista de objetos con generic.collection.
No he usado esto nunca en ningun caso practico y por ahora me funciona lo que estoy haciendo,pero hay algo que no funciona bien.Tengo activada la opcion de heaptrc que se lo vi usar a ÑUÑO en el tutorial de allegro y es para saber si se estan liberando correctamente los objetos creo,pero hay bloques de memoria que no se estan liberando y no se donde esta el error.
Voy a poner el codigo por si alguien quiere mirarlo,hay dos clases,una del disparo y otra del jugador donde se dispara y se añade el disparo a la lista.
--- 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 alegro10; (* allegro5 -> biblioteca alegro al5image -> biblioteca para imagenes Generics.Collections -> para usar listas*) uses allegro5,al5image,Udisparo; var lista_disparo: Tlista_disparo;//prototipo clase jugador-----------------------------type Tjugador = class strict private imagen: ALLEGRO_BITMAPptr; estado_de_teclas: ALLEGRO_KEYBOARD_STATE; x,y: real; contador: integer; //lista_disparo: Tlista_disparo; disparo,d: Tdisparo; public constructor Create(); procedure pintar(); procedure mover(); procedure disparar(); destructor Destroy(); override; end;//fin prototipo clase jugador------------------------- //implementacion clase jugador------------------------ constructor Tjugador.Create(); begin imagen := al_load_bitmap('nave.png'); x := 320; y := 240; lista_disparo := Tlista_disparo.Create(true); end; procedure Tjugador.pintar(); begin mover(); disparar(); //pintamos imagen(imagen,x,y,voltear) al_draw_bitmap(imagen,x,y,0); //recorrer lista disparo for d in lista_disparo do begin d.pintar(); if(d.y < 64) then //eliminar disparo lista_disparo.Extract(d); end; 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; procedure Tjugador.disparar(); begin al_get_keyboard_state(estado_de_teclas); contador := contador + 1; if (al_key_down(estado_de_teclas,ALLEGRO_KEY_Z)) and (contador > 10) then begin //crear disparo y añadir a la lista disparo := Tdisparo.Create(x+24,y); lista_disparo.Add(disparo); contador := 0; end; end; destructor Tjugador.Destroy(); begin al_destroy_bitmap(imagen); imagen := nil; lista_disparo.Free(); lista_disparo := nil; end;//fin implementacion 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); //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.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
--- 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";}};} ---unit Udisparo; {$Mode objfpc} {$H+} interface uses Allegro5,Generics.Collections; type//prototipo clase disparo----------------------------- Tdisparo = class strict private imagen: ALLEGRO_BITMAPptr; //x,y: real; public x,y: real; constructor Create(x1,y1: real); procedure pintar(); procedure mover(); destructor Destroy(); override; end; Tlista_disparo = specialize TObjectList<Tdisparo>;//fin prototipo clase disparo------------------------- implementation //implementacion clase disparo----------------------- constructor Tdisparo.Create(x1,y1: real); begin imagen := al_load_bitmap('estrella.png'); x := x1; y := y1; end; procedure Tdisparo.pintar(); begin mover(); al_draw_bitmap(imagen,x,y,0); end; procedure Tdisparo.mover(); begin y := y - 5; end; destructor Tdisparo.Destroy(); begin al_destroy_bitmap(imagen); imagen := nil; end;//fin implementacion clase disparo------------------- end.
Por cierto ÑUÑO,me tienes abandonado.No paro de hacer preguntas sobre allegro y no veo tus respuesta,reconozco que eso me desmotiva un poco. :'(
mosquito:
Para colisiones básicas uso la unidad types: https://www.freepascal.org/docs-html/rtl/types/index-5.html
zelda16bit:
--- Quote from: mosquito on December 28, 2021, 07:13:41 pm ---Para colisiones básicas uso la unidad types: https://www.freepascal.org/docs-html/rtl/types/index-5.html
--- End quote ---
Gracias por el enlace,aunque no hay ejemplos para saber como usar esas funciones.
Ñuño_Martínez:
--- Quote from: zelda16bit on December 28, 2021, 05:41:49 pm ---Hola. :)
Estaba mirando la documentacion de allegro5 y no veo ni funciones para destruir objetos ni para colisiones(no entiendo porque),entonces estoy utilizando una lista de objetos con generic.collection.
--- End quote ---
Allegro tiene funciones para destruir los objetos que crea. Ten en cuenta que Allegro está escrito en C y que Allegro.pas es sólo la "traducción" de las cabeceras, por lo que apenas contiene código específico para Pascal.
Por otro lado, lo de las colisiones. Allegro no es un motor, como Castle Engine, GameMaker, Godot o Unity, por eso no incluye funciones de colisión. La gestión de colisiones depende de muchos factores. Normalmente suelen calcularse las colisiones entre dos rectángulos.
Te dejo un enlace al método Collide que implementé para mi motor Mingro (la versión vieja, aunque la próxima será prácticamente la misma). Creo que es autoexplicativa, pero si necesitas ayuda, dibuja dos rectángulos en un papel en diferentes situaciones (colisión, no colisión, dentro de, fuera...) y seguro que te ayuda.
--- Quote from: zelda16bit on December 28, 2021, 05:41:49 pm ---Por cierto ÑUÑO,me tienes abandonado.No paro de hacer preguntas sobre allegro y no veo tus respuesta,reconozco que eso me desmotiva un poco. :'(
--- End quote ---
Ya lo siento, pero por mi trabajo apenas tengo tiempo libre. Pero ya ves que otras personas también ayudan, afortunadamente. :)
zelda16bit:
Hola Ñuño.
No encuentro esas funciones que comentas para destruir objetos,si puedes decirme cuales son y poner algun ejemplo de ello,aunque tambien me vendria bien que me dijeras como solucionar el problema que tengo con las listas de objetos en el ejemplo que he puesto en este hilo,no consigo ver donde estan los errores.
Navigation
[0] Message Index
[#] Next page