Noticias

Importante: ¡Si quieres publicar tu juego no olvides leer este tema!

Comunidad Game Maker

Bienvenid@ a la comunidad hispana de Game Maker. Nuestro objetivo es crear videojuegos y dar soporte en castellano de GM. Para mejorar nuestro servicio hemos implantado, como adicion al reglamento general, algunas normas especificas en los subforos más comunes. ¡No olvides informarte antes de participar!.

Autor Tema: Problema a la hora de seguir un objeto (Tower Defense)  (Leído 538 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Momoni

en: Octubre 09, 2020, 09:56:13 pm
Tengo un problema, a la hora de que una torreta mire a los enemigos

Este seria el codigo que uso
 Create
seguir = false
rango = 50
 

 Step

distancia = distance_to_object(o_e1)
if distancia < rango {posicion = 1} else {posicion = 0}

Draw 

if posicion = 1
{draw_sprite_ext(sprite0,0,x,y,0.75,0.75,point_direction(x,y,distancia.x,distancia.y),c_white,1)}
else
{draw_sprite_ext(sprite0,0,x,y,0.75,0.75,direction,c_white,1)}

Pues el error es que en la parte de draw, siempre vera al primer objeto que paso, y cada que "posicion = 1" siempre mirara al que va de primero hasta que sea eliminado. Y quiero que vea siempre al que tenga mas cerca o poder modificarlo (mirar al mas cerca, mas lejano, etc)
« última modificación: Octubre 10, 2020, 12:13:25 am por Momoni »

 


No Tienes Permisos Para Dar Puntos
point 0 Puntos

Este tema no recibió puntos.


Desconectado T789

Respuesta #1 en: Octubre 10, 2020, 12:06:25 am
Saludos Momoni

El problema esta en el evento draw, mas que nada cuando dibujas el sprite, si mal no veo estas usando la funcion point_direction para coger la direccion entre tus (x, y) y las (distancia.x, distancia.y). Ahi es donde radica el problema, pues la funcion "distance_to_object()" que usas en el evento step, solo almacena la distancia no el id del objeto. Sugiero que lo hagas dandole el valor de otra funcion: "collision_circle()" y de paso te puedes ahorrar lo del evento step en el evento draw
/// Event Draw
var distObj;
distObj = collision_circle (x, y, rango, o_e1, 0, true); //Devolver el id de la instancia que entro en el rango del circulo de colision

// Detectar si paso el radio
if (distance_to_object(o_e1) < rango)
  draw_sprite_ext(sprite0, 0, x, y, 0.75, 0.75, point_direction(x, y, distObj.x, distObj.y), c_white, 1)
  else
  draw_sprite_ext(sprite0, 0, x, y, 0.75, 0.75, direction, c_white, 1)
De esta forma puedes hacerlo mas lite xD

Por cierto si te preguntas como trabaja la funcion de "collision_circle", ajunto su documentacion:
https://docs.yoyogames.com/source/dadiospice/002_reference/movement%20and%20collisions/collisions/collision_circle.html

 
Los siguientes usuarios dieron las gracias a este tema: Momoni


Desconectado Momoni

Respuesta #2 en: Octubre 10, 2020, 02:04:44 am

Variable <unknown_object>.y(1, -2147483648) not set before reading it.
 at gml_Object_o_t1_DrawEvent_1 (line 7) -   draw_sprite_ext(sprite0, 0, x, y, 0.75, 0.75, point_direction(x, y, distObj.x, distObj.y), c_white, 1)

Me sale ese error. Pero segun he estado probando, el error da es cuando el enemigo choca contra el borde del circulo de colision, si creo la torreta justo cuando va a entrar o salir del circulo el enemigo, salta ese error. Pero cuando lo creo desde que esta adentro, si lo sigue normal hasta que sale y da el error

 


Desconectado T789

Respuesta #3 en: Octubre 10, 2020, 02:25:38 am
Oh si... Eso sucede porque si no hay una instancia enemiga, entonces solo se estaria dibujando con el angulo .x de una variable con un id vacio. Solucionalo facilmente verificando primero si hubo colision en el circulo
/// Event Draw
var inCircle;
inCircle = collision_circle (x, y, rango, o_e1, 0, true);
if (inCircle)
  distObj = inCircle //Devolver el id de la instancia que entro en el rango del circulo de colision

// Detectar si paso el radio
if (distance_to_object(o_e1) < rango)
  draw_sprite_ext(sprite0, 0, x, y, 0.75, 0.75, point_direction(x, y, distObj.x, distObj.y), c_white, 1)
  else
  draw_sprite_ext(sprite0, 0, x, y, 0.75, 0.75, direction, c_white, 1)
Tambien sugiero que añadas la variable distObj en el evento create y que le des un valor predeterminado de "direction" para evitar que cuando no haya colision en el circulo simplemente muestre ese valor o... Si ya hubo una colision simplemente cuando el enemigo salga ya tendrias una direccion antigua

 
Los siguientes usuarios dieron las gracias a este tema: Momoni


Desconectado Momoni

Respuesta #4 en: Octubre 10, 2020, 02:30:26 am
Ahora si me funciona! Mil gracias

 


Desconectado MAXGAME2000

Respuesta #5 en: Octubre 22, 2020, 12:54:02 am
Hola! Que bueno que se haya solucionado tu problema, igual acá tengo otra solución por si te interesa.
Podrías, en vez de hacer referencia al objeto "o_e1", buscar el más cercano. Al "distance_to_object(o_e1)"  lo cambias por "distance_to_object(instance_nearest(x,y,o_e1))"
Entonces solo cambiarías ese pedacito de tu código. Quedaría:

Step

distancia = distance_to_object(instance_nearest(x,y,o_e1))
if distancia < rango {posicion = 1} else {posicion = 0}

y listo, no necesitarías cambiar nada más, que yo sepa  :-[