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 ^^
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
}
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.
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 ^^
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?
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
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.