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.

te hice un ejemplo segun lo que yo entendi de tu pregunta

#2 Enero 10, 2012, 09:35:00 PM Ultima modificación: Enero 11, 2012, 08:37:00 PM por elviskelley
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.

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.

#4 Enero 11, 2012, 05:44:02 PM Ultima modificación: Enero 11, 2012, 08:51:41 PM por brunoxzx
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

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?

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.


#7 Enero 11, 2012, 08:50:51 PM Ultima modificación: Enero 12, 2012, 09:09:20 PM por brunoxzx
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  :-[.

#8 Enero 12, 2012, 03:35:29 PM Ultima modificación: Enero 12, 2012, 04:03:16 PM por jorgeelalto
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.

#9 Enero 12, 2012, 09:28:04 PM Ultima modificación: Enero 12, 2012, 09:30:27 PM por elviskelley
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.

ok gracias elviskelley