Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: jorgeelalto en Enero 10, 2012, 04:43:38 PM

Título: Torreta
Publicado por: jorgeelalto en Enero 10, 2012, 04:43:38 PM
Buenas, estoy desarrollando un juego en 2d, y no s? como hacer que cuando haya un malo en frente de la torreta, ?sta se ponga a disparar. Utilizo de momento un trigger que se activa cuando un malo est? cerca, con el c?digo:
[gml]
if (object_exists(malo1))
{
return (point_distance(malo1.x,malo1.y,self.x,self.y) < 400)
}
[/gml]
Alguien me podr?a ayudar? Gracias de antemano.
Título: Re: Torreta
Publicado por: verdader26 en Enero 10, 2012, 06:56:32 PM
te hice un ejemplo segun lo que yo entendi de tu pregunta
Título: Re: Torreta
Publicado por: elviskelley en Enero 10, 2012, 09:35:00 PM
if instance_exists(malo1) //verifica si existe la instancia malo1
{
var a; //declara variable temporal "a"
a=instance_nearest(x,y,malo1) //guarda en "a" la id de la instacia malo1 mas cercana.
if (point_distance(x,y,a.x,a.y) < 400) //verifica si "a" osea la id de malo1 mas cercano, esta dentro de 400pxl de distancia
{
if !instance_exists(objBala) //si no hay balas en el momento
{instance_create(x,y,objBala)} //crea una bala. Osea dispara.
}
}

Va en el Event Step y funciona perfectamente.
Título: Re: Torreta
Publicado por: jorgeelalto en Enero 11, 2012, 03:52:58 PM
verdader26 no era eso exactamente pero aun asi gracias por responder.
ElvisKelley no s? si funcionar? o no, luego lo compruebo. Tambi?n gracias a ti por responder.
Título: Re: Torreta
Publicado por: brunoxzx en Enero 11, 2012, 05:44:02 PM
pues en realidad lo que puso elviskelley esta bien solo que no lo puso como un trigger.

Sirve que te corrijo lo que tenias mal.

//Esto retorna si existe el objeto malo1 no la INSTANCIA que son muy distintos, puede haber muchas instancias del objeto malo1 pero sigue siendo un solo objeto ;).
[gml]object_exists(malo1)[/gml]

Para resolverlo puedes usar:
[gml]instance_exists(malo1)[/gml]

Esto esta bien pero recuerda que si hay muchas instancias de "malo1" al poner "malo1.x" te devolver? la coordenada "x" de la primera instancia creada del objeto malo1, no de todos ni del mas cercano. Otra cosa poner self.x es exactamente lo mismo que poner simplemente "x".
[gml]return (point_distance(malo1.x,malo1.y,self.x,self.y) < 400)[/gml]

Para resolver esto usaremos IDs, las IDs son los identificadores ?nicos de las instancias, por ejemplo imagina que tienes 3 instancias de malo1 en tu room, pero que en un determinado momento del juego decides eliminar solo la instancia numero 2 ?como lo har?as? simple usas su ID para eliminarlo.
[gml]
//suponiendo que 10034 es la ID de la segunda instancia de malo1.
with(10034){
    instance_destroy();
}
[/gml]
Listo as? destruyes esa instancia en especifico. Todas la IDs son iguales o mayores a "10000", probablemente te preguntes ?como consigo el id de una instancia? pues hay varias formas de hacerlo por ejemplo en el editor de rooms al poner el mouse sobre alguna instancia en la esquina inferior derecha aparece su id, otra manera de obtener la ID de una instancia es al usar la funci?n "instance_create()" esa funci?n devuelve la ID de la instancia que creo, te pongo un ejemplo.

[gml]
var a; //declaramos la variable temporal "a";
a=instance_create(x,y,obj_bala);//la variable "a" toma la "ID" de la instancia que se acaba de crear.
a.direction=direction;//se hace que la direcci?n de la bala reci?n creada sea igual a tu direcci?n.
a.speed=10;//la velocidad de la bala reci?n creada es igual a 10.
[/gml]

Bueno despu?s de todo esto vamos a lo que necesit?bamos, la funci?n instance_nearest(x,y,obj) esta funci?n devuelve la ID de la instancia de tipo "obj" mas cercana al punto "x,y", y listo b?sicamente con esto ya puedes armar tu c?digo que quedar?a as?.

[gml]if (instance_exists(malo1)){
    var ide; //variable que almacenara la ID de la instancia mas cercana de malo1.
    ide=instance_nearest(x,y,malo1); //Listo ahora ide es igual a la ID de la instancia mas cercana de malo1.
    return (point_distance(ide.x,ide.y,x,y) < 400);
}[/gml]

Listo ya tienes tu c?digo terminado
Título: Re: Torreta
Publicado por: jorgeelalto en Enero 11, 2012, 08:33:54 PM
pero entonces este c?digo hace que dispare cuando est? delante, o sea, si trazas una recta, cuando el malo coincide con la recta, la torreta dispara?
Título: Re: Torreta
Publicado por: elviskelley en Enero 11, 2012, 08:39:12 PM
El c?digo que te di, tomara la Id de la instancia malo1 mas cercana a la torreta, y la atacara, claro esto siempre que se encuentre dentro de 400 pxl de distancia.

Título: Re: Torreta
Publicado por: brunoxzx en Enero 11, 2012, 08:50:51 PM
jaja al final no correg? lo de instance_exists().

[gml]if (instance_exists(malo1)){
    var ide; //variable que almacenara la ID de la instancia mas cercana de malo1.
    ide=instance_nearest(x,y,malo1); //Listo ahora ide es igual a la ID de la instancia mas cercana de malo1.
    return (distance_to_object(malo1) < 400);
}[/gml]
Listo ya puedes a?adir este trigger.

Si quieres que solo dispare si el angulo entre los 2 personajes es menor a cierto numero me dices  :-[.
Título: Re: Torreta
Publicado por: jorgeelalto en Enero 12, 2012, 03:35:29 PM
haber si puedo explicarme mejor. Para un juego en 2d estilo mario bros, con suelo y todo, hacer una torreta que dispare o para la derecha o para la izquierda, y que s?lo si un malo est? justo delante, se ponga a disparar, parecido a las torretas guiadas por l?ser.
Título: Re: Torreta
Publicado por: elviskelley en Enero 12, 2012, 09:28:04 PM
El c?digo es el mismo, solo deber?s agregar una condici?n que verifique las posiciones de X, algo como if x< a.x c?digo etc.
Si no comprendes lo que, digo busca el manual, y lo lees, Seguro comprender?s mejor.
Título: Re: Torreta
Publicado por: jorgeelalto en Enero 30, 2012, 03:45:18 PM
ok gracias elviskelley