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