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 al hacer un objeto saltar de un camino  (Leído 361 veces)

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

Desconectado Gatete

en: Noviembre 04, 2019, 07:48:59 pm
A ver si me explico, estoy intentando programar una objeto que circula por objetos bajo el objeto parental obj_pathparent. Y lo que quiero es que cuando dicha plataforma colisione con otro objeto llamado obj_path_launcher haga a este objeto saltar fuera del carril hasta colisionar con otro carril.

¿Como puedo conseguir eso?

Adjunto video y archivo .gmz de lo que quiero hacer
https://www.youtube.com/watch?v=CYbfvFpQKrA
« última modificación: Noviembre 04, 2019, 07:52:26 pm por Gatete »

 


No Tienes Permisos Para Dar Puntos
point 0 Puntos

Este tema no recibió puntos.


Desconectado dixon

  • Habitual
  • *
  • Puntos: 107
  • Mensajes: 56
  • Agradecido: 6 veces
  • Juegos de educación gratis dixon 2019. Prov. 4:7
    • Ver Perfil
Respuesta #1 en: Noviembre 05, 2019, 03:05:45 pm
Hola, gusto en saludarle.

Queria saber si usted se refiere al movimiento de electrones. Ellos viajan de un átomo a otro y vuelven a su órbita.

 


Desconectado Gatete

Respuesta #2 en: Noviembre 09, 2019, 11:15:48 am
Hola, gusto en saludarle.

Queria saber si usted se refiere al movimiento de electrones. Ellos viajan de un átomo a otro y vuelven a su órbita.


