Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: Cham en Noviembre 24, 2012, 07:22:19 PM

Título: Script: Enemigo, que dispare una sola bala
Publicado por: Cham en Noviembre 24, 2012, 07:22:19 PM
Hola de nuevo :)

Estoy haciendo una copia del juego "Battle City" y tengo el siguiente problema.

E01= (objeto tanke enemigo)
E01B= (objeto bala enemigo)

-Tengo el objeto E01 que dispara E01B
-Tiene que disparar siempre que pueda (hasta ai todo bien)
-Pero solo tiene que disparar una bala (hasta que la bala que disparo se destrulla)
-Pero cuando pongo otros tankes solo el primero puede disparar

E estado haciendo este juego con script basico
Pero no se que tan complicado pueda ser esto
Espero que me puedan ayudar :)
Título: Re:Script: Enemigo, que dispare una sola bala
Publicado por: Daz en Noviembre 24, 2012, 07:27:28 PM
Buenas de nuevo. Ahora sí que sí, gracias por tomarte el tiempo de ponerlo todo bien, se agradece :)

Pues, no sé si lo he llegado a entender del todo bien, pero si quieres que se cree el objeto Bala sólo cuando no se haya disparado ninguna otra, podrías probar con este código, en la parte en la que creas la bala:

[gml]
if (instance_number(E0B1)=0)
{
    /*Aquí tu código de disparo, que podría ser algo así...*/
    instance_create(x,y,E0B1);
}
[/gml]
Espero haberte entendido.

Citar-Pero cuando pongo otros tankes solo el primero puede disparar
¿Te refieres que quieres que sea así, o que cada tanque debería poder disparar una bala? Si es así, también podría ayudarte, aunque la cosa se complicaría un poco. Pero no te preocupes :) Avísame de lo que quieras hacer, porque sinceramente no lo he entendido.


¡Saludos!
Título: Re:Script: Enemigo, que dispare una sola bala
Publicado por: Cham en Noviembre 24, 2012, 07:30:55 PM
Cita de: Daz en Noviembre 24, 2012, 07:27:28 PM

[gml]
if (instance_number(E0B1)=0)
{
    /*Aquí tu código de disparo, que podría ser algo así...*/
    instance_create(x,y,E0B1);
}
[/gml]

Asi es mi codigo XD, pero el problema esta cuando pongo mas de un tanke (E01)

Si, cada tanque debería poder disparar una bala.
Título: Re:Script: Enemigo, que dispare una sola bala
Publicado por: Daz en Noviembre 24, 2012, 07:45:25 PM
Ahá, entonces la cosa se complica un poco más. Lo que he pensado es que podrías darle una ID a cada bala, para saber de qué tanque ha salido esa bala.

En el objeto tanque, en el evento Create, pondremos algo así:
[gml]
identificacion=instance_number(E0B);
[/gml]

Ésto le dará a cada tanque un valor único, una variable llamada "identificación" que tendrá un valor único en cada tanque.

A la hora de crear la bala, siguiendo con el código que ya tienes:
[gml]
if (instance_number(E0B1)=0)
{
    /*Aquí tu código de disparo, que podría ser algo así...*/
    bala=instance_create(x,y,E0B1);
    bala.identificacion=identificacion;
}
[/gml]
Ésto le dará a la bala el mismo número de id que tiene el tanque que lo ha creado.

Ahora, necesitamos comprobar, a la hora de crear una bala, que no exista ya una bala con la misma id. Por lo tanto, crea un script llamado contar_balas(); (O realmente como quieras), con el siguiente código.

[gml]
var numero;
numero=0;

with (E0B1)
{
    if (identifiacion=argument0)
    {
    numero+=1;
    }
}

return numero;
[/gml]

Este script comprueba el número de balas que hay con la misma id del tanque. Para usarlo en tu código de crear bala, la cosa quedaría así:

[gml]
balas=contar_balas(identificacion);
if (balas=0)
{
    bala=instance_create(x,y,E0B1);
    bala.identificacion=identificacion;
}
[/gml]

Así, solo si el número de balas con la misma id del tanque es 0 (es decir, no hay), se dispara.
Sé que es un poco lioso, y quizás más para alguien que empieza, pero intenta hincarle el diente al código.

¡Saludos!
Título: Re:Script: Enemigo, que dispare una sola bala
Publicado por: Cham en Noviembre 24, 2012, 08:24:47 PM
[gml]
var numero;
numero=0;

with (E0B1)
{
    if (identifiacion=argument0)
    {
    numero+=1;
    }
}

return numero;
[/gml]

Podrias explicarme esta parte porfavor >.<
nose que es "with", "argumento0" y "return"
lo demas si lo entiendo
Título: Re:Script: Enemigo, que dispare una sola bala
Publicado por: Daz en Noviembre 24, 2012, 08:36:47 PM
¡Claro!

With: Todo el código que va entre los brackets del with lo desarrolla el objeto al que se hace referencia.
Por lo tanto, si tenemos, en un supuesto objeto llamado objControl, este código:
[gml]
with (objPersonaje){instance_destroy();}
[/gml]
El código ocurre en el objPersonaje, y no en objControl. Por lo tanto, el objeto que es destruido es objPersonaje.
+ info: http://www.comunidadgm.org/manual_GM/Construcciones_with.htm

En tu caso, hacía falta hacer referencia a las balas, ya que había que trabajar con ellas, pero teníamos que hacer referencia a ellas mediante el objeto tanque. Por eso, el uso del with.

argument0: Los scripts (puedes crear uno dándole al menú "Resources" > "Create Script") están pensados para ser llamados. Pero junto a la llamada, podemos darle información. Más información (y mejor) aquí: http://www.comunidadgm.org/manual_GM/Scripts_GML.htm

return: En el anterior enlace también se explica qué es return. Básicamente, sirve para devolver un valor. Necesitabas que el script para contar balas de devolviera el número de balas con la misma id del tanque, por ello usamos return.

Te recomiendo una visita por el manual de Game Maker. Está traducido en español y con un buscador, es de lo más cómodo si no sabes este tipo de cosas: http://www.comunidadgm.org/manual_GM/Index.php


¡Saludos!