Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: Zora en Marzo 22, 2013, 06:42:45 PM

Título: Disparar al enemigo que va adelante.
Publicado por: Zora en Marzo 22, 2013, 06:42:45 PM
Estoy creando un Tower Defense, para los que no conocen el concepto es el tipo de juego donde colocas torres defensivas que deben matar a enemigos. Los enemigos van por un camino y tenes que matarlos antes de que lleguen al final. Cada torre dispara automaticamente si el enemigo esta dentro de su rango de ataque.

Lo que necesito, que no me sale a pesar de varios intentos, es que la torre al seleccionar un enemigo para disparar tome en cuenta dos cosas:

1- Que este dentro de su rango de ataque, lo cual si puedo hacer utilizando "distance_to_object"
2- Que  ataque al que esta mas adelante en el camino, es decir, el que esta mas cerca de llegar al final.

Ya cada enemigo tiene la variable "path_position" que va del 0 al 1 segun que tan cerca esta de llegar al final del path, por ende hay una manera de identificar segun esta variable quien va mas adelante; o en su defecto pense en poner una variable que aumente en cada step el valor que tenga de speed, de manera que tambien indicaria lo mismo. Pero mi conocimiento en programacion es escaso asi que aun teniendo esas variables, no logro pensar como conseguir lo que quiero.

Busque preguntas y ejemplos pero ninguno tiene esto. Siempre atacan al mas cercano y no es lo que quiero para mi juego.

Agradeceria cualquier opinion que puedan darme para conseguirlo.
Título: Re:Disparar al enemigo que va adelante.
Publicado por: metalfox6383 en Marzo 23, 2013, 02:54:25 PM
Muy buena pregunta. Se me ocurre una idea:
Utiliza la funcion COLLISION_CIRCLE a modo de sonar. En el evento STEP coloca un bloque FOR donde el circulo de colision vaya creciendo hasta su rango maximo, pero cuando apenas encuentre al primer enemigo, que empiece a dispararle sólo a el. De esa manera detectaria al mas cercano. La función DISTANCE_TO_OBJECT te da el menor ID, no la menor diastancia, que seria lo ideal. Espero haberte ayudado un poco. Comentas para ver como te va.
Título: Re:Disparar al enemigo que va adelante.
Publicado por: Zora en Marzo 23, 2013, 05:44:04 PM
Hmmm en realidad no entiendo a donde apuntas. Utilizando lo que me decis atacaria al que esta mas cerca de la torre, que seria parecido a usar INSTANCE_NEAREST. Pero no es lo que busco, la eleccion de objetivo tiene que ser entre todos los que estan dentro del rango, incluso si el mas cercano al final del recorrido no es el mas cercano a la torre

EDIT.
Muchas gracias por la buena intencion de ayudar metalfox6383, agradezco que hayas contestado, pero ya esta arreglado.
Postee este mismo problema en otro foro, y recibi una respuesta que ha resuelto el problema!
A continuacion pongo la solucion para que quede en el foro por si alguien mas adelante tuviese la misma consulta.
Se crea un script
//scr_find_target(object,range)
//arg0 = the object to find targets amongst
//arg1 = the range you want to check for

var _targetlist, _target;
_targetlist = ds_priority_create();

with (argument0) {
    if (point_distance(x,y,other.x,other.y) < argument1)
    { ds_priority_add(_targetlist,id,path_position); }
}

if !ds_priority_empty(_targetlist) {
    _target = ds_priority_find_max(_targetlist);
    ds_priority_destroy(_targetlist);
    return (_target);
}
else {
    return (-1);
}


Quien me dio esta solucion es Katuko del foro de yoyogames.
Título: Re:Disparar al enemigo que va adelante.
Publicado por: metalfox6383 en Marzo 23, 2013, 07:11:58 PM
Interesante, me gusta la solucion. Asumo que ese codigo lo pones en el STEP de la torre que dispara?