El siguiente código que uso es para mover el angulo de la imagen de mi personaje hasta que mire a la posición del ratón, pero es demasiado rápido el giro a veces, ya que puede mirar de una punta a otra de forma muy rápida.

image_angle = point_direction(mouse_x,mouse_y,obj_player.x,obj_player.y);

Cómo podría conseguir un efecto de deslizamiento de la imagen del personaje hasta el punto a dirigirse?

Es decir si el mouse esta en una zona que la imagen del personaje vaya girandose lentamente hasta estar dirigiendose al angulo del mouse.

#1 Abril 17, 2015, 07:43:27 PM Ultima modificación: Abril 17, 2015, 07:51:09 PM por penumbra
Cita de: king195 en Abril 17, 2015, 07:01:01 PM
Cómo podría conseguir un efecto de deslizamiento de la imagen del personaje hasta el punto a dirigirse?
Te dejo un enunciado que podría darte una pista

"Si el ángulo del sprite del personaje es distinto al ángulo personaje-puntero"
{
     "sumar (o restar) un grado (o un valor pequeño) al ángulo del personaje"
}

Cita de: penumbra en Abril 17, 2015, 07:43:27 PM
Cita de: king195 en Abril 17, 2015, 07:01:01 PM
Cómo podría conseguir un efecto de deslizamiento de la imagen del personaje hasta el punto a dirigirse?
Te dejo un enunciado que podría darte una pista

"Si el ángulo del sprite del personaje es distinto al ángulo personaje-puntero"
{
     "sumar (o restar) un grado (o un valor pequeño) al ángulo del personaje"
}

Si, hasta el no es igual image_angle al point_direction que he especificado antes llego.
Para poner la sintaxis de suma o resta de los grados es lo que no tengo claro(es decir la acción a ejecutar)

x+=1  con eso aumentarias en 1 el valor de x

Lo primero que necesitas es una rapidez angular para indicar qué tan rápido debe ajustarse a los cambios de ángulo
[gml]ra = 5; //rapidez angular[/gml]
Después se necesita saber la diferencia entre el ángulo actual y el ángulo final, pero esa diferencia debe estar en el intervalo (-180,180] para no hacer giros más largos de lo necesario. Ese valor se obtiene así
[gml]
pd = point_direction( mouse_x,mouse_y, obj_player.x,obj_player.y )
da = angle_difference( image_angle, pd  ); //diferencia de ángulo
[/gml]
Ahora conociendo el signo de la diferencia de ángulos sabemos si se debe restar o sumar la rapidez ángular, pero se debe hacer sólo cuando la diferencia de ángulo es un intervalo más pequeño que la rapidez angular
[gml]
if( da < -ra ) //caso negativo
    image_angle -= ra;
else image_angle -= da;
if( da > ra ) //caso positivo
    image_angle += ra;
else image_angle += da;
[/gml]

En el manual, en la descripción de la función angle_difference, aparece el mismo algoritmo pero reducido
[gml]
var pd = point_direction(x, y, mouse_x, mouse_y);
var dd = angle_difference(image_angle, pd);
image_angle += min(abs(dd), 10) * sign(dd);
[/gml]
ahí el número 10 es la rapidez angular.

Cita de: Clamud en Abril 18, 2015, 03:13:14 PM
Lo primero que necesitas es una rapidez angular para indicar qué tan rápido debe ajustarse a los cambios de ángulo
[gml]ra = 5; //rapidez angular[/gml]
Después se necesita saber la diferencia entre el ángulo actual y el ángulo final, pero esa diferencia debe estar en el intervalo (-180,180] para no hacer giros más largos de lo necesario. Ese valor se obtiene así
[gml]
pd = point_direction( mouse_x,mouse_y, obj_player.x,obj_player.y )
da = angle_difference( image_angle, pd  ); //diferencia de ángulo
[/gml]
Ahora conociendo el signo de la diferencia de ángulos sabemos si se debe restar o sumar la rapidez ángular, pero se debe hacer sólo cuando la diferencia de ángulo es un intervalo más pequeño que la rapidez angular
[gml]
if( da < -ra ) //caso negativo
    image_angle -= ra;
else image_angle -= da;
if( da > ra ) //caso positivo
    image_angle += ra;
else image_angle += da;
[/gml]

En el manual, en la descripción de la función angle_difference, aparece el mismo algoritmo pero reducido
[gml]
var pd = point_direction(x, y, mouse_x, mouse_y);
var dd = angle_difference(image_angle, pd);
image_angle += min(abs(dd), 10) * sign(dd);
[/gml]
ahí el número 10 es la rapidez angular.

Gracias, la función angle_difference es lo que estaba buscando ya que sin eso nunca iba a funcionar correctamente el sumar o restar angulos ya que sólo podría hacer una de dos.