como hago para que cuando un enemigo dispare la dirección de la bala dependa de su direction o image_angle?

he provado en poner al objeto bala en creat
direction=enemigo.image_angle y tambien
direction=enemigo.direction

pero no me sirve que hago?
Padre Nuestro del Programador de C           
C Nuestro que estas en la Memoria,
Compilado sea tu código,
venga a nosotros tu software,
carguense tus punteros.
así en la RAM como en el Disco Duro,
Danos hoy nuestro Array de cada día,
Perdona nuestros Warnings,
así como nosotros también los eliminamos,
no nos dejes caer en Bucles,
y libranos del Windows, Enter.

una forma de hacerlo es a través del mismo objeto que crea la bala:

if (disparar)
{
bala = instance_create(x,y,obj_bala)
bala.direction = image_angle
bala.speed     = velocidad
disparar = 0
}

tambien puedes colocarle un codigo mas interesante, y crear una variable de angulo del enemigo, otra variable que contenga la distancia a la que quieres tirar la bala desde el punto que tienes como centro del sprite, y despues tomas el valor del coseno y del seno de la variable angulo (en radianes), o si lo quieres expresar en grados puedes usar la función degtorad(), que te convierte los grados en radianes...

en el evento step:

if (disparar)
{
dx = dis*cos(degtorad(angulo))
dy = dis*-sin(degtorad(angulo))
bala = instance_create(x+dx,y+dy,obj_bala)
bala.direction = angulo
bala.speed     = velocidad
disparar = 0
}

en los signos siempre me confundo en las funciones sin() y cos() XD, pero ahi vas acomodandolo a tu juego :)... espero que te haya sido de utilidad...
El ayer es un recuerdo, el mañana un pensamiento, es el ahora en donde existo y vivo para ser feliz :D

Cita de: fab62 en Julio 20, 2012, 12:36:05 AM
una forma de hacerlo es a través del mismo objeto que crea la bala:

if (disparar)
{
bala = instance_create(x,y,obj_bala)
bala.direction = image_angle
bala.speed     = velocidad
disparar = 0
}

tambien puedes colocarle un codigo mas interesante, y crear una variable de angulo del enemigo, otra variable que contenga la distancia a la que quieres tirar la bala desde el punto que tienes como centro del sprite, y despues tomas el valor del coseno y del seno de la variable angulo (en radianes), o si lo quieres expresar en grados puedes usar la función degtorad(), que te convierte los grados en radianes...

en el evento step:

if (disparar)
{
dx = dis*cos(degtorad(angulo))
dy = dis*-sin(degtorad(angulo))
bala = instance_create(x+dx,y+dy,obj_bala)
bala.direction = angulo
bala.speed     = velocidad
disparar = 0
}

en los signos siempre me confundo en las funciones sin() y cos() XD, pero ahi vas acomodandolo a tu juego :)... espero que te haya sido de utilidad...
la primera opción los enemigos disparaban balas pero todas iban balas a la derecha y la segunada me dice
FATAL ERROR in
action number 1
of  Step Event
for object enemigo:

COMPILATION ERROR in code action
Error in code at line 9:
   bala = instance_create(x+dx,y+dy,obj_bala)
        ^
at position 7: Variable name expected.
Padre Nuestro del Programador de C           
C Nuestro que estas en la Memoria,
Compilado sea tu código,
venga a nosotros tu software,
carguense tus punteros.
así en la RAM como en el Disco Duro,
Danos hoy nuestro Array de cada día,
Perdona nuestros Warnings,
así como nosotros también los eliminamos,
no nos dejes caer en Bucles,
y libranos del Windows, Enter.

#3 Julio 20, 2012, 02:47:55 AM Ultima modificación: Julio 20, 2012, 02:51:38 AM por fab62
mmm... que raro... a mi me funciona muy bien si lo implemento bien en el programa... sera mejor que subas tu archivo para ver si tienes un error... porque yo lo he usado muchas veces y me funciona bien...

en el caso del angulo, debes tener la variable angulo expresada en grados para que te funcione, y puedes ya sea colocar en el evento step:

image_angle = angulo

pero es mejor dibujar el sprite en el evento draw:
draw_sprite_ext(sprite_index,imagen,x,y,1,1,angulo,c_white,1)
El ayer es un recuerdo, el mañana un pensamiento, es el ahora en donde existo y vivo para ser feliz :D


Ok primero aclaro algo en el game maker podes usar este codigo lengthdir_x o asi lengthdir_y qu te ahorra la ecuación que te mostraron, te mostrare como implementarlo.
if (disparar)
{
dx = lengthdir_x(angulo,speed)  y evitas esto (dis*cos(degtorad(angulo)))
dy = lengthdir_y(angulo,speed)  y evitas esto dis*-sin(degtorad(angulo))
bala = instance_create(x+dx,y+dy,obj_bala)
bala.direction = angulo
bala.speed     = velocidad
disparar = 0
}

Pero yo no usaria ese codigo usaria este.
al momento de disparar en vez de solo indicar que se cree la instancia de la bala, la creare en una variable que guarde su id.
var bala;
bala=instance_create(x,y,objBala) //indico que esto va en la instancia que dispara.
with(bala) {direction=objPlayer.image_angle; speed=10;} claro cambia lo de objPlayer por el nombre del personaje que dispara la bala. osea que crea la instancia de la bala.