Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: empardopo en Septiembre 05, 2018, 08:40:29 PM

Título: Rotación de un objeto (Solucionado)
Publicado por: empardopo en Septiembre 05, 2018, 08:40:29 PM
 :GMS:

Buenas,

he hecho una pregunta sobre rotación sobre el eje X pero lo mismo es demasiado complicada porque por más que busco no encuentro ningún sitio donde den una solución, jeje.

Mientras tanto y como solución alternativa voy a poner que el objeto gire sobre su centro con image_angle.

El tema es que estoy usando una variable llamada rotacion que primero contiene false; cuando el ratón se pone encima del objeto se pone a true y en el evento step controlo que empieze a girar.
Luego quiero que cuando quite el ratón de encima del objeto el objeto gire hasta la posición inicial pero no lo consigo ya que conforme quito el ratón de encima sólo he conseguido que bien se pare o bien llevarlo a capón a la posición inicial y queda como un tirón (no sé si me explico).

Gracias por anticipado
Título: Re:Rotación de un objeto
Publicado por: Hezz en Septiembre 06, 2018, 03:10:22 AM
Hola empardopo! Si tu variable cambia a true cuando tu mouse toca al objeto y cambia a false cuando deja de tocarlo, podés intentar esto:


En el evento step:
[gml]if (rotacion == false && image_angle != 0) {
    image_angle++;
}[/gml]

Esto detecta si tu variable rotacion es igual a false y si el ángulo no es igual a 0, entonces sigue girando la imagen en 1º por step hasta que llegue a 0.


Step:
[gml]if (rotacion == false && image_angle != 0 && image_angle < 180){
    image_angle--;
}
else if (rotacion == false && image_angle != 0 && image_angle >= 180){
    image_angle++;
}[/gml]

Esto lo que hace es lo mismo a lo anterior, pero si el ángulo de tu imagen es menor a 180, le resta 1º hasta llegar a 0. En cambio, si es igual o mayor a 180, entonces le suma 1º.


Tené en cuenta que si el ángulo supera los 360º no vuelve a 0, sigue aumentando y esto puede traerte problemas. Para solucionarlo, poné esto en el evento step:
[gml]if (image_angle >= 360) {image_angle = 0;}[/gml]

Esto detecta si el ángulo de tu imagen es mayor o igual a 360, le va poner en 0.


El primer efecto respeta el sentido de giro del objeto (en este caso anti-horario) y no importa la circunstancias, al cambiar la variable a false éste sigue girando en el sentido de giro anti-horario hasta llegar a 0.
En el segundo efecto toma el camino más corto. Si la variable cambia a false antes de los 180, el objeto vuelve hacia atras (gira en sentido horario), y si cambia después de los 180 gira de forma normal (anti-horario).
No sé si me explico bien, por lo que te dejo una imagen para que lo veas mejor.
(http://www.subirimagenes.com/imagedata.php?url=http://s2.subirimagenes.com/imagen/9863789efectos.png)
Título: Re:Rotación de un objeto
Publicado por: empardopo en Septiembre 06, 2018, 08:47:09 AM
Lo pruebo ahora despues a ver cuando tenga el proyecto en el equipo pero intentando examinar el código me asalta la duda de si mi objeto girará cuando rotacion sea false o true?

El código a poner sería todo completo?
if (rotacion == false && image_angle != 0) {
    image_angle++;
}

if (rotacion == false && image_angle != 0 && image_angle < 180){
    image_angle--;
}
else if (rotacion == false && image_angle != 0 && image_angle >= 180){
    image_angle++;
}

if (image_angle >= 360) {image_angle = 0;}


Muchas gracias
Título: Re:Rotación de un objeto
Publicado por: empardopo en Septiembre 06, 2018, 01:34:52 PM
Cita de: Hezz en Septiembre 06, 2018, 03:10:22 AM
Hola empardopo! Si tu variable cambia a true cuando tu mouse toca al objeto y cambia a false cuando deja de tocarlo, podés intentar esto:


En el evento step:
if (rotacion == false && image_angle != 0) {
    image_angle++;
}


Esto detecta si tu variable rotacion es igual a false y si el ángulo no es igual a 0, entonces sigue girando la imagen en 1º por step hasta que llegue a 0.


Step:
if (rotacion == false && image_angle != 0 && image_angle < 180){
    image_angle--;
}
else if (rotacion == false && image_angle != 0 && image_angle >= 180){
    image_angle++;
}


Esto lo que hace es lo mismo a lo anterior, pero si el ángulo de tu imagen es menor a 180, le resta 1º hasta llegar a 0. En cambio, si es igual o mayor a 180, entonces le suma 1º.


Tené en cuenta que si el ángulo supera los 360º no vuelve a 0, sigue aumentando y esto puede traerte problemas. Para solucionarlo, poné esto en el evento step:
if (image_angle >= 360) {image_angle = 0;}

Esto detecta si el ángulo de tu imagen es mayor o igual a 360, le va poner en 0.


El primer efecto respeta el sentido de giro del objeto (en este caso anti-horario) y no importa la circunstancias, al cambiar la variable a false éste sigue girando en el sentido de giro anti-horario hasta llegar a 0.
En el segundo efecto toma el camino más corto. Si la variable cambia a false antes de los 180, el objeto vuelve hacia atras (gira en sentido horario), y si cambia después de los 180 gira de forma normal (anti-horario).
No sé si me explico bien, por lo que te dejo una imagen para que lo veas mejor.
(http://www.subirimagenes.com/imagedata.php?url=http://s2.subirimagenes.com/imagen/9863789efectos.png)

Compi, al final he probado tu código y nada no conseguía ni siquiera que se moviese mi objeto.
Al final, ya he conseguido hacer lo que quería sin que haya ningún salto.
En los eventos de poner el ratón encima y luego quitarlo simplemente les doy el valor de rotacion = true y false respectivamente y luego en el step pongo el siguiente código:


if (rotacion){
    image_angle ++;
    if (image_angle >= 360){
            image_angle = 0;
        }
} else {
    if (image_angle != 0) {
        image_angle ++;
        if (image_angle >= 360){
            image_angle = 0;
        }
    }   
}


Con esto me funciona si dejo el ratón encima del objeto durante un par de vueltas y luego lo quito, no pega el salto ni se para sino que sigue girando hasta que nuevamente llega a 360 grados pasando a 0. Igualmente si no habia llegado a dar una vuelta completa cuando quito el ratón funciona igualmente llegando hasta el final y así no se queda el objeto girado ni tampoco hay un salto brusco para dejarlo en la posición inicial.

Muchas gracias.