Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: NOKAUBURE en Octubre 31, 2011, 10:19:10 PM

Título: [SOLUCIONADO ]obtener la id de la instancia con cierta variable
Publicado por: NOKAUBURE en Octubre 31, 2011, 10:19:10 PM
Buenas, estoy haciendo un juego tipo age of empires. Hay 4 clases, guerrero, arquero, mago y clerigo. Ya acabe 3, el clerigo me da problemas.

Todas las unidades son controladas por el CPU a no ser que las seleccione yo (y las controle). El clerigo tiene 2 habilidades: martillazo y sanar. Pos weno resulta que la CPU solo hace martillazos, es decir, no detecta unidades aliadas para sanarlas.

Como hago para que:

- Una instancia busca a otra instancia (le devuelve la ID de esa instancia) dentro de una region circular de 600 pixeles y que tenga esta condicion: HP < MAXHP (la variable HP es menor que la variable MAXHP)


Es una pregunta dificil, de GML avanzado, pero lo agradeceria mucho ^^
Título: Re: obtener la id de la instancia con cierta variable
Publicado por: elviskelley en Noviembre 01, 2011, 12:58:51 AM
oye primero colocar en el titulo de la pregunta el icono que corresponde, contestare por que me parece interesante.
event step
var a;
a=instance_nearets(x,y,objquequierasobtener la ID)
if (a.HP < MAXHP) and distance_to_object(a)<300
{
el codigo de movimiento
}
Título: Re: obtener la id de la instancia con cierta variable
Publicado por: MaanuRP en Noviembre 01, 2011, 01:21:29 AM
No es necesario guardar la ID del objeto, solo con un "With" alcanza :)

Aqui te hice un lindo ejemplo y te lo dije, seguro lo entiendes, es simple :D

Saludos!

PD para NOKAUBURE: Solo te lo hice a 100 de rango, para que te sea mas facil visualizarlo, porque lo hice en una room de solo 256*256, asi se ve mas rapido.

PD para elviskelley: Creo que el no quiere saber que instancia es la que esta mas cerca, sino todas las que esten en un circulo de accion. Perdon si me equivoco.
Título: Re: obtener la id de la instancia con cierta variable
Publicado por: NOKAUBURE en Noviembre 01, 2011, 11:06:39 AM
Elvis, probe tu opcion, y en el script de habilidades puse esto:

[gml]if skill[argument0] = 'sanar'
{
if instance_exists(allyid) = false
{
if equipo = 0 {allyid = instance_nearest(x,y,jugador)}
if equipo = 1 {allyid = instance_nearest(x,y,enemigo)}
}
if allyid.HP < allyid.MAXHP and point_distance(x,y,allyid.x,allyid.y) < 600
{
// variables del sistema
speed = 0
notkiteable = 0
ataking = 1
usingskill = 1
extradamage = 1
cooldown[argument0] = 60
sprite_index = spriteskill[argument0]
image_index = 0
sound_play(sanar)
// Lo siguiente sirve para crear un texto de 30 steps encima de allyid con la CANTIDAD de HP sanada
if (allyid.MAXHP-allyid.HP)  < 200 {heal = allyid.MAXHP-allyid.HP}
else {heal = 200}
allyid.HP += 200
ID = instance_create(allyid.x,allyid.y-allyid.ytop,substract); with(ID) text = other.heal; with(ID) heal = 1;
faceto(allyid)
}
}[/gml]

Ignorad todas esas variables, forman parte del sistema del juego. Vale, con este codigo, los clerigos curan.... pero SOLO A ELLOS MISMOS ( a no ser que los maneje yo, entonces curo a quien quiero con el click derecho ). Mi teoria esque el juego busca un jugador alrededor, y al que esta mas cerca le pregunta si tiene HP quitada, y si le responde que no, deja de buscar.

Estaba pensando en que cada objeto cree un subobjeto llamado atencion, sea invisible y redirija a la ip del creador. Pero eske si hago esto, realentizare el juego (40 unidades, 20 de cada bando y con un subobjeto, serian 80 instancias!!!)



Maanu, todo y que tu ejemplo no era lo que buscaba, me acabas de dar la solucion a otro problema que tenia xD

Algunas unidades, como el guerrero, hacen atakes terremoto, es decir, da?an a unidades adyacentes. Como no sabia hacerlo, simplemente creaba una instancia que duraba 1 step, y los que colisionaran con esa instancia se quitaban vida. De tu manera me ahorro instancias, esta muy bien ^^
Título: Re: obtener la id de la instancia con cierta variable
Publicado por: MaanuRP en Noviembre 01, 2011, 01:20:42 PM
Cita de: NOKAUBURE en Noviembre 01, 2011, 11:06:39 AM
Maanu, todo y que tu ejemplo no era lo que buscaba

Lo siento, habia entendido que necesitabas que un objeto cure a todos los demas que estaban en un rango "x" de distancia de ?l mismo y que tuvieran la salud menor de la maxima.

Que es lo que querias?
Título: Re: obtener la id de la instancia con cierta variable
Publicado por: NOKAUBURE en Noviembre 01, 2011, 01:50:36 PM
EDITADO: Ya lo solucione uf  :-[

[gml]if selected = 0
{
if equipo = 0 {skilltarget = jugador}
if equipo = 1 {skilltarget = enemigo}
for( i = 0 ; i < instance_number(skilltarget) ; i += 1 )
{
   obj = instance_find(skilltarget,i);
   if( obj.HP < obj.MAXHP ) and point_distance(x,y,obj.x,obj.y) < 600
   {
       allyid = obj;
       break;
   }
}
}[/gml]

Esta pieza de codigo para el CPU encuentra una unidad de mi mismo bando da?ada, y si no esta a 600 pixeles de distancia, busca otra
Título: Re: [SOLUCIONADO ]obtener la id de la instancia con cierta variable
Publicado por: elviskelley en Noviembre 01, 2011, 09:12:20 PM
algo parecido a lo  que quice implementar solo que de instance_nearets(id mas cercana) a instance_find(id mas lejana) claro era logico establecer la mas lejana y limitar el rango con point_distance-. Es bueno saber que puedes interpretar el GML bien.