Forum > Spanish

como se usan las transformaciones con allegro 5

<< < (2/3) > >>

Ñuño_Martínez:
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...).


--- Quote from: zelda16bit 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.
--- End quote ---

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.

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

--- End code ---

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: --- al_draw_bitmap(imagen, -25, -37.5, 0);        //25 y 37 son la mitad de la altura y del ancho de mi imagen     

--- End code ---

Te dejo el código modificado.
Saludos
/BlueIcaro

--- Code: ---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

--- End code ---


zelda16bit:
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:

--- Quote from: zelda16bit 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.

--- End quote ---

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

Navigation

[0] Message Index

[#] Next page

[*] Previous page

Go to full version