Recent

Author Topic: como se usan las transformaciones con allegro 5  (Read 10338 times)

zelda16bit

  • Full Member
  • ***
  • Posts: 118
como se usan las transformaciones con allegro 5
« on: December 16, 2021, 10:15:43 pm »
Abro este hilo para ir haciendo preguntas en general sobre programacion de juegos con allegro 5,no se si es correcto ir haciendo todas las preguntas en un solo hilo y por eso si no esta bien pues decidmelo.

La primera pregunta es sobre al_rotate_transform,como ya he comentado en otro hilo no consigo que la imagen rote sobre si mismo,voy a poner el codigo con el que estoy haciendo algunas pruebas con esto y otras cosas,haber que es lo que estoy haciendo mal.

Code: Pascal  [Select][+][-]
  1. program alegro7;
  2.  
  3. (*
  4.   allegro5 -> biblioteca alegro
  5.   al5image -> biblioteca para imagenes
  6. *)
  7.  
  8. uses
  9.   allegro5,al5image;
  10.  
  11. var
  12.   ventana: ALLEGRO_DISPLAYptr = nil;
  13.   evento: ALLEGRO_EVENT;
  14.   cola_de_eventos: ALLEGRO_EVENT_QUEUEptr = nil;
  15.   tiempo: ALLEGRO_TIMERptr = nil;
  16.   imagen: ALLEGRO_BITMAPptr = nil;
  17.   transformacion: ALLEGRO_TRANSFORM;
  18.   ejecutar: Boolean;
  19.   posicionX,posicionY: Single;
  20.  
  21. begin
  22.  
  23.   //iniciar allegro
  24.   al_init();
  25.   //instalar teclado
  26.   al_install_keyboard();
  27.   //iniciar imagen
  28.   al_init_image_addon();
  29.  
  30.   //configurar ventana en modo ventana
  31.   al_set_new_display_flags(ALLEGRO_WINDOWED);
  32.   //crear ventana(ancho,alto)
  33.   ventana := al_create_display(640,480);
  34.  
  35.   //poner titulo a la ventana
  36.   al_set_window_title(ventana,'transformaciones');
  37.  
  38.   //ocultar raton
  39.   al_hide_mouse_cursor(ventana);
  40.  
  41.   //crear cola de eventos
  42.   cola_de_eventos := al_create_event_queue();
  43.  
  44.   //crear tiempo para fps
  45.   tiempo := al_create_timer(1/60);
  46.  
  47.   //cargamos imagen
  48.   imagen := al_load_bitmap('alien.png');
  49.  
  50.   //registrar eventos
  51.   al_register_event_source(cola_de_eventos,al_get_keyboard_event_source());
  52.   al_register_event_source(cola_de_eventos,al_get_display_event_source(ventana));
  53.   al_register_event_source(cola_de_eventos,al_get_timer_event_source(tiempo));
  54.  
  55.   //inicio de variables
  56.   ejecutar := true;
  57.   posicionX := 150;
  58.   posicionY := 50;
  59.  
  60.   //iniciamos el tiempo
  61.   al_start_timer(tiempo);
  62.   while (ejecutar = true) do
  63.   begin
  64.  
  65.     //esperamos a la cola de eventos
  66.     al_wait_for_event(cola_de_eventos,@evento);
  67.     case evento.ftype of
  68.       //manejo de fps
  69.       ALLEGRO_EVENT_TIMER: begin
  70.         //limpiar pantalla con un color cualquiera
  71.         al_clear_to_color(al_map_rgb(0,0,160));
  72.  
  73.         //transformacion por aceleraccion
  74.         al_identity_transform(transformacion);
  75.         al_scale_transform(transformacion,1.5,1.5);
  76.         al_rotate_transform(transformacion,al_get_time/5);
  77.         al_translate_transform(transformacion,posicionY,posicionY);
  78.         al_use_transform(transformacion);
  79.  
  80.         //pintamos imagen(imagen,x,y,voltear)
  81.         al_draw_bitmap(imagen,posicionX,posicionY,0);
  82.         posicionY += 0.5;
  83.  
  84.         //actualizar pantalla
  85.         al_flip_display();
  86.       end;
  87.       //mover imagen
  88.       ALLEGRO_EVENT_KEY_CHAR: begin
  89.         if (evento.keyboard.unichar = ord('a')) then
  90.           posicionX := posicionX - 3
  91.         else if (evento.keyboard.unichar = ord('d')) then
  92.           posicionX := posicionX + 3;
  93.       end;
  94.       //si pulso escape salgo del bucle
  95.       ALLEGRO_EVENT_KEY_DOWN: begin
  96.         if (evento.keyboard.keycode = ALLEGRO_KEY_ESCAPE) then
  97.         begin
  98.           ejecutar := false;
  99.         end;
  100.       end;
  101.       ALLEGRO_EVENT_KEY_UP: begin
  102.         if(evento.keyboard.keycode = ALLEGRO_KEY_Z) then
  103.           al_stop_timer(tiempo) //parar timer
  104.         else if(evento.keyboard.keycode = ALLEGRO_KEY_X) then
  105.           al_resume_timer(tiempo) //activar timer
  106.         else if(evento.keyboard.keycode = ALLEGRO_KEY_C) then
  107.           al_set_timer_speed(tiempo,1/15) //poner velocidad
  108.         else if(evento.keyboard.keycode = ALLEGRO_KEY_V) then
  109.           al_set_timer_speed(tiempo,1/60);
  110.       end;
  111.     end; //fin case
  112.  
  113.   end; //fin bucle while
  114.  
  115.   al_destroy_display(ventana); //destruir ventana
  116.   ventana := nil;
  117.   al_destroy_event_queue(cola_de_eventos); //destruir cola
  118.   cola_de_eventos := nil;
  119.   al_destroy_bitmap(imagen); //destruir imagen
  120.   imagen := nil;
  121.   al_destroy_timer(tiempo); //destruir tiempo
  122.   tiempo := nil;
  123.   al_uninstall_keyboard(); //desinstalar teclado
  124.  
  125. end. //fin programa
  126.  

