Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: somnus en Marzo 19, 2019, 09:44:38 PM

Título: Como hacer lasers que rebotan en las paredes
Publicado por: somnus en Marzo 19, 2019, 09:44:38 PM
Hola, alguien tiene la idea, codigo o ejemplo de como hacer esos lasers que cuando te dispara el enemigo rebotan en las paredes?
para que entiendan a que me refiero serian algo asi como el laser del gemini man del megaman 3
Título: Re:Como hacer lasers que rebotan en las paredes
Publicado por: 3dgeminis en Marzo 20, 2019, 07:54:06 PM
Vi un video y parece que se crea otro laser al momento de la colision con nuevo angulo de movimiento y desaparece el otro.
Podrias hacer que sean varios objetos, uno detras de otro para que parezca que sea una linea.
Título: Re:Como hacer lasers que rebotan en las paredes
Publicado por: juantrix666 en Marzo 21, 2019, 06:39:27 AM
Primero, perdonen las faltas de ortografia  :-[

Te muestro como lo hice :
Cree un objeto laser, con un sprite de un circulo (en mi codigo es sprite11) y se crea a partir del player, de ahi toma la direccion inicial segun el sprite si mira para un lado u otro.

Create:

largo = 10//largo del laser (cantidad de sprites)
vsp = 0 //velocidad vertical
hps = 0 //velocidad horizontal
laser[largo,1] = 0// array para almacenar las posiciones de cada sprite

for (i=0;i<largo;i++){//setea el array en 0's
    laser[i,0] = 0
    laser[i,1] = 0
}


if obj_player.image_xscale > 0{//la direccion depende de hacia donde mira el pj en mi caso

    hsp = 8

}else{

    hsp = -8

}


Step:

x += hsp
y += vsp

//la primer posicion del array siempre son las cordenadas actuales
laser[0,0]= x
laser[0,1]= y

//aca muevo todo los valores hacia la drecha y el ultimo es descartado
for (i=0;i<largo;i++){

    laser[largo-i,0] = laser[largo-i-1,0]
    laser[largo-i,1] = laser[largo-i-1,1]
}

//si detecta una colicion arriba o abajo y la velocidad vertical es no es 0 invierte la velocidad y si vps es 0 sale hacia arriba (esto porque al inicio el laser sale derecho y al primer rebote toma una direccion)
if collision_line(x,y-sprite_yoffset-5,x,y+sprite_yoffset+5,obj_piso,1,1) && vsp != 0{
   
        vsp*= -1
   }else if vsp = 0{
   
       vsp = -8
   
   }
   //Si coliciona con un lateral se invierte la velocidad horizontal
   if collision_line(x-sprite_xoffset-5,y,x+sprite_xoffset+5,y,obj_piso,1,1){
   
        hsp *= -1
   
   }


Draw:

draw_sprite(sprite11,0,x,y)//dibujo el primer sprite

for (i=1;i<largo;i++){//Dibujo los demas sprites

    draw_sprite(sprite11,0,laser[i,0],laser[i,1])

}


Espero te sirva de algo.
Título: Re:Como hacer lasers que rebotan en las paredes
Publicado por: somnus en Marzo 21, 2019, 06:10:18 PM
Cita de: 3dgeminis en Marzo 20, 2019, 07:54:06 PM
Vi un video y parece que se crea otro laser al momento de la colision con nuevo angulo de movimiento y desaparece el otro.
Podrias hacer que sean varios objetos, uno detras de otro para que parezca que sea una linea.


ya habia pensado en eso pero supuse que era muy lioso, esperaba encontrar una major solucion y mas simple, gracias 3dgeminis
Título: Re:Como hacer lasers que rebotan en las paredes
Publicado por: somnus en Marzo 21, 2019, 06:12:02 PM
Cita de: juantrix666 en Marzo 21, 2019, 06:39:27 AM
Primero, perdonen las faltas de ortografia  :-[

Te muestro como lo hice :
Cree un objeto laser, con un sprite de un circulo (en mi codigo es sprite11) y se crea a partir del player, de ahi toma la direccion inicial segun el sprite si mira para un lado u otro.

Create:

largo = 10//largo del laser (cantidad de sprites)
vsp = 0 //velocidad vertical
hps = 0 //velocidad horizontal
laser[largo,1] = 0// array para almacenar las posiciones de cada sprite

for (i=0;i<largo;i++){//setea el array en 0's
    laser[i,0] = 0
    laser[i,1] = 0
}


if obj_player.image_xscale > 0{//la direccion depende de hacia donde mira el pj en mi caso

    hsp = 8

}else{

    hsp = -8

}


Step:

x += hsp
y += vsp

//la primer posicion del array siempre son las cordenadas actuales
laser[0,0]= x
laser[0,1]= y

//aca muevo todo los valores hacia la drecha y el ultimo es descartado
for (i=0;i<largo;i++){

    laser[largo-i,0] = laser[largo-i-1,0]
    laser[largo-i,1] = laser[largo-i-1,1]
}

//si detecta una colicion arriba o abajo y la velocidad vertical es no es 0 invierte la velocidad y si vps es 0 sale hacia arriba (esto porque al inicio el laser sale derecho y al primer rebote toma una direccion)
if collision_line(x,y-sprite_yoffset-5,x,y+sprite_yoffset+5,obj_piso,1,1) && vsp != 0{
   
        vsp*= -1
   }else if vsp = 0{
   
       vsp = -8
   
   }
   //Si coliciona con un lateral se invierte la velocidad horizontal
   if collision_line(x-sprite_xoffset-5,y,x+sprite_xoffset+5,y,obj_piso,1,1){
   
        hsp *= -1
   
   }


Draw:

draw_sprite(sprite11,0,x,y)//dibujo el primer sprite

for (i=1;i<largo;i++){//Dibujo los demas sprites

    draw_sprite(sprite11,0,laser[i,0],laser[i,1])

}


Espero te sirva de algo.