Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: Naitsabes0 en Agosto 20, 2017, 01:17:30 AM

Título: Quiero armar de la forma mas eficiente este"power up" [Resuelto]
Publicado por: Naitsabes0 en Agosto 20, 2017, 01:17:30 AM
NOTA: Coloque todos los detalles a considerar desde mi punto de vista, el problema es mencionado al final del post.

Este "power up" que voy a crear tiene una característica que lo convierte en el poder mas roto del juego que estoy creando, consiste en que todos los enemigos que entren en contacto con el sean destruidos al instante, creo que el mejor ejemplo que puedo dar es este, y claro también entra el factor tiempo
(https://i.gyazo.com/0d984234079fc5b823a6ffcc39b43de5.gif)

La idea es crear una sola colisión que se aplique a todos estos objetos.

Por ejemplo estos son 8 enemigos de los 24 que hay.
objEnEspectador
objEnCazador
objEnCaminante
objEnMerodeadorH
objEnMerodeadorV
objEnCentinela
objEnInfernalV
objEnInfernalH

Si algo se es que debo considerar estos 2 objetos para que se vea similar, ya que no quiero que se parezca visualmente al juego que muestra el GIF

1.- El obj_Poder_Rayo //El cual es equivalente al objeto estrella, solo que este no se mueve, lo que aria mas fácil aun de programar.
2.- El obj_Escudo_Rayo //El cual es equivalente a mario con estrella, solo que esta lo encierra en su interior destruyendo todo enemigo a su paso por un lapso de tiempo X.

La forma en la que he armado un código similar a estas características es la siguiente.

1.- obj_Poder_Escudo_Jugador
CREATE::::::::::::::::::::::::::::::
///Animacion
image_speed = 0.1;
COLLISION CON EL objJugador::::::::::::
///Creacion de las bolas
instance_create(x+objJugador,y+objJugador,obj_Escudo_Protector);
effect_create_above (ef_firework,x,y,1,c_yellow);
audio_play_sound (snd_Laser2,50,false);
instance_destroy()

Por lo que podría decirse que no tengo problemas en la parte 1° solo es una idea de como arme el código.

2.-obj_Escudo_Protector
CREATE::::::::::::::::::::::::::
///Variables
image_speed = 0.1;
aguante_escudo = 3;
STEP:::::::::::::::::::::::::::::::
///Codigo de la bola
action_potential_step(objJugador.x,objJugador.y-8,room_height+room_width,false);
if(aguante_escudo < 0)
    {
    aguante_escudo = 0
    instance_destroy();
    }
COLLISiON objBullet :::::::::::::::::::::::::::
///Dañar escudo
effect_create_above (ef_firework,x,y,0,c_yellow);
effect_create_above (ef_ring,x,y,0,c_purple);
audio_play_sound (snd_Disparo_De_Fuego,50,false);
aguante_escudo -= 1;

Pues aquí esta el problema, el poder tendría su animación, ademas de que seguiría al jugador sin problemas, pero en alguna parte debería programar la famosa colisión contra todos los enemigos junto a su temporizador, puedo hacer la colisión contra todos los enemigos, pero como son 8x3=24 objetos, seria engorroso ir 1 por 1, así que debería hacer una lista de todos los objetos que se destruirán cuando entre en contacto con el El obj_Escudo_Rayo

Gracias por llegar hasta este punto.
Título: Re:Quiero armar de la forma mas eficiente este"power up"
Publicado por: TheJaj en Agosto 20, 2017, 03:12:04 AM
Fácil, crea un padre para el padre de tu objetos.
El primero sera el padre al que harás referencia para matar a todo lo que mate tu escudo de rayo.
Los segundos padres serán los encargados de dividir en sub-grupos (Enemigos, la princesa que te friendzoneo, el que te robo la dignidad, los arboles(si eres jardinero)).

Solo haces que el escudo al tocar al "primer padre" este muera y todos los objetos hijos a este morirán. :D
Título: Re:Quiero armar de la forma mas eficiente este"power up"
Publicado por: Naitsabes0 en Agosto 20, 2017, 08:00:08 AM
Cita de: TheJaj en Agosto 20, 2017, 03:12:04 AM
Fácil, crea un padre para el padre de tu objetos.
El primero sera el padre al que harás referencia para matar a todo lo que mate tu escudo de rayo.
Los segundos padres serán los encargados de dividir en sub-grupos (Enemigos, la princesa que te friendzoneo, el que te robo la dignidad, los arboles(si eres jardinero)).

Solo haces que el escudo al tocar al "primer padre" este muera y todos los objetos hijos a este morirán. :D
De por si los objetos enemigos ya tienen su padre, por eso no he creado un padre de ellos, ya que si empiezo a relacionar objetos padre con mas objetos padre tendré un problema mayor a futuro, por lo que el problema de enemigos y tiempo todavía persiste.
Título: Re:Quiero armar de la forma mas eficiente este"power up"
Publicado por: TheJaj en Agosto 20, 2017, 03:36:05 PM
Pues en cuyo caso solo se me ocurre que nombres a los enemigos uno por uno o si tienes un parent en común(sub-grupo) para hacer la colisión y eliminarlos.
Y con el temporizador puedes hacer una variable en en el evento create, Ej:

Tiempo = 3*room_speed //Esto daria como resultado que dure 3 segundos.

En el step pones

Tiempo -= 1
if Tiempo <= 0
{instance_destroy();}
Título: Re:Quiero armar de la forma mas eficiente este"power up"
Publicado por: Zapdos43 en Agosto 20, 2017, 03:37:15 PM
Creo recordar que tu escudo era circular, te servirá la función collision_circle:

evento Step:
[gml]if instance_exists(objeto_escudo) // nos aseguramos de que existe el escudo
{
cc = collision_circle(x, y, radio, objeto_padre, false, false); // copiamos el ID del objeto que colisiona
if (cc) // si existe ID
{
with(cc) instance_destroy();
}
}[/gml]

Dentro de la función de collision_circle debes indicar las coordenadas x,y que serán el centro del círculo. Si tu sprite está centrado, puedes poner "personaje.x" y "personaje.y". En radio debes poner el radio del círculo medido en pixeles. Por ejemplo, si el escudo tiene un diámetro de 20 px, el radio es (diámetro/2) = 10 px.
Título: Re:Quiero armar de la forma mas eficiente este"power up"
Publicado por: Naitsabes0 en Agosto 20, 2017, 04:23:21 PM
Cita de: Zapdos43 en Agosto 20, 2017, 03:37:15 PM
Creo recordar que tu escudo era circular, te servirá la función collision_circle:

evento Step:
[gml]if instance_exists(objeto_escudo) // nos aseguramos de que existe el escudo
{
cc = collision_circle(x, y, radio, objeto_padre, false, false); // copiamos el ID del objeto que colisiona
if (cc) // si existe ID
{
with(cc) instance_destroy();
}
}[/gml]

Dentro de la función de collision_circle debes indicar las coordenadas x,y que serán el centro del círculo. Si tu sprite está centrado, puedes poner "personaje.x" y "personaje.y". En radio debes poner el radio del círculo medido en pixeles. Por ejemplo, si el escudo tiene un diámetro de 20 px, el radio es (diámetro/2) = 10 px.
Creo que debí mencionar que los objetos tienen su sprite, ya que este código me aleja un poco de lo que busco, pues los sprite tienen estas características, ya que planeo que se vea estéticamente bien con su animación electrificante  ;D, bueno mal chiste  :-[, pero si lo creo con código seria un circulo común como el que programe en la linterna.
(https://i.gyazo.com/47403f1a651bdb44b40893cf6e2e95c8.gif)

Quiero aclarar que el escudo protector y el rayo esférico son 2 poderes distintos que no tienen ninguna relación entre ellos, ya que el protector como su nombre lo dice protege al jugador, pero solo de proyectiles, mientras que el rayo esférico envuelve por completo al jugador eliminando todo a su paso por un lapso de tiempo, en el GIF se puede apreciar como el rayo esférico es mas grande que el escudo protector, ya que este es la defensa definitiva por unos cuantos segundos.
Título: Re:Quiero armar de la forma mas eficiente este"power up"
Publicado por: Zapdos43 en Agosto 20, 2017, 04:55:25 PM
Escudo_rayo:
create event:
[gml]
alarm[0] = room_speed * 10; // 10 segundos para autodestruirse
[/gml]

alarm[0]:
[gml]
instance_destroy();
[/gml]

step event:
[gml]
// colocar el escudo rayo en el centro del personaje
x = personaje.x + 8;
y = personaje.y -12;
// detectar colisiones con enemigos
// radio = 48 px (mitad de 96)
cc = collision_circle(x, y, 48, objeto_padre, false, false);
if (cc)
{
     with(cc)
     {
       instance_destroy();
     }
}
[/gml]
Título: Re:Quiero armar de la forma mas eficiente este"power up"
Publicado por: 3dgeminis en Agosto 20, 2017, 08:28:21 PM
Pues se me ocurren 3 opciones:
1 - usar parents
2 - repetir el mismo codigo para cada enemigo
3 - empezar de nuevo y planificar mejor el codigo
Título: Re:Quiero armar de la forma mas eficiente este"power up"
Publicado por: Naitsabes0 en Agosto 21, 2017, 12:17:49 AM
Cita de: Zapdos43 en Agosto 20, 2017, 04:55:25 PM
Escudo_rayo:
create event:
[gml]
alarm[0] = room_speed * 10; // 10 segundos para autodestruirse
[/gml]

alarm[0]:
[gml]
instance_destroy();
[/gml]

step event:
[gml]
// colocar el escudo rayo en el centro del personaje
x = personaje.x + 8;
y = personaje.y -12;
// detectar colisiones con enemigos
// radio = 48 px (mitad de 96)
cc = collision_circle(x, y, 48, objeto_padre, false, false);
if (cc)
{
     with(cc)
     {
       instance_destroy();
     }
}
[/gml]
Tu código fue fantástico  :).