Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: Mr.Dudas en Julio 19, 2012, 11:35:27 PM

Título: direccion de la bala del enemigo
Publicado por: Mr.Dudas en Julio 19, 2012, 11:35:27 PM
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?
Título: Re:direccion de la bala del enemigo
Publicado por: 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...
Título: Re:direccion de la bala del enemigo
Publicado por: Mr.Dudas en Julio 20, 2012, 02:17:00 AM
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.
Título: Re:direccion de la bala del enemigo
Publicado por: fab62 en Julio 20, 2012, 02:47:55 AM
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)
Título: Re:direccion de la bala del enemigo
Publicado por: elviskelley en Julio 20, 2012, 03:35:06 AM

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.