Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: empardopo en Septiembre 05, 2018, 11:52:56 AM

Título: Rotación de objeto sobre el eje X (Solucionado)
Publicado por: empardopo en Septiembre 05, 2018, 11:52:56 AM
 :GMS:

Buenas, estoy intentando hacer una rotación de un objeto pero sobre su eje X. He buscado info pero no encuentro como hacerlo.

He visto lo de ir aumentando image_angle pero no es eso lo que quiero hacer sino que rote únicamente sobre el eje X.

¿Alguna idea o ejemplo de como hacerlo?

Muchas gracias
Título: Re:Rotación de objeto sobre el eje X
Publicado por: BssString en Septiembre 05, 2018, 01:48:27 PM
Hola empardopo
Creo que buscas la función image_xscale.
Por defecto es 1, si le pones 2, el sprite se verá el doble de grande, si usas -1 el sprite se invierte horizontalmente.
Ojo que depende del origen del sprite

Saludos
Título: Re:Rotación de objeto sobre el eje X
Publicado por: empardopo en Septiembre 05, 2018, 08:01:24 PM
Cita de: BssString en Septiembre 05, 2018, 01:48:27 PM
Hola empardopo
Creo que buscas la función image_xscale.
Por defecto es 1, si le pones 2, el sprite se verá el doble de grande, si usas -1 el sprite se invierte horizontalmente.
Ojo que depende del origen del sprite

Saludos

A menos que me equivoque o que no sepa utilizarlo no veo como hacerlo así ...

Me refería a hacer una animación de 360 grados de un objeto que ponga en pantalla pero sobre su eje X; por ejemplo, pongo un objeto en pantalla y en el step pongo image_angle += 1; y me hace un giro de 360 grados pero no es ese el giro que me gustaría que hiciera el objeto sino sobre su eje X (no sé si me estoy explicando bien...).

Thanks
Título: Re:Rotación de objeto sobre el eje X
Publicado por: Marth en Septiembre 06, 2018, 12:46:15 AM
Cita de: empardopo en Septiembre 05, 2018, 08:01:24 PM
Cita de: BssString en Septiembre 05, 2018, 01:48:27 PM
Hola empardopo
Creo que buscas la función image_xscale.
Por defecto es 1, si le pones 2, el sprite se verá el doble de grande, si usas -1 el sprite se invierte horizontalmente.
Ojo que depende del origen del sprite

Saludos

A menos que me equivoque o que no sepa utilizarlo no veo como hacerlo así ...

Me refería a hacer una animación de 360 grados de un objeto que ponga en pantalla pero sobre su eje X; por ejemplo, pongo un objeto en pantalla y en el step pongo image_angle += 1; y me hace un giro de 360 grados pero no es ese el giro que me gustaría que hiciera el objeto sino sobre su eje X (no sé si me estoy explicando bien...).

Thanks

Cada sprite dispone de unas variables que indican el "origen" de un sprite.
Al alterar estas variables alteraras la posición "central" al rotar el sprite image_angle.
Título: Re:Rotación de objeto sobre el eje X
Publicado por: BssString en Septiembre 06, 2018, 02:18:15 AM
Hola empardopo

Lamentablemente no he entendido lo que intentas lograr.
Si haces al personaje en 3D quizás puedas realizar el giro que deseas xD

A mi lo único que se me ocurre es que al sprite le asignes como punto de origen su centro (en las propiedades del sprite).
Y lo hagas girar con el image_xscale.

El siguiente código crea el efecto de una rotación sencilla (con velocidad constante) mientras posas el mouse encima. La rotación se detiene cuando sacas el mouse de encima, pero para no dar un efecto de quiebre, el objeto continúa girando hasta que llega de nuevo al punto inicial.

CREATE EVENT:
angle = 0
rotacion = false


STEP EVENT:
rotacion = false
if instance_position(mouse_x,mouse_y,id) { rotacion = true }

if (rotacion) || (angle != 0) {
angle += 2*pi/room_speed
if angle >= 2*pi { angle = rotacion*(angle-2*pi) }
}


DRAW EVENT:
draw_sprite_ext(sprite_index,image_index,x,y,cos(angle),image_yscale,image_angle,c_white,image_alpha)

Fuera de eso no veo cuál es el efecto que quieres lograr, quizás si nos muestras alguna imagen pueda entenderlo mejor.

Saludos
Título: Re:Rotación de objeto sobre el eje X
Publicado por: empardopo en Septiembre 06, 2018, 08:49:25 AM
Intento probarlo a ver si funciona.
Muchas gracias
Título: Re:Rotación de objeto sobre el eje X
Publicado por: empardopo en Septiembre 06, 2018, 01:50:56 PM
Cita de: BssString en Septiembre 06, 2018, 02:18:15 AM
Hola empardopo

Lamentablemente no he entendido lo que intentas lograr.
Si haces al personaje en 3D quizás puedas realizar el giro que deseas xD

A mi lo único que se me ocurre es que al sprite le asignes como punto de origen su centro (en las propiedades del sprite).
Y lo hagas girar con el image_xscale.

