Un enemigo estatico que dispare en tres direcciones diferentes, he tratado de hacerlo y no puedo  :'(
Las coordenadas de los disparos serian 230,270 y 310. Intente hacerlo pero dispara de todas las direcciones a la vez, y quiero que dispare individualmente dependiendo de la posicion del jugador, y que al disparar en cada posicion cambie a su Sprite respectivo

De ante mano muchas gracias

#1 Octubre 30, 2015, 11:42:36 PM Ultima modificación: Octubre 30, 2015, 11:54:55 PM por penumbra
Cita de: evansmako123 en Octubre 30, 2015, 11:24:33 PM
Las coordenadas de los disparos serian 230,270 y 310.
Esto no resulta claro, ya que para definir un punto siempre se necesitan un PAR de coordenadas: un valor para x y otro para y. Supongo que quizás estás refiriéndote al ángulo en el que debe disparar el enemigo.

No es necesario cambiar de sprite por cada dirección/ángulo. Un único sprite de disparo se puede girar para apuntar a la posición deseada, pero esto también depende de cómo quieres que se vea el sprite.

GM ya posee variables para definir una dirección de movimiento, así que símplemente tienes que usar algo como esto:
[gml]
var bala;
bala = instance_create(blah blah, pasar argumentos)
randomize()
bala.speed = 10
bala.direction = choose(230, 270, 310)   //Elegir dirección del disparo al azar, de entre tres posibilidades
obj_enemigo.image_angle = 310    //Esto gira al sprite del enemigo para que coincida con la dirección de la bala. Si el código se coloca en el objeto enemigo, entonces borrar "obj_enemigo."
[/gml]


#2 Octubre 31, 2015, 12:04:38 PM Ultima modificación: Octubre 31, 2015, 12:06:13 PM por kostra
dependiendo de dónde esté el player...

create:
disparo = false;
alarm[0] = 1*room_speed; //1 = 1 segundo xD


step:
dir = point_direction(x,y,obj_player.x,obj_player.y); //edita obj_player como debe ser xD
if dir > 180 and dir <= 255
    direction = 230;
else if dir > 255 and dir <= 295
    direction = 270;
else if dir > 295 and dir <= 360
    direction = 310;

image_angle = direction;


He supuesto que esas "coordenadas" te refieres a 3 direcciones estáticas para tu "torreta" o lo que sea, y me basé en esos datos para hacer áreas de ángulo en donde se situa el player para decirle cuál de esas 3 direcciones estáticas apuntará la torreta en cada caso, piensa que va por image_angle, si por casualidad tienes las direcciones con 3 frames en el sprite, tendrías que cambiarlo a uno solo apuntando a la derecha (ángulo 0)
dir es una variable para ver a qué angulo está el player y así poder comparar con su propia dirección y tal xD

alarm0:
if dir > 180 and dir <= 360
{
    bala.instance_create(x,y,obj_bala); //edita obj_bala como debe ser.. xD
    bala.speed = 5; //velocidad, a gusto :B
    bala.direction = direction;
    bala.image_angle = direction;
    alarm[0] = 1*room_speed; //1 segundo como antes, a gusto :B
}
else
{
    alarm[0] = 1*room_speed; //de nuevo 1 segundo, este "else" es porque, si el player no está en ninguna de las "areas de visión" de la torreta, pues esta simplemente no dispara, pero seguimos haciendo bucle en la alarm, claro :B
}


No sé si será lo que buscas, pero bueno, lo he intentado, piensa sobretodo, que no le puse ningún girosuavizado ni nada así, la torreta apuntará en una de esas 3 direcciones y cuando cambia da un salto, osea se pone apuntando derrepente en la dirección que le toca, no se rota así to despacico y bonito eeh xD
[spoiler="ola k ase clickarme o k ase"]la imagen no se quita xD
[/spoiler]

Cita de: kostra en Octubre 31, 2015, 12:04:38 PM
dependiendo de dónde esté el player...

create:
disparo = false;
alarm[0] = 1*room_speed; //1 = 1 segundo xD


step:
dir = point_direction(x,y,obj_player.x,obj_player.y); //edita obj_player como debe ser xD
if dir > 180 and dir <= 255
    direction = 230;
else if dir > 255 and dir <= 295
    direction = 270;
else if dir > 295 and dir <= 360
    direction = 310;

image_angle = direction;


He supuesto que esas "coordenadas" te refieres a 3 direcciones estáticas para tu "torreta" o lo que sea, y me basé en esos datos para hacer áreas de ángulo en donde se situa el player para decirle cuál de esas 3 direcciones estáticas apuntará la torreta en cada caso, piensa que va por image_angle, si por casualidad tienes las direcciones con 3 frames en el sprite, tendrías que cambiarlo a uno solo apuntando a la derecha (ángulo 0)
dir es una variable para ver a qué angulo está el player y así poder comparar con su propia dirección y tal xD

alarm0:
if dir > 180 and dir <= 360
{
    bala.instance_create(x,y,obj_bala); //edita obj_bala como debe ser.. xD
    bala.speed = 5; //velocidad, a gusto :B
    bala.direction = direction;
    bala.image_angle = direction;
    alarm[0] = 1*room_speed; //1 segundo como antes, a gusto :B
}
else
{
    alarm[0] = 1*room_speed; //de nuevo 1 segundo, este "else" es porque, si el player no está en ninguna de las "areas de visión" de la torreta, pues esta simplemente no dispara, pero seguimos haciendo bucle en la alarm, claro :B
}


No sé si será lo que buscas, pero bueno, lo he intentado, piensa sobretodo, que no le puse ningún girosuavizado ni nada así, la torreta apuntará en una de esas 3 direcciones y cuando cambia da un salto, osea se pone apuntando derrepente en la dirección que le toca, no se rota así to despacico y bonito eeh xD

Para que quede un claro, el enemigo como tal no es una torreta :3 es este, por ende no quiero que rote o algo asi ;w; simplemente que el sprite cambie

pues en esta parte:
if dir > 180 and dir <= 255
    direction = 230;
else if dir > 255 and dir <= 295
    direction = 270;
else if dir > 295 and dir <= 360
    direction = 310;


cambia los "direction" por image_index = 0,1,2... nada más, bueno, image_speed = 0; en el create xD
[spoiler="ola k ase clickarme o k ase"]la imagen no se quita xD
[/spoiler]

Cita de: kostra en Octubre 31, 2015, 07:36:32 PM
pues en esta parte:
if dir > 180 and dir <= 255
    direction = 230;
else if dir > 255 and dir <= 295
    direction = 270;
else if dir > 295 and dir <= 360
    direction = 310;


cambia los "direction" por image_index = 0,1,2... nada más, bueno, image_speed = 0; en el create xD

T-T Mira, despues de hacer esto fijo me pongo a ver tutoriales hasta el 2020

En la línea 3 estás escribiendo
[gml]bala.instance_create()[/gml]
pero debería ser
[gml]bala = instance_create()[/gml]

culpa mia!! sry! :B
[spoiler="ola k ase clickarme o k ase"]la imagen no se quita xD
[/spoiler]