Si aparte de al_rotate_transform hay algo que tambien este mal hecho decidmelo.Un saludo
« Last Edit: December 21, 2021, 11:21:06 pm by zelda16bit »

BlueIcaro

  • Hero Member
  • *****
  • Posts: 792
    • Blog personal
Re: Programacion de juegos con allegro 5
« Reply #1 on: December 19, 2021, 12:18:13 pm »
Hola, yo no soy un experto en esta librería, y en ninguna. Pero lo que veo es que tu dibujo está desplazado del origen. Por lo que veo está a 150,50. Entonces  si ejecutas una rotación, la rotación se produce sobre el origen de coordenadas del sistema activo. Eso es así en geometría. Por eso no rota sobre si mismo.

No sé como se podrá hacer en Allegro. Pero en los programas de diseño con los que trabajo. Se selecciona un origen de coordenadas que está sobre el pieza que quieres rotar (origen local).

Una solución podría ser, desplazar la pieza al origen de coordenadas (posición 0,0) rotarla, y devolverla a su posición original (150,0).

Ten en cuenta que no es lo mismo rotar y trasladar, que trasladar y rotar

Saludos

/BlueIcaro


zelda16bit

  • Full Member
  • ***
  • Posts: 118
Re: Programacion de juegos con allegro 5
« Reply #2 on: December 19, 2021, 08:23:18 pm »
Gracias por el consejo,pero no funciona.  :'(

BlueIcaro

  • Hero Member
  • *****
  • Posts: 792
    • Blog personal
Re: Programacion de juegos con allegro 5
« Reply #3 on: December 21, 2021, 09:19:51 am »
Gracias por el consejo,pero no funciona.  :'(

Hola, hiciste algún cambio en el programa?.
Saludos
/BlueIcaro

zelda16bit

  • Full Member
  • ***
  • Posts: 118
Re: Programacion de juegos con allegro 5
« Reply #4 on: December 21, 2021, 05:36:19 pm »
Ya lo he añadido al codigo.

He usado la funcion al_translate_transform(),primero lo pongo en la posicion (0,0) y luego lo pongo en la posicion de las variables,pero sigue sin funcionar.

