Forum > Spanish

Como destruir un objeto del juego en allegro5

(1/5) > >>

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

Go to full version