Buenas familia. Otra vez ando por aqui.
Ahora tengo la siguiente cuestion. Alguien sabe o tiene alguna idea de como hacer para que un personaje siga los pasos del player??
Incluyendo, saltos, subidas y bajadas de escaleras. Etc etc.
Por la verdad es que no se me.ocurre ahora mismo nada de como hacer esto. Debe de haber algun truco.
A ver si entre todos lo averiguamos. Salidos y abrazos!! ;)
Me intereso mucho el tema y te traigo la solución a la mitad de tus dudas vamos a crear un enemigo que sigue al jugador y que se frena al estar a cierta distancia del jugador también el enemigo salta al detectar que no hay suelo debajo de el... (este código es experimental) bien empecemos ya? cabe destacar que el código es una versión modificada de shaun spalding y que ya tiene las colinas programadas así que tu personaje subirá colinas sin esfuerzo
vamos a crear un nuevo objeto yo le llamare OBJ_CPU y dentro de el escribiremos el siguiente codigo
en el evento CREATE del cpu
///iniciar variables
grav = 0.5; //gravedad
hsp = 0; //velocidad horizontal siempre a 0 para que el personaje no se mueva
hsp_carry = 0; //sirve para mantener al cpu sobre plataformas moviles
vsp = 0; //velocidad vertical siempre a 0 para evitar movimiento
ground=true; // estas en el suelo?
hsp_final=0 //velocidad máxima en horizontal
jump=false //evita que al saltar el enemigo se frene en el aire por la distancia
bien ya que declaramos variables agregaremos código para que el personaje o CPU haga su trabajo
en el evento STEP del cpu
//colision horizontal
if place_meeting(x+hsp,y,obj_wall)
{
yplus = 0;
//subir las cuestas
while (place_meeting(x+hsp,y-yplus,obj_wall) && yplus <= abs(1*hsp)) yplus += 1;
if place_meeting(x+hsp,y-yplus,obj_wall)
{
while (!place_meeting(x+sign(hsp),y,obj_wall)) x+=sign(hsp);
hsp = 0;
}
else
{
y -= yplus
}
}
x += hsp;
//bajar las cuestas
if !place_meeting(x,y,obj_wall) && vsp >= 0 && place_meeting(x,y+2+abs(hsp),obj_wall)
{while(!place_meeting(x,y+1,obj_wall)) {y += 1;}}
//este pedazo de codigo sirve para que el cpu siga al jugador
if instance_exists(obj_player)
{
if sign(obj_player.x - x) == -1 hsp=-2.5; //puedes modificar el valor hsp para la velocidad a la que se mueve el cpu
if sign(obj_player.x - x) == 1 hsp=2.5; //puedes modificar el valor hsp para la velocidad a la que se mueve el cpu
}
if abs(obj_player.x-x ) < 45 && jump=false //este valor sirve para que el cpu se detenga entre mas alto mas lejos estara del jugador
{
hsp=0
}
// este código sirve para que el cpu salte sobre bloques y agujeros (es algo inestable)
if place_meeting(x+10,y, obj_wall)
{
vsp = -9;
jump=true
}
if place_meeting(x-10,y, obj_wall)
{
vsp = -9;
jump=true
}
//colision vertical
if (place_meeting(x,y+vsp,obj_wall))
{
while(!place_meeting(x,y+sign(vsp),obj_wall))
{
y += sign(vsp);
}
vsp = 0;
}
y += vsp;
//gravedad
if (vsp < 10) vsp += grav;
//estas en el suelo?
if place_meeting(x, y+vsp+1, obj_wall)
{
ground = true;
jump=false
}
else
ground = false;
sobre lo de subir escaleras y eso te la debo realmente no se como podría ser la lógica para eso
Lo primero, muchas gracias cristopher por contestar.
La verdad es que yo he pensado en otro metodo. Pero ya que me comentas este, le echare una ojeada.
Por cierto, tu lo has probado?? Funciona??
Otra cosa, eso del yplus para subir cuestas no lo conocia. Me puedes explicar un poco mas como funciona yplus??
El tema de subir escaleras en el metodo que yo he pensado en teoria deberia de funcionar. Pero tengo que probarlo.
En cualquier caso, cuando consiga hacer una prueba ya os comento.
Muchas gracias. A ver si entre todos lo conseguimos hacer!!! ;)
Cita de: cristopher2545 en Septiembre 21, 2017, 03:44:01 AM
Me intereso mucho el tema y te traigo la solución a la mitad de tus dudas vamos a crear un enemigo que sigue al jugador y que se frena al estar a cierta distancia del jugador también el enemigo salta al detectar que no hay suelo debajo de el... (este código es experimental) bien empecemos ya? cabe destacar que el código es una versión modificada de shaun spalding y que ya tiene las colinas programadas así que tu personaje subirá colinas sin esfuerzo
vamos a crear un nuevo objeto yo le llamare OBJ_CPU y dentro de el escribiremos el siguiente codigo
en el evento CREATE del cpu
///iniciar variables
grav = 0.5; //gravedad
hsp = 0; //velocidad horizontal siempre a 0 para que el personaje no se mueva
hsp_carry = 0; //sirve para mantener al cpu sobre plataformas moviles
vsp = 0; //velocidad vertical siempre a 0 para evitar movimiento
ground=true; // estas en el suelo?
hsp_final=0 //velocidad máxima en horizontal
jump=false //evita que al saltar el enemigo se frene en el aire por la distancia
bien ya que declaramos variables agregaremos código para que el personaje o CPU haga su trabajo
en el evento STEP del cpu
//colision horizontal
if place_meeting(x+hsp,y,obj_wall)
{
yplus = 0;
//subir las cuestas
while (place_meeting(x+hsp,y-yplus,obj_wall) && yplus <= abs(1*hsp)) yplus += 1;
if place_meeting(x+hsp,y-yplus,obj_wall)
{
while (!place_meeting(x+sign(hsp),y,obj_wall)) x+=sign(hsp);
hsp = 0;
}
else
{
y -= yplus
}
}
x += hsp;
//bajar las cuestas
if !place_meeting(x,y,obj_wall) && vsp >= 0 && place_meeting(x,y+2+abs(hsp),obj_wall)
{while(!place_meeting(x,y+1,obj_wall)) {y += 1;}}
//este pedazo de codigo sirve para que el cpu siga al jugador
if instance_exists(obj_player)
{
if sign(obj_player.x - x) == -1 hsp=-2.5; //puedes modificar el valor hsp para la velocidad a la que se mueve el cpu
if sign(obj_player.x - x) == 1 hsp=2.5; //puedes modificar el valor hsp para la velocidad a la que se mueve el cpu
}
if abs(obj_player.x-x ) < 45 && jump=false //este valor sirve para que el cpu se detenga entre mas alto mas lejos estara del jugador
{
hsp=0
}
// este código sirve para que el cpu salte sobre bloques y agujeros (es algo inestable)
if place_meeting(x+10,y, obj_wall)
{
vsp = -9;
jump=true
}
if place_meeting(x-10,y, obj_wall)
{
vsp = -9;
jump=true
}
//colision vertical
if (place_meeting(x,y+vsp,obj_wall))
{
while(!place_meeting(x,y+sign(vsp),obj_wall))
{
y += sign(vsp);
}
vsp = 0;
}
y += vsp;
//gravedad
if (vsp < 10) vsp += grav;
//estas en el suelo?
if place_meeting(x, y+vsp+1, obj_wall)
{
ground = true;
jump=false
}
else
ground = false;
sobre lo de subir escaleras y eso te la debo realmente no se como podría ser la lógica para eso
Cita de: nonoroman en Septiembre 21, 2017, 11:31:04 AM
Lo primero, muchas gracias cristopher por contestar.
La verdad es que yo he pensado en otro metodo. Pero ya que me comentas este, le echare una ojeada.
Por cierto, tu lo has probado?? Funciona??
Otra cosa, eso del yplus para subir cuestas no lo conocia. Me puedes explicar un poco mas como funciona yplus??
El tema de subir escaleras en el metodo que yo he pensado en teoria deberia de funcionar. Pero tengo que probarlo.
En cualquier caso, cuando consiga hacer una prueba ya os comento.
Muchas gracias. A ver si entre todos lo conseguimos hacer!!! ;)
Cita de: cristopher2545 en Septiembre 21, 2017, 03:44:01 AM
Me intereso mucho el tema y te traigo la solución a la mitad de tus dudas vamos a crear un enemigo que sigue al jugador y que se frena al estar a cierta distancia del jugador también el enemigo salta al detectar que no hay suelo debajo de el... (este código es experimental) bien empecemos ya? cabe destacar que el código es una versión modificada de shaun spalding y que ya tiene las colinas programadas así que tu personaje subirá colinas sin esfuerzo
vamos a crear un nuevo objeto yo le llamare OBJ_CPU y dentro de el escribiremos el siguiente codigo
en el evento CREATE del cpu
///iniciar variables
grav = 0.5; //gravedad
hsp = 0; //velocidad horizontal siempre a 0 para que el personaje no se mueva
hsp_carry = 0; //sirve para mantener al cpu sobre plataformas moviles
vsp = 0; //velocidad vertical siempre a 0 para evitar movimiento
ground=true; // estas en el suelo?
hsp_final=0 //velocidad máxima en horizontal
jump=false //evita que al saltar el enemigo se frene en el aire por la distancia
bien ya que declaramos variables agregaremos código para que el personaje o CPU haga su trabajo
en el evento STEP del cpu
//colision horizontal
if place_meeting(x+hsp,y,obj_wall)
{
yplus = 0;
//subir las cuestas
while (place_meeting(x+hsp,y-yplus,obj_wall) && yplus <= abs(1*hsp)) yplus += 1;
if place_meeting(x+hsp,y-yplus,obj_wall)
{
while (!place_meeting(x+sign(hsp),y,obj_wall)) x+=sign(hsp);
hsp = 0;
}
else
{
y -= yplus
}
}
x += hsp;
//bajar las cuestas
if !place_meeting(x,y,obj_wall) && vsp >= 0 && place_meeting(x,y+2+abs(hsp),obj_wall)
{while(!place_meeting(x,y+1,obj_wall)) {y += 1;}}
//este pedazo de codigo sirve para que el cpu siga al jugador
if instance_exists(obj_player)
{
if sign(obj_player.x - x) == -1 hsp=-2.5; //puedes modificar el valor hsp para la velocidad a la que se mueve el cpu
if sign(obj_player.x - x) == 1 hsp=2.5; //puedes modificar el valor hsp para la velocidad a la que se mueve el cpu
}
if abs(obj_player.x-x ) < 45 && jump=false //este valor sirve para que el cpu se detenga entre mas alto mas lejos estara del jugador
{
hsp=0
}
// este código sirve para que el cpu salte sobre bloques y agujeros (es algo inestable)
if place_meeting(x+10,y, obj_wall)
{
vsp = -9;
jump=true
}
if place_meeting(x-10,y, obj_wall)
{
vsp = -9;
jump=true
}
//colision vertical
if (place_meeting(x,y+vsp,obj_wall))
{
while(!place_meeting(x,y+sign(vsp),obj_wall))
{
y += sign(vsp);
}
vsp = 0;
}
y += vsp;
//gravedad
if (vsp < 10) vsp += grav;
//estas en el suelo?
if place_meeting(x, y+vsp+1, obj_wall)
{
ground = true;
jump=false
}
else
ground = false;
sobre lo de subir escaleras y eso te la debo realmente no se como podría ser la lógica para eso
wow wow WOW! son muchas preguntas soy solo un hombre aquí :love: pero bueno tratare de responderlas todas ya que solo soy un novato en esto del gml jaja
el método funciona porque yo lo programe, este codigo es una vercion modificada de la inteligencia artificial enemiga para el beat em up que desarollo asi que funciona perfectamente <3 ,el personaje te sigue hasta el infinito y se detiene a cierta distancia de tu personaje esta variable se cumple siempre algo parecido a tails en sonic el erizo el sigue a sonic pero cuando sonic frena el también lo hace justo a una distancia predeterminada para no quedar mal posicionado todos los codigos funcionan bien exceptuando el de salto del cpu el cual se buguea un poco pero hace su función el cpu salta cuando ve un agujero siempre.
no te voy a mentir desconozco muy bien que hace yplus ya que ese código es parte del código de shaun spalding pero usando la lógica yplus empieza en 0 cuando no estas en una colina y va sumando de uno en uno cuando estas subiendo una y restando de uno en uno cuando la vaz bajando el código de bajada lo invento un tipo en los comentarios de dicho vídeo ya que shaun solo programo el de subida realmente no se explicar bien porque desconozco mucho la función pero funciona solo debes poner colinas no mayores a 45 grados y el personaje y enemigos la subirán sin problemas
yo creo que si nos ponemos a pensar un poco es jugar con el pathfinding del cpu detectar si el personaje esta muy arriba en el plano y a la vez que detectar si no tiene plataformas para subir o escaleras para trepar de no ser asi quedarse quieto hasta que el jugador baje de lo contrario subir por las plataformas para alcanzar al jugador pero claro planearlo es mas facil y programarlo es cuando el dolor empieza jaja
no hay problema colega cuando consigas algo compartelo para poder ver que lograste y poder nutrirnos con los metodos :) saludos
O pueden hacer el truco que utilizan muchos juegos al crear un compañero permanente que sigue al jugador, y no es nada mas y menos que el amigo volador o trepador de pequeño tamaño, por dar un ejemplo están estos.
Los que lo siguen volando.
La hada que mas odio de los juegos por ser muy agobiante con sus sonidos de bucle.
Navi /The Legend of Zelda: Ocarina of Time
(https://i.gyazo.com/e29771a5f1211c60b34927242b3fe2fd.gif)
El gato/murciélago anaranjado.
fidget/ DUST: AN ELYSIAN TAIL
https://i.gyazo.com/51a04787630ce80b1a5c91053915b685.gif
Los que lo siguen encima (literalmente).
El murcielago purpura
Laylee /Yooka-Laylee
(https://i.gyazo.com/ac8d4a1867224ef1a1210a2b42cfe74b.gif)
El pájaro rojo
Kazooie /Banjo-Kazooie
(https://i.gyazo.com/da0944d7ae243124a5fa5a6dce8dd3d9.gif)
Incluso en mi trailer de juego tengo poderes que crean objetos que siguen al jugador a donde sea que vaya
Honestamente te aconsejo que experimentes con lo básico, ya que si haces un compañero que te siga el cual no hace absolutamente nada, seria desperdiciar las ventajas que este puede tener, en mi caso los objetos que creo se encargan de proteger al jugador de los enemigos, algo asi como el Aku-Aku de crash bandicoot, el cual tiene la principal función de proteger al jugador de impacto y colisiones enemigas, y como puedes ver el vuela y ignora toda programación de colisiones con todo, como puedes ver es estrategia en vez de crear elementos innecesarios.
Cita de: Naitsabes0 en Septiembre 21, 2017, 10:12:30 PM
O pueden hacer el truco que utilizan muchos juegos al crear un compañero permanente que sigue al jugador, y no es nada mas y menos que el amigo volador o trepador de pequeño tamaño, por dar un ejemplo están estos.
Los que lo siguen volando.
La hada que mas odio de los juegos por ser muy agobiante con sus sonidos de bucle.
Navi /The Legend of Zelda: Ocarina of Time
(https://i.gyazo.com/e29771a5f1211c60b34927242b3fe2fd.gif)
El gato/murciélago anaranjado.
fidget/ DUST: AN ELYSIAN TAIL
https://i.gyazo.com/51a04787630ce80b1a5c91053915b685.gif
Los que lo siguen encima (literalmente).
El murcielago purpura
Laylee /Yooka-Laylee
(https://i.gyazo.com/ac8d4a1867224ef1a1210a2b42cfe74b.gif)
El pájaro rojo
Kazooie /Banjo-Kazooie
(https://i.gyazo.com/da0944d7ae243124a5fa5a6dce8dd3d9.gif)
Incluso en mi trailer de juego tengo poderes que crean objetos que siguen al jugador a donde sea que vaya
Honestamente te aconsejo que experimentes con lo básico, ya que si haces un compañero que te siga el cual no hace absolutamente nada, seria desperdiciar las ventajas que este puede tener, en mi caso los objetos que creo se encargan de proteger al jugador de los enemigos, algo asi como el Aku-Aku de crash bandicoot, el cual tiene la principal función de proteger al jugador de impacto y colisiones enemigas, y como puedes ver el vuela y ignora toda programación de colisiones con todo, como puedes ver es estrategia en vez de crear elementos innecesarios.
pues que te puedo decir tienes un punto ahi pero mira tails por ejemplo es prácticamente inutil en cada juego donde lo veo salta a barrancos se pega contra cosas hace prácticamente lo que le entra en gana un compañero no forzosamente tiene que ser util para estar en un juego un compañero debe estar ahi para servir de distracción a los enemigos seamos serios aun no hay un compañero que sea totalmente util para lo que el jugador quiere que sea automático eh independiente generalmente los compañeros solo sirven como un escudo o como un arma movil que ataca a todo ser que se le atraviesa enfrente otro ejemplo son las mascotas en el juego castle crashers son inutiles hasta cierto punto que sio que atacan algunas veces y hacen cosas como recoger comida o eso pero que te digo yo en mi opinion personal
un compañero es una distracción para los enemigos es intuil es bonito y te da el conosimiento nesesario para crear enemigos que si valgan la pena. :)
Buenas. Lo primero, gracias por responder a todos los que lo han hecho.
He probado un poco el metodo que tengo en mente. Y bueno. Parece que funciona pero con muchos efectoa secundarios no deseables por decirlo de alguna manera.
Asi que en cuanto pueda, mirare otra vez, porque quizas puliendolo un poco. Puedo dar con la tecla.
Bueno si consigo hacerlo funcionar os cuento
Saludos y abrazos. ;)
Cita de: cristopher2545 en Septiembre 21, 2017, 10:34:26 PM
Cita de: Naitsabes0 en Septiembre 21, 2017, 10:12:30 PM
O pueden hacer el truco que utilizan muchos juegos al crear un compañero permanente que sigue al jugador, y no es nada mas y menos que el amigo volador o trepador de pequeño tamaño, por dar un ejemplo están estos.
Los que lo siguen volando.
La hada que mas odio de los juegos por ser muy agobiante con sus sonidos de bucle.
Navi /The Legend of Zelda: Ocarina of Time
(https://i.gyazo.com/e29771a5f1211c60b34927242b3fe2fd.gif)
El gato/murciélago anaranjado.
fidget/ DUST: AN ELYSIAN TAIL
https://i.gyazo.com/51a04787630ce80b1a5c91053915b685.gif
Los que lo siguen encima (literalmente).
El murcielago purpura
Laylee /Yooka-Laylee
(https://i.gyazo.com/ac8d4a1867224ef1a1210a2b42cfe74b.gif)
El pájaro rojo
Kazooie /Banjo-Kazooie
(https://i.gyazo.com/da0944d7ae243124a5fa5a6dce8dd3d9.gif)
Incluso en mi trailer de juego tengo poderes que crean objetos que siguen al jugador a donde sea que vaya
Honestamente te aconsejo que experimentes con lo básico, ya que si haces un compañero que te siga el cual no hace absolutamente nada, seria desperdiciar las ventajas que este puede tener, en mi caso los objetos que creo se encargan de proteger al jugador de los enemigos, algo asi como el Aku-Aku de crash bandicoot, el cual tiene la principal función de proteger al jugador de impacto y colisiones enemigas, y como puedes ver el vuela y ignora toda programación de colisiones con todo, como puedes ver es estrategia en vez de crear elementos innecesarios.
pues que te puedo decir tienes un punto ahi pero mira tails por ejemplo es prácticamente inutil en cada juego donde lo veo salta a barrancos se pega contra cosas hace prácticamente lo que le entra en gana un compañero no forzosamente tiene que ser util para estar en un juego un compañero debe estar ahi para servir de distracción a los enemigos seamos serios aun no hay un compañero que sea totalmente util para lo que el jugador quiere que sea automático eh independiente generalmente los compañeros solo sirven como un escudo o como un arma movil que ataca a todo ser que se le atraviesa enfrente otro ejemplo son las mascotas en el juego castle crashers son inutiles hasta cierto punto que sio que atacan algunas veces y hacen cosas como recoger comida o eso pero que te digo yo en mi opinion personal
un compañero es una distracción para los enemigos es intuil es bonito y te da el conosimiento nesesario para crear enemigos que si valgan la pena. :)
Pues como decirte que no si es cierto, hay personajes que son tan estéticos hasta el punto que una piedra tiene mas utilidad por el hecho de ser un obstáculo, y claro el personaje que mencionas ni siquiera sirve para hacer diálogos, pero si analizas los 4 que te mencione, todos tienen una utilidad tanto a modo de enseñanza en el juego, como ayuda en la aventura, algunos son hasta vitales para terminar el juego, la verdad programaría un compañero para mi juego que funcione de forma independiente, pero no corresponde a la trama, básicamente volaría orbitando al jugador para moverse de forma perfecta (matemáticamente hablando), y no tendría ninguna colisión ni interacción con el entorno, simplemente tendría la capacidad de disparar cuando los enemigos entren en su rango de visión, con solo hacer esto, el compañero resultaría ser uno de los mas útiles en los juegos, asiéndole casi nada de código, y mas encima se comportaría de forma predecible como si fuera un arma automática, ahora que lo pienso mejor debería considerarlo como un "power up" para futuros proyectos :-\.
Bueno os cuento family.
Despues de hacer pruebas con mi teoria. Habia conseguido que siguiera al player. Tanto horizontal como verticalmente (subiendo escaleras) y saltos.
Todo funcionaba. Pero con un pero. Era muy inestable. Se bloqueaba mucho, etc etc.
Asi que finalmente he decidido usar el metodo de christofer y adaptar un poco mi juego pues al sistema mas fiable que ahora mismo tengo.
A pesar de todo esto. Mi sistema no iba mal encaminado. Quizas con un par de arreglos y ajustes podria haber cogido mas fiabilidad. Pero bueno, compense tiempo - resultados y realmente para el juego que estoy haciendo no me merece la pena. Lo puedo adaptar al codigo y listo.
Asi que de momento. Se queda pendiente por desarrollar un codigo que persiga al player tambien por las escaleras.
Saludos y abrazos. ;D
Hay juegos en los que han solucionado esos problemas de forma muy sencilla, como en Portrait of Ruin: el personaje secundario repite los movimientos del personaje principal con un retardo de pocos frames, y si no puede saltar un obstáculo o queda atrapado, simpelente aparece cerca del personaje principal después de un tiempo.
Si. Pero como se hace??? Esa es la pregunta. ;)
Cita de: Clamud en Septiembre 24, 2017, 06:59:41 PM
Hay juegos en los que han solucionado esos problemas de forma muy sencilla, como en Portrait of Ruin: el personaje secundario repite los movimientos del personaje principal con un retardo de pocos frames, y si no puede saltar un obstáculo o queda atrapado, simpelente aparece cerca del personaje principal después de un tiempo.
Recordé la demo "Tile Based Platformer" que se descarga usando GMS (ve la imagen adjunta), ahí aparece un método que utiliza varios ds_queue para almacenar los valores de sprite y posición. Lo malo es que no tiene muchos comentarios en el código.
supongo que puedes usar el pathfinding aunque ahi no tengo experiencia pero encontre este video talvez te de una idea esta en ingles pero se puede ver como los enemigos hacen su trabajo https://www.youtube.com/watch?v=olE_gLbESnE