Ñuño_Martínez

  • Hero Member
  • *****
  • Posts: 1186
    • Burdjia
Re: Programacion de juegos con allegro 5
« Reply #5 on: December 21, 2021, 10:00:46 pm »
Debería hacer pruebas porque nunca he usado las transformaciones con Allegro 5, pero hay algún detalle que comentarte.

Por ejemplo, prueba a usar al_build_transform, que reune todas las transformaciones en una, las hace en orden y es más rápida que llamar a las funciones en orden.

También puedes probar a cambiar el orden de las llamadas a:
  • Identidad
  • Escala
  • Rotación
  • Traslación

Además, puedes quitar la línea al_translate_transform(transformacion,0,0); ya que no hace absolutiamente nada.

Por último, usar al_get_time para obtener el ángulo me parece arriesgado.  Ten en cuenta que devuelve el número de segundos desde que Allegro se inicializó, y que las  funciones rotación esperan los ángulos en radianes (de 0 a 6.28318...).

Abro este hilo para ir haciendo preguntas en general sobre programacion de juegos con allegro 5,no se si es correcto ir haciendo todas las preguntas en un solo hilo y por eso si no esta bien pues decidmelo.

Mejor que cada hilo tenga una sola pregunta, con un título descriptivo.  Eso facilita las cosas a la hora de usar la búsqueda del foro.
Are you interested in game programming? Join the Pascal Game Development community!
Also visit the Game Development Portal

zelda16bit

  • Full Member
  • ***
  • Posts: 118
Re: como se usa al_transform con allegro 5
« Reply #6 on: December 21, 2021, 11:15:38 pm »
Gracias Ñuño por los consejos,he seguido el orden que comentas pero sigue sin funcionar.Lo voy a dejar parado de momento y voy a probar otras cosas con allegro.

BlueIcaro

  • Hero Member
  • *****
  • Posts: 792
    • Blog personal
Re: como se usan las transformaciones con allegro 5
« Reply #7 on: December 25, 2021, 09:15:46 pm »
Hola, ya conseguí que la imagen rotara sobre si misma.
Al cargar tú programa me di cuenta que las rotaciones se acumulaban. Ten en cuenta que cuando aplicas transformaciones, lo que consigues es trasladar el origen y cambiar la orientación del sistema de coordenadas, que de un principio está en la esquina superior de la pantalla y apunta hacia la derecha y abajo.
Las transformaciones se aplican desde el origen. Si lo cambias con una transformación ese es tu nuevo origen, y todos los cálculos se haces desde ahí. Así que lo primero, antes de hacer una nueva transformación es volver al origen

Code: [Select]
//Resetear las rotaciones para que no se acumulen
        al_identity_transform(identidad);
        al_use_transform(identidad);     

Al aplicar una transformación llamada identidad que nunca ha sido usada, esta vale 0 su rotación y traslación. Ten en cuenta que cada vez que aplicas una transformación, esta queda almacenada en la variables que has pasado al parámetro (bueno es un puntero que apunta una estructura, pero se entiende lo quiero decir).


Luego, al pintar la imagen, si pones 0,0 esta se pintará dónde has desplazado el origen, y con la orientación que has aplicado con las transformaciones. La imagen se empieza a dibujar desde su esquina superior izquierda. Así que no aplicas un desplazamiento para que el centro de tu imagen quede en el origen esta rotará desde su esquina superior. Te recomiendo que pongas los valores a 0 en esta línea y lo compruebes por ti mismo.
Code: [Select]
al_draw_bitmap(imagen, -25, -37.5, 0);        //25 y 37 son la mitad de la altura y del ancho de mi imagen     

Te dejo el código modificado.
Saludos
/BlueIcaro
Code: [Select]
program project1;

(*
  allegro5 -> biblioteca alegro
  al5image -> biblioteca para imagenes
*)

uses
  allegro5,
  al5image;