El siguiente código crea el efecto de una rotación sencilla (con velocidad constante) mientras posas el mouse encima. La rotación se detiene cuando sacas el mouse de encima, pero para no dar un efecto de quiebre, el objeto continúa girando hasta que llega de nuevo al punto inicial.

CREATE EVENT:
angle = 0
rotacion = false


STEP EVENT:
rotacion = false
if instance_position(mouse_x,mouse_y,id) { rotacion = true }

if (rotacion) || (angle != 0) {
angle += 2*pi/room_speed
if angle >= 2*pi { angle = rotacion*(angle-2*pi) }
}


DRAW EVENT:
draw_sprite_ext(sprite_index,image_index,x,y,cos(angle),image_yscale,image_angle,c_white,image_alpha)

Fuera de eso no veo cuál es el efecto que quieres lograr, quizás si nos muestras alguna imagen pueda entenderlo mejor.

Saludos

Compi, cojonudo!!! Era eso lo que tenías ganas de hacer pero ahora tengo un pequeño problema que a lo mejor es mío, jeje!
Resulta que pongo el código pero no sé porqué, jajaja! Oye, algún sitio donde puede ver la teoría de porqué funciona el tema; supongo que es trigonometría pero si tienes algún link o algo donde lo explique y pueda llegar a entenderlo te lo agradecería bastante.

Por cierto, he aprendido que con este código que me ponías...

rotacion = false
if instance_position(mouse_x,mouse_y,id) { rotacion = true }


puedo quitar los dos eventos de ratón que estaba usando Mouse Enter y Mouse Leave porque con la función instance_position controlo lo mismo...

Muchas gracias!!!
Título: Re:Rotación de objeto sobre el eje X (Solucionado)
Publicado por: BssString en Septiembre 06, 2018, 04:19:43 PM
Hola empardopo

Exacto, el "instance_position" reemplaza el "mouse enter" y "mouse leave", pero ahora que reviso bien, el "instance_position" devuelve el ID del objeto.
Lo correcto era usar "position_meeting" que hace exactamente lo mismo, pero devuelve "true" o "false".

Respecto a tu consulta sobre trigonometría, no sé bien la teoría, lo siento, podrías buscar en google o youtube y quizás alguien lo explique bien.

Pero en la práctica, la función "cos(angulo en radianes)" te devuelve un valor entre -1 y 1 según el ángulo que le das.
cos(0°) = 1
cos(90°) = 0
cos(180°) = -1
cos(270°) = 0
Y así va oscilando entre en ese rango a medida que aumentas el ángulo. Siempre toma valores dentro del mismo rango
1 > 0 > -1 > 0 > 1 > 0 > -1
Como en Game Maker la función "cos" usa los ángulos en radianes, puedes usar "degtorad(angulo)" para convertir un ángulo normal a radianes, yo no he usado esa función antes porque en el código que te pasé usé directamente el ángulo en radianes, por eso se ve el "2*pi" todo raro entre medio.

Ese valor que recibes de la función "cos" entre -1 y 1 se lo he asignado a la image_xscale y eso es lo que hace el efecto, la imagen se achica hasta hacerse cero y luego crece invertida hasta llegar al tamaño original, luego se vuelve a achicar hasta cero y después se agranda pero en la posición correcta y así hasta el infinito xd pero visualmente da la falsa sensación de que el objeto está girando.

Saludos
Título: Re:Rotación de objeto sobre el eje X (Solucionado)
Publicado por: empardopo en Septiembre 06, 2018, 08:01:36 PM
Cita de: BssString en Septiembre 06, 2018, 04:19:43 PM
Hola empardopo

Exacto, el "instance_position" reemplaza el "mouse enter" y "mouse leave", pero ahora que reviso bien, el "instance_position" devuelve el ID del objeto.
Lo correcto era usar "position_meeting" que hace exactamente lo mismo, pero devuelve "true" o "false".

Respecto a tu consulta sobre trigonometría, no sé bien la teoría, lo siento, podrías buscar en google o youtube y quizás alguien lo explique bien.

Pero en la práctica, la función "cos(angulo en radianes)" te devuelve un valor entre -1 y 1 según el ángulo que le das.
cos(0°) = 1
cos(90°) = 0
cos(180°) = -1
cos(270°) = 0
Y así va oscilando entre en ese rango a medida que aumentas el ángulo. Siempre toma valores dentro del mismo rango
1 > 0 > -1 > 0 > 1 > 0 > -1
Como en Game Maker la función "cos" usa los ángulos en radianes, puedes usar "degtorad(angulo)" para convertir un ángulo normal a radianes, yo no he usado esa función antes porque en el código que te pasé usé directamente el ángulo en radianes, por eso se ve el "2*pi" todo raro entre medio.

Ese valor que recibes de la función "cos" entre -1 y 1 se lo he asignado a la image_xscale y eso es lo que hace el efecto, la imagen se achica hasta hacerse cero y luego crece invertida hasta llegar al tamaño original, luego se vuelve a achicar hasta cero y después se agranda pero en la posición correcta y así hasta el infinito xd pero visualmente da la falsa sensación de que el objeto está girando.

Saludos

Gracias compi. Buscaré algo de info para intentar hacerme unos apuntes y entenderlo porque si no, no me sirve de mucho, jeje.

Thanks