De ser así vamos a desglosar el código hasta que no quede nada de el. Jejeje.
Los datos que tu me has suministrados me indican lo siguiente:
1. El enemigo se mueve correctamente.
2. El enemigo sigue al player.
3. El enemigo no se pega a las paredes.
4. El enemigo presentó fallas luego de agregarle la función de cambiar sus sprites.
5. El enemigo presenta la única falla de que no muestra la imagen correcta al seguir al player.
Entonces en base a esos datos que tengo (suministrados por ti y por deducción), puedo concluir que el problema no se halla realmente en el toward point, ni en las máscaras de colición, por tanto nos quedan dos alternativas: Problema en el script o problema con sprites repetidos. El problema con sprites repetidos no creo que sea (a menos que tengas varios sprites repetidos jajajaja,).
Veamos, tienes cuatro sprites:
spr_enemigo_norte;
spr_enemigo_sur;
spr_enemigo_este
spr_enemigo_oeste;
Bueno, el objetivo es que el enemigo cambie sus sprites dependiendo de donde se encuentre el player, para esto se toma la dirección que tiene el player con respecto al enemigo y se determina la imagen a usar:

Las imágenes por norma general deberán tener el mismo tamaño y el mismo punto central (esto es norma general, no voy a explicar eso. ejeje). Y por ultimo estas imágenes normalmente no requieren tener precisión, por lo tanto hay que desmarcar la casilla de precisión para evitar posibles errores.
Bueno aguimos analizando y nos encontramos con el siguiente script
[gml]
switch(dir){
case "abajo":
sprite_index = spr_enemigo_sur;
break;
case "arriba":
sprite_index = spr_enemigo_norte;
break;
case "izquierda":
sprite_index = spr_enemigo_oeste;
break;
case "derecha":
sprite_index = spr_enemigo_este
break;
}
[/gml]
Este script es el responsable de cambiar las imágenes del player y recibe como orden una variable (tipo cadena de texto) llamada dir que hace referencia a la dirección en donde se encuentra el player.
El método empleado puede presentar la siguiente falla:
La falla consiste en que aunque el player está a la derecha, el enemigo sigue mirando hacia abajo porque el player se encuentra dentro del ángulo indicado como "sur."

Si ese es el caso, repórtalo.
Entonces el código switch anterior, al parecer está tabajando muy bien, según micaso. Pero pueden presentarse fallas si las imágenes son las incorrectas o que el resultado final no sea el que el programador esperaba (caso de la imagen anterior).
Bueno basta de análisis, agrega el siguiente código en un evento draw o dibujo y dime lo que vez:
[gml]
//Dibujando al player
draw_sprite(sprite_index,image_index,x,y);
//texto
dx=0;
dy=40;
txt="";
ver="txt";
if(ver!="dir"){draw_text(dx,dy,"dir: "+string(dir));dy+=20;if(dy>room_height-20){dy=0;dx+=room_width/2}}
if(ver!="txt"){draw_text(dx,dy,"txt: "+string(txt));dy+=20;if(dy>room_height-20){dy=0;dx+=room_width/2}}
[/gml]
En la pantalla aparecerá la variable dir reflejada y debes indicar si esta cambia correctamente según la posición del player.
Los datos que tu me has suministrados me indican lo siguiente:
1. El enemigo se mueve correctamente.
2. El enemigo sigue al player.
3. El enemigo no se pega a las paredes.
4. El enemigo presentó fallas luego de agregarle la función de cambiar sus sprites.
5. El enemigo presenta la única falla de que no muestra la imagen correcta al seguir al player.
Entonces en base a esos datos que tengo (suministrados por ti y por deducción), puedo concluir que el problema no se halla realmente en el toward point, ni en las máscaras de colición, por tanto nos quedan dos alternativas: Problema en el script o problema con sprites repetidos. El problema con sprites repetidos no creo que sea (a menos que tengas varios sprites repetidos jajajaja,).
Veamos, tienes cuatro sprites:
spr_enemigo_norte;
spr_enemigo_sur;
spr_enemigo_este
spr_enemigo_oeste;
Bueno, el objetivo es que el enemigo cambie sus sprites dependiendo de donde se encuentre el player, para esto se toma la dirección que tiene el player con respecto al enemigo y se determina la imagen a usar:

Las imágenes por norma general deberán tener el mismo tamaño y el mismo punto central (esto es norma general, no voy a explicar eso. ejeje). Y por ultimo estas imágenes normalmente no requieren tener precisión, por lo tanto hay que desmarcar la casilla de precisión para evitar posibles errores.
Bueno aguimos analizando y nos encontramos con el siguiente script
[gml]
switch(dir){
case "abajo":
sprite_index = spr_enemigo_sur;
break;
case "arriba":
sprite_index = spr_enemigo_norte;
break;
case "izquierda":
sprite_index = spr_enemigo_oeste;
break;
case "derecha":
sprite_index = spr_enemigo_este
break;
}
[/gml]
Este script es el responsable de cambiar las imágenes del player y recibe como orden una variable (tipo cadena de texto) llamada dir que hace referencia a la dirección en donde se encuentra el player.
El método empleado puede presentar la siguiente falla:
La falla consiste en que aunque el player está a la derecha, el enemigo sigue mirando hacia abajo porque el player se encuentra dentro del ángulo indicado como "sur."

Si ese es el caso, repórtalo.
Entonces el código switch anterior, al parecer está tabajando muy bien, según micaso. Pero pueden presentarse fallas si las imágenes son las incorrectas o que el resultado final no sea el que el programador esperaba (caso de la imagen anterior).
Bueno basta de análisis, agrega el siguiente código en un evento draw o dibujo y dime lo que vez:
[gml]
//Dibujando al player
draw_sprite(sprite_index,image_index,x,y);
//texto
dx=0;
dy=40;
txt="";
ver="txt";
if(ver!="dir"){draw_text(dx,dy,"dir: "+string(dir));dy+=20;if(dy>room_height-20){dy=0;dx+=room_width/2}}
if(ver!="txt"){draw_text(dx,dy,"txt: "+string(txt));dy+=20;if(dy>room_height-20){dy=0;dx+=room_width/2}}
[/gml]
En la pantalla aparecerá la variable dir reflejada y debes indicar si esta cambia correctamente según la posición del player.