Cita de: dixon2010 en Octubre 29, 2018, 12:55:08 PM
Hola gusto en saludarles en esta mañana de este bello lunes 29 de octubre. Se le saluda de Maracay Estado Aragua en Venezuela.
Vuelves a agregar complejidad al código, pero no te preocupes.
Para solucionar tenemos que tomar en cuenta lo siguiente: Supongamos que un tal Axel de streets of rage 2 se siente un poco preocupado porque al parecer en la Game Off 2018 no ofrecen ningún premio solo un reconocimiento, entonces al ver que hay mucha crisis decide donar unos pocos dolares que le queda a la caja de la comunidadgm. Entonces obtendriamos esto
El código que se está manejando presenta las siguientes caracteristicas.
1. El enemigo actua cuando es el más cercano al player.
2. El player detecta solo al enemigo mas cercano.
3. Cada enemigo tiene una distancia de deteccion distinta.
El código es el siguiente:
PARA EL OBJETO player
[CREATE EVENT]Código [Seleccionar]global.distancia=150
[STEP EVENT]Código [Seleccionar]//detectar enemigos
if instance_exists(obj_parent_enemigos)
{
global.objetivo = instance_nearest(x, y, obj_parent_enemigos);
dir = point_direction(x,y,global.objetivo.x,global.objetivo.y);
if(point_distance(x,y,global.objetivo.x,global.objetivo.y) < global.distancia)
{
if ( dir < 90 || dir > 270 ) {sprite_index = spr_jugador_movimiento; image_xscale = 1;} else
if ( dir < 270 && dir > 90 ) {sprite_index = spr_jugador_movimiento; image_xscale = -1;}
}
}
PARA EL OBJETO obj_parent_enemigos
[CREATE EVENT]Código [Seleccionar]distancia=150
[STEP EVENT]Código [Seleccionar]if(global.objetivo=id)
{
global.distancia=distancia
}
PARA EL OBJETO obj_enemigo1
[CREATE EVENT]Código [Seleccionar]distancia=150
[END STEP]Código [Seleccionar]if(global.distancia=distancia && point_distance(x,y,player.x,player.y) < global.distancia)
{
//aqui colocas lo que va ha hacer el enemigo
}
PARA EL OBJETO caja
[CREATE EVENT]Código [Seleccionar]distancia=25
[END STEP]Código [Seleccionar]if(global.distancia=distancia && point_distance(x,y,player.x,player.y) < global.distancia)
{
//aqui colocas lo que va ha hacer LA CAJA
}
Para modificar las distintas distancias de los objetos del parent, se modifica la variable distancia de cada objeto en el evento create.
Al final hay un ejemplo para descargar
Muchísimas gracias por tu atención!
Al final lo solucione ya que pensaba que no tuve respuesta en este tema, ya que normalmente gamemaker me notifica por correo electrónico cuando me responden un tema y esta vez o no lo hizo o no me di cuenta (mas bien la 2..).
Al final después de muchísimas horas cambiando y probando varias cosas lo conseguí, me quedo así:
[gml]
var ex, ey;
ex = instance_nearest(x, y, obj_parent_enemigos).x;
ey = instance_nearest(x, y, obj_parent_enemigos).y;
objetivo = instance_nearest(x, y, obj_parent_enemigos);
if instance_exists(obj_parent_enemigos) and point_distance(x,y,ex,ey) < objetivo.distancia_jugador
{
dir = point_direction(x,y,objetivo.x,objetivo.y);
if ( dir < 90 || dir > 270 )
{sprite_index = spr_jugador_movimiento; image_xscale = 1;} else
if ( dir < 270 && dir > 90 )
{sprite_index = spr_jugador_movimiento; image_xscale = -1;}
}
[/gml]
Casi igual que como estaba, lo único que cambian un par de cosas, las justas.. para que funcione, mi juego es 2D top down y ahora si que si detecta cual es el jugador mas cercano y que "distancia_jugador" tiene. Te dejo una captura de pantalla para que veas el resultado final.

Y por cierto me hizo mucha gracia que pusieras en tu ejemplo mi foto de perfil jajajajaja!
La redonda roja es la "distancia_jugador", el enemigo tiene 150 y la caja 35 por eso tiene esa diferencia de tamaño y la linea roja que sale del player marca el objetivo mas cercano, en este caso era la caja, con id = 1 (lo puse para cuando habían muchos enemigos iguales..) y me dice que su radio es de 35 (la redonda roja dicha anteriormente).
Ahora si mi pj se mete dentro de la redonda roja ("distancia_jugador") se activa el if y mi personaje mira cara al enemigo mas cercano.
Bueno, muchísimas gracias por todo, toca dar por solucionado el tema, un saludo!!!!