Hola a todos, tengo una duda que espero explicarme bien y que me entiendan para poder solucionarla.
Mi personaje principal mira siempre hacia donde esta el mouse(girando el sprite con image_angle=point_direction(self.x,self.y,mouse_x,mouse_y)).
La idea es hacer que el personaje tenga un lanzallamas, por una parte el sprite del personaje tiene el arma y por otra he creado el objeto llama(con forma de cono frontal y el centro del sprite es el principio del cono).
La idea esta en que cuando activo el lanzallamas quiero que saque el objeto no en el centro del sprite del personaje sino en la punta del cañon(desde el centro del sprite hay 32 pixels de distancia) por lo tanto por trigonometria deduci esto:
angle = angulo(point_direction(self.x,self.y,mouse_x,mouse_y))
if(angle < 90 and angle != 0){
instance_create(floor(abs(cos(angle)*32)) + self.x, self.y - floor(abs(sin(angle)*32)),obj_llamas)}
else if(angle < 180){
instance_create(self.x - floor(abs(sin(angle)*32)),self.y - floor(abs(cos(angle)*32)),obj_llamas)}
else if(angle < 270){
instance_create(self.x - floor(abs(cos(angle)*32)),(self.y + floor(abs(sin(angle)*32))),obj_llamas)}
else if(angle < 360 or angle = 0){
instance_create(self.x + floor(abs(sin(angle)*32)),self.y + floor(abs(cos(angle)*32)),obj_llamas)}
donde angle es el siguiente script
argument0= argument0 mod 360;
if argument0>=0 return ( argument0 );
return( 360+argument0 );
(http://i.imgur.com/XA5uW3G.png)
La idea es que, teniendo el eje x y el eje y, a siendo el angulo que nos da la funcion point_direction, queda claro que Cateto Opuesto = Sin(a)*r, y Cateto Adyacente = Cos(a)*r. En los quadrantes 1 y 3, el sin(a) corresponde al eje y, y en los 2 y 4 corresponde al eje x.
Cual podria ser el problema? Espero que me sean de gran ayuda =)
El problema es que el angulo debe de ir en radianes gm tiene la función "degtorad()" para eso.
De todos modos no entiendo por que añades tantas cosas. Lo que dices se hace simplemente así.
[gml]
instance_create(x+cos( degtorad( angulo ) )*32, y+sin( degtorad( angulo ) )*32, obj_llamas);
//ó usando las funciones lenghtdir que deben ser un poquitín más rápidas.
instance_create(x+lengthdir_x(32, angulo), y+lengthdir_y(32, angulo), obj_llamas);
[/gml]
Gracias =), no me fije en el manual que el seno era en radianes, supuse que como daban los angulos en grados iba todo así. Ahora funciona perfectamente.
pd. he tenido que cambiar un signo para que funcione, puse y-sin(angulo) sino el eje salia cambiado. Gracias otra vez =)
Por nada ;). Olvide que el eje y de gm estaba invertido.