Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: 11chrismaster22 en Noviembre 08, 2014, 06:29:22 PM

Título: Enemigo con IA (disparar y seguir)
Publicado por: 11chrismaster22 en Noviembre 08, 2014, 06:29:22 PM
Como abran leido el titulo mi problema es que necesito un enemigo con inteligencia artificial que me siga hasta un rango y luego de ese rango se regrese a donde estaba al principio, ademas que me dispare y que si llega a los limites del rango pero yo le sigo disparando me siga siguiendo... espero me allan entendido ???.

hasta haora solo tengo esto :-\:
en step del enemigo

if instance_exists(nave)
{if distance_to_object(nave) < 150
{move_towards_point(nave.x,nave.y,2)}
else {speed=0}}


con esto me sigue y si yo me alejo mucho se detiene pero no vuelve a su inicio ademas no se como hacer que dispare, gracias de antemano y espero respuestas.
Título: Re:Enemigo con IA (disparar y seguir)
Publicado por: DHX en Noviembre 08, 2014, 09:47:25 PM
No sé hacer lo que pides ( aún  ;) ), pero en el podcast de Luckylandia de esta semana, precisamente se habla de ia`s de enemigos con disparos incluidos. Échale un oido al podcast, por que está realmente bien.
Un saludo.
Título: Re:Enemigo con IA (disparar y seguir)
Publicado por: penumbra en Noviembre 08, 2014, 09:54:39 PM
Si quieres que el enemigo regrese, de alguna manera tienes que saber a qué posición regresarlo. En GML, las variables xstart y ystart almacenan la posición original de la instancia. Puedes usar esas variables para regresar al enemigo a su posición original. Otra manera es que en el evento CREATE del enemigo uses tus propias variables para guardar su posición
[gml]
xx = x
yy = y[/gml]

Para disparar, debes tener un objeto bala y cuando quieras disparar, crear una instancia de ese objeto. Hay muuuchos preguntas en el foro sobre disparar, deberías hacer una búsqueda.
Título: Re:Enemigo con IA (disparar y seguir)
Publicado por: TheSandBoxMKG en Noviembre 09, 2014, 03:13:00 AM
Cita de: penumbra en Noviembre 08, 2014, 09:54:39 PM
Si quieres que el enemigo regrese, de alguna manera tienes que saber a qué posición regresarlo. En GML, las variables xstart y ystart almacenan la posición original de la instancia. Puedes usar esas variables para regresar al enemigo a su posición original. Otra manera es que en el evento CREATE del enemigo uses tus propias variables para guardar su posición
[gml]
xx = x
yy = y[/gml]

Para disparar, debes tener un objeto bala y cuando quieras disparar, crear una instancia de ese objeto. Hay muuuchos preguntas en el foro sobre disparar, deberías hacer una búsqueda.

Regresar volando, no teletransportandose -_-
Título: Re:Enemigo con IA (disparar y seguir)
Publicado por: Clamud en Noviembre 09, 2014, 05:15:41 AM
Cita de: TheSandBoxMKG en Noviembre 09, 2014, 03:13:00 AM
Regresar volando, no teletransportandose -_-
En ese caso tendrás que hacer algo más elaborado dependiendo de cómo quieres que se mueva. Lo más fácil es usar la función move_towards_point.
Título: Re:Enemigo con IA (disparar y seguir)
Publicado por: penumbra en Noviembre 09, 2014, 05:40:31 AM
Si, yo sólo mencioné lo de guardar la posición en CREATE, ya sea con variables predefinidas o con variables creadas por el usuario.
Título: Re:Enemigo con IA (disparar y seguir)
Publicado por: 11chrismaster22 en Noviembre 09, 2014, 05:01:24 PM
primero que nada gracias por comentarios.

bueno como dijo TheSandBoxMKG no es teletransportandose es volando o caminando como lo entiendan mejor, tambien intente usar move_towards_point pero no entiendo bien como funciona ni como usarlo y el xstart y ystart lo use pero no funciono  :'( .

use esto
if instance_exists(nave)
{if distance_to_object(nave) < 150
{move_towards_point(nave.x,nave.y,2)}}

nota:nave es el objeto del jugador
Título: Re:Enemigo con IA (disparar y seguir)
Publicado por: elviskelley en Noviembre 09, 2014, 09:27:03 PM
Este tipo de ia es muy facil. ahora trabajo en un manual cuya IA tenia solo 5 fases y ya voy por 8, y se me siguen ocurriendo ideas, en fin te dije esto para que entiendas que las IA se hacen por como yo las llamo "Fases" otros les dicen "Estados"
en fin tu Ia es super sencilla, pero te lo digo a modo de que aprendas.
tu Ia debe tener varias fases, cada una de las fases activa un Script de comportamiento.
Lo principal es la primera fase que seria; "contratake" esta debe ser la primera fase pues indicas que aun si sale de su rango pero lo atacas el siga persiguiendolo a modo de contratacar.
la segunda fase seria; "rangoZona" Esta fase controlaria un rango de alejamiento de la zona inicial del enemigo, es decir cuanto podra alejarse de su hogar, o zona de resguardo, pero ignora esta fase si esta contratacando.
La tercera Fase sera; "RadioAtk"  Este seria un radio de ataque o digamos de vision, si el enemigo esta cerca es decir dentro de este radio el lo seguira y atacara, pero si se aleja de la zona hogar ignora esta y activa la fase "rangoZona"
y como vez la fase rango zona es ignorada si contrataca. en pocas palabras las tres fases estan en cordinacion una a la otra.
Es de esta manera como se piensa al crear una IA.-

Ahora como llevarlo a codigo. pues veras como
claro ante todo debes haber declarado las variables de las fases en el event create.
contratake=0; rangoZona=0; RadioAtk=0;

Ahora creamos los scripts de cada fase, osea lo que va a hacer. Pero lo dejo de ultimo antes interactuamos con ellos como si los hubieras creado.
event de colision con alguna bala.
contratake=1; //la activamos para que contrataque.

event step
if contratake then {scrAtacar();}
//si esta activo contrataque va a atacar.

if (rangoZona=0 and RadioAtk=1) then {scrAtacar();}
//si no esta activo el regresar al hogar y el enemigo esta en su zona lo ataca.

if (rangoZona=1 and contratake=0) then {RadioAtk=0; scrRegresar();}
//si no contrataca y se alejo mucho de su hogar, activa el script de regresar.

//aca viste como funcionan los scripts de fases (estados) pero ahora debes crear los scripts mencionados y colocarlos.

//para verificar si se alejo del hogar "rangoZona"
if distance_to_point(xstart,ystart,x,y) > 200  then
{rangozona=1;}
//coloque 200 como distancia maxima de alejamiento pero coloca la que gustes.

//para verificar si esta en su rango de ataque.
var ene_id;
ene_id =instance_nearests(x,y,objEnemigo); //coloca el nombre del parent enemigo.
if distance_to_point(x,y,ene_id.x,ene_id.y) < 200  then
{RadioAtk=1;}
//coloque 200 como rango de vision ajustalo a gusto.

ahora solo crea los script que mencione y coloca los codigos de perseguir y dispara o regresar al inicio osea xstart y ystart. Espero entiendas saludos.
Título: Re:Enemigo con IA (disparar y seguir)
Publicado por: 11chrismaster22 en Noviembre 10, 2014, 04:56:35 PM
Cita de: elviskelley en Noviembre 09, 2014, 09:27:03 PM
Este tipo de ia es muy facil. ahora trabajo en un manual cuya IA tenia solo 5 fases y ya voy por 8, y se me siguen ocurriendo ideas, en fin te dije esto para que entiendas que las IA se hacen por como yo las llamo "Fases" otros les dicen "Estados"
en fin tu Ia es super sencilla, pero te lo digo a modo de que aprendas.
tu Ia debe tener varias fases, cada una de las fases activa un Script de comportamiento.
Lo principal es la primera fase que seria; "contratake" esta debe ser la primera fase pues indicas que aun si sale de su rango pero lo atacas el siga persiguiendolo a modo de contratacar.
la segunda fase seria; "rangoZona" Esta fase controlaria un rango de alejamiento de la zona inicial del enemigo, es decir cuanto podra alejarse de su hogar, o zona de resguardo, pero ignora esta fase si esta contratacando.
La tercera Fase sera; "RadioAtk"  Este seria un radio de ataque o digamos de vision, si el enemigo esta cerca es decir dentro de este radio el lo seguira y atacara, pero si se aleja de la zona hogar ignora esta y activa la fase "rangoZona"
y como vez la fase rango zona es ignorada si contrataca. en pocas palabras las tres fases estan en cordinacion una a la otra.
Es de esta manera como se piensa al crear una IA.-

Ahora como llevarlo a codigo. pues veras como
claro ante todo debes haber declarado las variables de las fases en el event create.
contratake=0; rangoZona=0; RadioAtk=0;

Ahora creamos los scripts de cada fase, osea lo que va a hacer. Pero lo dejo de ultimo antes interactuamos con ellos como si los hubieras creado.
event de colision con alguna bala.
contratake=1; //la activamos para que contrataque.

event step
if contratake then {scrAtacar();}
//si esta activo contrataque va a atacar.

if (rangoZona=0 and RadioAtk=1) then {scrAtacar();}
//si no esta activo el regresar al hogar y el enemigo esta en su zona lo ataca.

if (rangoZona=1 and contratake=0) then {RadioAtk=0; scrRegresar();}
//si no contrataca y se alejo mucho de su hogar, activa el script de regresar.

//aca viste como funcionan los scripts de fases (estados) pero ahora debes crear los scripts mencionados y colocarlos.

//para verificar si se alejo del hogar "rangoZona"
if distance_to_point(xstart,ystart,x,y) > 200  then
{rangozona=1;}
//coloque 200 como distancia maxima de alejamiento pero coloca la que gustes.

//para verificar si esta en su rango de ataque.
var ene_id;
ene_id =instance_nearests(x,y,objEnemigo); //coloca el nombre del parent enemigo.
if distance_to_point(x,y,ene_id.x,ene_id.y) < 200  then
{RadioAtk=1;}
//coloque 200 como rango de vision ajustalo a gusto.

ahora solo crea los script que mencione y coloca los codigos de perseguir y dispara o regresar al inicio osea xstart y ystart. Espero entiendas saludos.

entendi todo lo de las fases y lo que explicaste y habia pensado lo mismo solo no savia como hacerlo en codigo, el codigo que pusiste lo entendi casi todo pero me da algunos errores epero me puedas contestar te mandare un mensage  :-\.