Forum > Spanish

como se usan las transformaciones con allegro 5

(1/3) > >>

zelda16bit:
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  [+][-]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";}};} ---program alegro7; (*  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: 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('alien.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));         //transformacion por aceleraccion        al_identity_transform(transformacion);        al_scale_transform(transformacion,1.5,1.5);        al_rotate_transform(transformacion,al_get_time/5);        al_translate_transform(transformacion,posicionY,posicionY);        al_use_transform(transformacion);         //pintamos imagen(imagen,x,y,voltear)        al_draw_bitmap(imagen,posicionX,posicionY,0);        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 
Si aparte de al_rotate_transform hay algo que tambien este mal hecho decidmelo.Un saludo

BlueIcaro:
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:
Gracias por el consejo,pero no funciona.  :'(

BlueIcaro:

--- Quote from: zelda16bit on December 19, 2021, 08:23:18 pm ---Gracias por el consejo,pero no funciona.  :'(

--- End quote ---

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

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

Navigation

[0] Message Index

[#] Next page

Go to full version