var
  ventana: ALLEGRO_DISPLAYptr = nil;
  evento: ALLEGRO_EVENT;
  cola_de_eventos: ALLEGRO_EVENT_QUEUEptr = nil;
  tiempo: ALLEGRO_TIMERptr = nil;
  imagen: ALLEGRO_BITMAPptr = nil;
  transformacion, identidad: ALLEGRO_TRANSFORM;
  ejecutar: boolean;
  posicionX, posicionY: single;

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, 'transformaciones');

  //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);

  //cargamos imagen
  imagen := al_load_bitmap('avion.png');

  //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;
  posicionX := 150;
  posicionY := 50;

  //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));
        //Resetear las rotaciones para que no se acumulen
        al_identity_transform(identidad);
        al_use_transform(identidad);

        //transformacion por aceleraccion

        al_identity_transform(transformacion);
        al_rotate_transform(transformacion, al_get_time / 5);
        al_scale_transform(transformacion, 1, 1);

        al_translate_transform(transformacion, 150, 150);
        al_use_transform(transformacion);

        //pintamos imagen(imagen,x,y,voltear)
        al_draw_bitmap(imagen, -25, -37.5, 0);
        //25 y 37 son la mitad de la altura y del ancho de mi imagen
        posicionY += 0.5;

        //actualizar pantalla
        al_flip_display();

      end;
      //mover imagen
      ALLEGRO_EVENT_KEY_CHAR: begin
        if (evento.keyboard.unichar = Ord('a')) then
          posicionX := posicionX - 3
        else if (evento.keyboard.unichar = Ord('d')) then
          posicionX := posicionX + 3;
      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;
      ALLEGRO_EVENT_KEY_UP: begin
        if (evento.keyboard.keycode = ALLEGRO_KEY_Z) then
          al_stop_timer(tiempo) //parar timer
        else if (evento.keyboard.keycode = ALLEGRO_KEY_X) then
          al_resume_timer(tiempo) //activar timer
        else if (evento.keyboard.keycode = ALLEGRO_KEY_C) then
          al_set_timer_speed(tiempo, 1 / 15) //poner velocidad
        else if (evento.keyboard.keycode = ALLEGRO_KEY_V) then
          al_set_timer_speed(tiempo, 1 / 60);
      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_bitmap(imagen); //destruir imagen
  imagen := nil;
  al_destroy_timer(tiempo); //destruir tiempo
  tiempo := nil;
  al_uninstall_keyboard(); //desinstalar teclado

end. //fin programa



zelda16bit

  • Full Member
  • ***
  • Posts: 118
Re: como se usan las transformaciones con allegro 5
« Reply #8 on: December 25, 2021, 11:16:33 pm »
Gracias por la ayuda BlueIcaro,sin ti no lo hubiera conseguido. ;)

Lo que no entiendo es porque pones el signo - en al_draw_bitmap(imagen, -25, -37.5, 0),si quito el signo - no funciona y no se porque.

BlueIcaro

  • Hero Member
  • *****
  • Posts: 792
    • Blog personal
Re: como se usan las transformaciones con allegro 5
« Reply #9 on: December 26, 2021, 05:49:30 pm »
Gracias por la ayuda BlueIcaro,sin ti no lo hubiera conseguido. ;)

Lo que no entiendo es porque pones el signo - en al_draw_bitmap(imagen, -25, -37.5, 0),si quito el signo - no funciona y no se porque.

Hola, al dibujar la imagen, esta se dibuja en el nuevo origen (fíjate que la posición es 0,0). Esto hace que al rotar gire por la esquina superior. Así que lo que hago es desplazar hacia el origen en x é y para que el centro de la imagen quede sobre el origen de coordenadas

Saludos
/BlueIcaro

zelda16bit

  • Full Member
  • ***
  • Posts: 118
Re: como se usan las transformaciones con allegro 5
« Reply #10 on: December 26, 2021, 06:33:52 pm »
Hola, al dibujar la imagen, esta se dibuja en el nuevo origen (fíjate que la posición es 0,0). Esto hace que al rotar gire por la esquina superior. Así que lo que hago es desplazar hacia el origen en x é y para que el centro de la imagen quede sobre el origen de coordenadas

Saludos
/BlueIcaro

Ya lo entiendo,gracias de nuevo. :)

 

TinyPortal © 2005-2018