Nop, quiero que una plataforma se mueva a traves de una guia y cuando no la detecte caiga a otra guia colocada en la trayectoria de la plataforma y se siga moviendo a traves de ella. (.gmz en mensaje #1)

 


Desconectado MAXGAME2000

  • Visitante
  • *
  • Puntos: 1
  • Mensajes: 1
    • Ver Perfil
Respuesta #3 en: Noviembre 09, 2019, 12:06:53 pm
Creo que la pregunta está bastante mal planteada.
Dejame ver si entendí o no. Lo que tratas de hacer es que una plataforma siga un path, que al finalizarlo pegue como un "salto", y que si en la caída se encuentra con otra trayectoria, que la siga. ¿Es eso?

 


Desconectado Gatete

Respuesta #4 en: Noviembre 09, 2019, 12:32:56 pm
Creo que la pregunta está bastante mal planteada.
Dejame ver si entendí o no. Lo que tratas de hacer es que una plataforma siga un path, que al finalizarlo pegue como un "salto", y que si en la caída se encuentra con otra trayectoria, que la siga. ¿Es eso?

Efectivamente

 


Desconectado BssString

Respuesta #5 en: Noviembre 10, 2019, 05:36:50 am
Hola Gatete!

Es interesante el efecto que intentas lograr... No tengo la solución en un 100% porque hay muchas limitantes, pero quizás mi código te puede acercar a la solución que buscas.
Las funciones de Path que tiene Game Maker son muy limitadas y tengo poca experiencia en path (nunca las he usado en realidad).
Lo que se me ocurre es que puedes iterar a lo largo de los puntos de una path, creando una línea recta entre los puntos para identificar si esa recta colisiona con la plataforma, luego encuentras en qué posición colisiona y le asignas la nueva path a la plataforma en el punto exacto en el que ha colisionado:

Para que el siguiente script funcione, tienes que tener en cuenta algunas consideraciones:
1- El objeto "obj_pathparent" debe tener una variable con el index de la path a seguir, la variable en el script yo la he llamado "path".
2- La path asignada debe tener más de 2 puntos
3- La path asignada NO puede ser smooth, tiene que ser líneas rectas porque uso "collision_line" para detectar la colisión como línea (aunque si las curvas son pequeñas, creo que no debería haber problemas)
4- La velocidad vertical de la plataforma (ej: si cae por efecto de la gravedad) NO debe superar el alto del sprite en pixeles (si tu plataforma mide 16 px y cae a una velocidad de 18, entonces hay 2 pixeles donde NO se detecta la colisión, tienes que poner un límite de velocidad).
5- Este script ITERARÁ en el Step Event en cada frame de tu juego por cada "obj_pathparent" en la room, cuando una plataforma caiga fuera de la pantalla, debes eliminarla (o resetear su variable) para que no siga ITERANDO por siempre, eso podría disminuir el rendimiento del juego.

Para que funcione, tu objeto plataforma debe tener asignada una variable que le indique si está o no está en una path.

En el Create event de la plataforma:
Código: [Seleccionar]
in_a_path = true //Esto le dice al código que no ITERE detectando colisión porque ya voy en una path, no es necesario ir a otra
Cuando colisionas con el objeto "obj_path_launcher" debes hacer esa variable false para empezar a detectar la colisión.

En el Step Event de la plataforma:
Código: [Seleccionar]
if in_a_path = false {
//Itera entre cada punto de la path para detectar colisión
var my_id = id;
with obj_pathparent {
var path_size = path_get_number(path)
if path_size <= 1 continue //Si la path tiene sólo 1 punto, ignora la colisión
var punto1_x, punto1_y, punto2_x, punto2_y, distancia;
distancia = 0 //Esto mide la distancia para saber cuánto porcentaje de la Path se ha avanzado
var inst = noone; //Esto guardará mi ID si es que he colisionado con alguna path
var xx = x-path_get_x(path,0)
var yy = y-path_get_y(path,0)
for (var i=1; i<path_size; i+=1) {
if inst != noone break //Cierra el LOOP si ya detecté colisión
punto1_x = path_get_point_x(path, i-1); //esto guarda las coordenadas del punto anterior y el punto actual para comprobar colisión
punto1_y = path_get_point_y(path, i-1);
punto2_x = path_get_point_x(path, i);
punto2_y = path_get_point_y(path, i);
var escala_original = other.image_xscale
other.image_xscale = 1/sprite_get_width(other.sprite_index) //esto hace que el sprite tenga ancho 1pixel para detectar la colisión sólo como una línea vertical
inst = collision_line(xx+punto1_x,yy+punto1_y,xx+punto2_x,yy+punto2_y,other,false,false) //Detecta si la plataforma colisionó con la Path
other.image_xscale = escala_original //Regresa el sprite a tamaño normal
if inst = other { //Colisioné con una path!
var steps = 1/path_get_length(path) //Toma la distancia de 1 pixel traducido en el porcentaje de la path
var distancia_al_punto = -1
var porcentaje_elegido = -1
//Ahora itera entre esos dos puntos para saber en qué porcentaje de la Path colisioné ya que las paths se miden entre 0 a 1
var porcentaje1 = (distancia) / path_get_length(path)
var porcentaje2 = (distancia + point_distance(punto1_x,punto1_y,punto2_x,punto2_y)) / path_get_length(path)
//Esto itera entre los 2 puntos con los que he colisionado y detecta cuánto porcentaje he avanzado
for (var i=porcentaje1; i<=porcentaje2; i+=steps) { //Avanza pixel por pixel revisando en qué porcentaje de la path colisioné
var nueva_distancia = abs(xx+path_get_x(path,i)-other.x) //esto toma la distancia entre el porcentaje de la path y el origen de la plataforma
if distancia_al_punto = -1 {
distancia_al_punto = nueva_distancia
porcentaje_elegido = i
}
else if nueva_distancia < distancia_al_punto {
distancia_al_punto = nueva_distancia
porcentaje_elegido = i
}
}
if porcentaje_elegido != -1 {
var my_path_obj = id //Guardo el ID de este "obj_pathparent" con el que ha colisionado.
with other {
in_a_path = true //Le vuelve a asignar la variable in_a_path a la plataforma para que deje de detectar colisión
x = my_path_obj.x
y = my_path_obj.y
path_start(my_path_obj.path, 0, path_action_stop, 0); //Aquí elige la velocidad, si la dejas en cero entonces la plataforma se detiene.
path_position = porcentaje_elegido //Esta línea hace la MAGIA, ancla la plataforma al punto en el que ha colisionado.
}
}
}
else { //Sigue buscando
distancia = distancia + point_distance(punto1_x,punto1_y,punto2_x,punto2_y)
}

}
}
}

Eso debería anclar la plataforma a la path con la que ha colisionado. Tu le puedes asignar la velocidad a la que seguirá la nueva path.

Recuerda que para detectar si la plataforma ha llegado al final de una path o no, puedes usar:
"if (path_position = 1) { tu script aqui, la plataforma llegó al final de la path }"

Esa es la manera que se me ha ocurrido recién, no sé si se pueda hacer de una forma más sencilla.

Saludos