Forum > Spanish
como se usan las transformaciones con allegro 5
Ñ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