Hola a todos!
Bueno, mi problema es que al colisionar minimamente lateralmente (De costado) con mi plataforma movil, esta se detiene y el personaje queda trabado ahi.
Dejo el editable para que alguien me lo pueda editar y dejarlo funcionando.
Agradezco muchisimo al que lo haga, y agradeceria que me deje escrito y explicado que fue lo que hizo para que ande.
Desde ya, muchisimas gracias!
Saludos!
Hola MaanuRP tu problema es que ambos objetos los tienes en solid y al chocar suceden este tipo de cosas la soluci?n es simple, pero que es lo que deseas que suceda en vez de que se detenga? Quieres que siga movi?ndose la plataforma incluso despu?s de chocar? O quieres que rebote? Te pregunto esto porque la soluci?n m?s simple es que rebote para esto basta con que dupliques el evento de colisi?n de la plataforma con la pared al del jugador y ya. Pero si quieres que contin?e movi?ndoos abra que hacer algunas modificaciones entre ellas quitar el solid de los objetos, dependiendo de lo que quieras que si suceda pero yo te recomiendo que agregues una m?scara de colisi?n cuadrada al circulo para evitar que tu personaje ?quede volando? en las orillas.
Espero haberte ayudado si tienes dudas me avisas suerte :D
Bueenisima tu respuesta!
Gracias, pero:
Con lo de la mascara te refieres a poner en el sprite:
Modify Mask; Shape: Rectangle
Solo eso? Pero para que funcione tendria que hacer que rebote, cierto?
La verdad es que quisiera que siga su trayectoria empujando, por fisica, al jugador, que seria lo que pasaria en la realidad.
Pero se hace muy complicado esto?
asi es incluso midifique tu ejemplo y no se traba
en realidad no se a que te refieres exactamente al final, pero por lo general en un juego de plataforma las plataformas no son solidas y solo te mueven cuando estas encima de ellas pero claro es tu juego si lo que quieres es que siga moviendote aun en el aire pues modifica las condiciones para moverse el personaje al tocar la plataforma agrega que cuando este tocando de un lado tambien lo mueva (si eso es lo que quieres por lo que entendi)
Eso lo pude lograr, que rebote, pero si esta cerca del limite, se traba rebotando.
Lo que yo quiero es que la plataforma siga su trayectoria.
Y si el jugador esta al lado quiero que lo empuje.
Por ejemplo, imagina que delante tuyo hay una plataforma que va y viene. Cuando te acerques y la plataforma vuelva, te va a empujar para ese lado, suponiendo que la plataforma tenga la fuerza suficiente para empujarte, obvio.
Otro ejemplo, ahora que estas moviendo el mouse, de derecha a izquierda, de izquierda a derecha, no? Bueno, si te ponen el control remoto en el camino de tu mano (o del mouse, es lo mismo) vas a chocar contra el control remoto y lo vas a empujar hasta el lugar donde empieces a ir para el otro lado, como venias haciendo.
Ahora se entiende?
bien entiendo que es lo que deseas, y si, si se puede hacer, pero eso te trae otro problema cuando sea empujado por la plataforma aun as? quedara trabajo cuando lo empuje hasta una pared, entonces que deseas que ocurra cuando pase eso?
Mas que todo para hacer el limite de carrera de la plataforma movil uso un choque invisible que para el jugador es indiferente, asi que cuando esta lo empuje hasta este choque, no ocurrira nada inesperado creo yo.
Con que solo lo empuje y la plataforma siga rebotando donde debe es suficiente :D
Debe haber una manera simple creo yo, bah, en realidad espero que haya una manera simple jaja
A nadie mas le sucedio este error? Como hacen sus plataformas moviles para que cuando su personaje las choca del costado no se frenen?
No es el ejemplo tuyo corregido peroespero te sirva de algo, las plataformas moviles no chocan con el jugador
Cita de: 3dgeminis en Julio 29, 2011, 02:52:56 PM
No es el ejemplo tuyo corregido peroespero te sirva de algo, las plataformas moviles no chocan con el jugador
Claro, yo queria algo asi, solo que no queria que traspase, sino que solo choque, pero esto es mejor que el jugador se quede pegado xD
Me podrias explicar como hacer eso mismo que haces tu pero en mi ejemplo? Porque el tuyo se me complica para pasarlo a mi ejemplo :S
Muchisimas gracias por ese ejemplo!
Edit: Encontre un peque?o bug: Si entras a la plataforma sin saltar (Osea, caminando) esta no funciona, el personaje queda quieto y la plataforma movil se mueve sola.
Si entraste a la plataforma saltando funciona bien, pero si sales caminando, el personaje queda bajo el efecto de la plataforma movil, por lo que se mueve de acuerdo a como se esta moviendo la plataforma.
Ese bug lo conocia y estoy tratado de arreglarlo, en cuato modificar tu ejemplo vere si puedo hacerlo.
Puedes intentar combinar el mio que funciona caminando y el tuyo que no se frena cuando le chocas de costado para sacar el ejemplo perfecto xD
Nadie tiene una respuesta ? :\
usa place_meeting para verificar las coliciones en el even step del object jugador, Eso es todo.
Cita de: elviskelley en Agosto 26, 2011, 01:32:10 AM
usa place_meeting para verificar las coliciones en el even step del object jugador, Eso es todo.
De que forma? Ya intente de todas las formas que se me ocurre y me sigue pasando lo mismo
Ya que se te hace tan facil a ti, me podrias dejar el editable andando y por aca me explicas lo que hicisite? Si es que tienes tiempo :)
No puedo ver el editable, as? que estoy hablando a ciegas, pero prob? a poner esto en el evento de colisi?n con la plataforma:
[gml]if (y > other.y) {
move_outside_solid((other.x < x) * 180, 10);
}[/gml]
Cita de: Wadk en Agosto 26, 2011, 08:24:55 AM
No puedo ver el editable, as? que estoy hablando a ciegas, pero prob? a poner esto en el evento de colisi?n con la plataforma:
[gml]if (y > other.y) {
move_outside_solid((other.x < x) * 180, 10);
}[/gml]
Buena idea, pero sigue igual :/
en el event step de la plataforma.
if place_meeting(x+4,y+16,objPlataforma)
{with(objJugador){x*=-1;}}
if place_meeting(x-4,y+16,objPlataforma)
{with(objJugador){x*=-1;}}
Cita de: MaanuRP en Agosto 26, 2011, 05:40:34 PM
Buena idea, pero sigue igual :/
?Tsk! :(
Cita de: elviskelley en Agosto 26, 2011, 06:31:29 PM
en el event step de la plataforma.
if place_meeting(x+4,y+16,objPlataforma)
{with(objJugador){x*=-1;}}
if place_meeting(x-4,y+16,objPlataforma)
{with(objJugador){x*=-1;}}
?Lo probaste? Porque creo que eso har?a que el jugador desaparezca misteriosamente.
Cita de: elviskelley en Agosto 26, 2011, 06:31:29 PM
en el event step de la plataforma.
if place_meeting(x+4,y+16,objPlataforma)
{with(objJugador){x*=-1;}}
if place_meeting(x-4,y+16,objPlataforma)
{with(objJugador){x*=-1;}}
Lo probe pero no funciona, no noto ningun cambio.
Les tiro un dato que seguro es interesante y esta mal y por esto puede ser que no funcione:
Los objetos del jugador, de la plataforma movil y de la pared son solidos (La plataforma movil tiene de Parent a la pared).
Hmm. Prob? a poner el jugador como no s?lido.
Poniendo el personaje en NO solido:Cita de: Wadk en Agosto 26, 2011, 08:24:55 AM
No puedo ver el editable, as? que estoy hablando a ciegas, pero prob? a poner esto en el evento de colisi?n con la plataforma:
[gml]if (y > other.y) {
move_outside_solid((other.x < x) * 180, 10);
}[/gml]
Lo unico que cambie del ejemplo fue agregar el evento de colision con la plataforma movil en el jugador y poner ese codigo.
Lo que pasa es que solo con tocar la plataforma, ?sta se detiene, por mas que le caiga encima (Que debe ser donde le tengo que caer para que me mueva con ella, no? jaja).
Asi que no sirve :/
Cita de: elviskelley en Agosto 26, 2011, 06:31:29 PM
en el event step de la plataforma.
if place_meeting(x+4,y+16,objPlataforma)
{with(objJugador){x*=-1;}}
if place_meeting(x-4,y+16,objPlataforma)
{with(objJugador){x*=-1;}}
Lo que hice con esto fue:
1) Cambiar "objPlataforma" por "Plataforma_Movible", que es el nombre del objeto de mi plataforma movil (Recien me doy cuenta que fue de muy animal poner movible xD)
2) Cambiar "objJugador" por "Jugador", que es el nombre del objeto de mi jugador.
3) Al evento step de la plataforma movil que ya tenia lo siguiente:
[gml]
if Jugador.x > x and Jugador.x < x + 80 and position_meeting(Jugador.x,y-1,Jugador)
{
Jugador.x = Jugador.x + hspeed;
}
[/gml]
(Esto es lo que hace que la plataforma mueva al personaje cuando esta sobre ella).
Le agregue esto:
[gml]
if place_meeting(x+4,y+16,Plataforma_Movible)
{with(Jugador){x*=-1;}}
if place_meeting(x-4,y+16,Plataforma_Movible)
{with(Jugador){x*=-1;}}
[/gml]
Con esto las plataformas moviles funcionan como siempre, se mueven y cuando les caigo encima me mueven y eso funciona correctamente, pero al colisionar de costado con ellas sigue sucediendo el mismo error, quedo volando y la plataforma se detiene hasta que me "despegue" de ella.
4) Borre todo el evento step de la plataforma movil y puse solo lo que me dijeron que ponga:
[gml]
if place_meeting(x+4,y+16,Plataforma_Movible)
{with(Jugador){x*=-1;}}
if place_meeting(x-4,y+16,Plataforma_Movible)
{with(Jugador){x*=-1;}}
[/gml]
Esto obviamente hace que cuando me posicione sobre la plataforma movil, esta se mueva pero mi personaje no.
Y cuando colisiono de costado, el error sigue estando, la plataforma se queda quieta y mi jugador queda volando.
Por si no tienen ganas de leer tanto, aca les resumo:
NADA funciono, ni teniendo el personaje en solido, ni poniendolo en no solido
Intenta poniendo esto en el evento step de tu personaje.
[gml]plat=collision_rectangle(x-sprite_xoffset-1,y-sprite_yoffset+1,x+sprite_xoffset+1,y+sprite_yoffset-1,Plataforma_Movible,1,1)
if plat{
if ((y+sprite_yoffset) > plat.y) {
var atras;
atras=plat.x+sprite_get_width(plat.sprite_index)/2 > x;
move_contact_solid(atras*180,max(1,(abs(plat.hspeed))*(sign(atras-.5)!=sign(plat.hspeed))))
}
}[/gml]
Tienes que declarar la variable plat en el evento create.
Cita de: brunoxzx en Agosto 27, 2011, 05:02:33 AM
Intenta poniendo esto en el evento step de tu personaje.
[gml]plat=collision_rectangle(x-sprite_xoffset-1,y-sprite_yoffset+1,x+sprite_xoffset+1,y+sprite_yoffset-1,Plataforma_Movible,1,1)
if plat{
if ((y+sprite_yoffset) > plat.y) {
var atras;
atras=plat.x+sprite_get_width(plat.sprite_index)/2 > x;
move_contact_solid(atras*180,max(1,(abs(plat.hspeed))*(sign(atras-.5)!=sign(plat.hspeed))))
}
}[/gml]
Tienes que declarar la variable plat en el evento create.
Excelente!!
Me diste la respuesta que tanto espere! Ahora lo voy a probar en mi juego pero seguro va a funcionar porque en el ejemplo funciono!
Creo que si colisiono bien en la punta de la plataforma si se para, pero no importa, asi esta muy bien!
Muchisisisiismaas graciaas!
Lo unico, te agradeceria mas si me podrias explicar muy detalladamente el codigo :D
Intenta cambiar el c?digo por este es muy probable que ya no te sucedan errores y tambi?n resolv? un error que hab?a anteriormente que hacia que si colisionabas con la plataforma y un muro al mismo tiempo te quedaras trabado ahora tu la plataforma cambia de direcci?n cuando eso sucede.
[gml]plat=collision_rectangle(x-sprite_xoffset-3,y-sprite_yoffset+1,x+sprite_xoffset+3,y+sprite_yoffset-1,Plataforma_Movible,1,1)
if plat{
var atras;
atras=plat.x+sprite_get_width(plat.sprite_index)/2 > x;
move_contact_solid(atras*180,max(1,(abs(plat.hspeed))*(sign(atras-.5)!=sign(plat.hspeed))))
if collision_rectangle(x-sprite_xoffset-1,y-sprite_yoffset+1,x+sprite_xoffset+1,y+sprite_yoffset-1,Pared,1,1){
plat.hspeed*=-1
}
}[/gml]
La verdad en este momento ando algo ocupado, mejor ma?ana te explico como funciona, pero te puedo decir que al principio me base en lo que poste? Wadk pero despu?s se transformo casi en lo contrario.
P.D: para evitar posibles errores futuros desactiva la casilla de "precise collision checking" en el sprite de tu personaje ademas aunque no lo creas es mucho mas r?pido procesar las colisiones si esa casilla esta desactivada te recomiendo activarla en todos los sprites que puedas.
Cita de: brunoxzx en Agosto 27, 2011, 08:07:08 AM
La verdad en este momento ando algo ocupado, mejor ma?ana te explico como funciona, pero te puedo decir que al principio me base en lo que poste? Wadk pero despu?s se transformo casi en lo contrario.
Dale, muchisimas gracias, espero tu explicacion :D
Perd?n por la tardanza pero no estuve los ?ltimos d?as.
[gml]plat=collision_rectangle(x-sprite_xoffset-3,y-sprite_yoffset+1,x+sprite_xoffset+3,y+sprite_yoffset-1,Plataforma_Movible,1,1)[/gml]
Bien lo que hace la funci?n colision_rectangle() es crear un rect?ngulo virtual y despu?s chequear si ese rect?ngulo esta colisionando contra un objeto en especifico y devolver su id. En este caso la medida del cuadrado es la misma que la del sprite de tu objeto pero 2 p?xeles mas ancha y 2 p?xeles menos alta, de tal manera revise colisiones solo con los objetos de tipo Plataforma_Movible que est?n en alguno de tus dos costados.
[gml]if plat[/gml]
Bueno esto lo ?nico que hace es chequear si si hubo una colisi?n.
[gml]atras=plat.x+sprite_get_width(plat.sprite_index)/2 > x;[/gml]
atr?s es igual a 1 si tu x es menor a la de plat y 0 si tu x es mayor (tu mismo puedes comprobando haciendo la operaci?n a mano, reemplazando sprite_get_width por el ancho del sprite que es la plataforma y reemplazando las x por valores aleatorios). Recuerda que los operadores ">" y "< devuelven 1 si es cierto y 0 si no.
[gml]move_contact_solid(atras*180,max(1,(abs(plat.hspeed))*(sign(atras-.5)!=sign(plat.hspeed))))[/gml]
Bien lo que hace move_contact_solid como(dir,dist) dice su nombre es mover una instancia en una direcci?n (dir) y distancia dist hasta que colisione con un objeto solido. Bien la direccion en la que se movera tu objeto sera "atras*180" si atras es 0 (0*180=0) se mover? en la direcci?n 0 grados que seria derecha, y si atras es 1 (1*180=180) se movera en la direcci?n 180 grados.
[gml](abs(plat.hspeed))*(sign(atras-.5)!=sign(plat.hspeed)))[/gml]
Bien esto emmmmm emm te dire devuelve el valor absoluto de la hspeed de plat si estas atr?s de plat y su hspeed es negativa, es decir se esta moviendo hacia atr?s y devuelve 1 si estas atr?s de plat pero su velocidad horizontal es positiva, osea se esta moviendo hacia adelante, lo mismo pasa si estas adelante.
ej:
- Si hspeed=-4 y atras=1 eso me devolvera (4).
- Si hspeed=4 y atras=1 eso me devolvera (1).
- Si hspeed=4 y atras=0 eso me devolvera (4).
- Si hspeed=-4 y atras=0 eso me devolvera (1).
De tal manera que todo esto
[gml]move_contact_solid(atras*180,max(1,(abs(plat.hspeed))*(sign(atras-.5)!=sign(plat.hspeed))))[/gml]
Bueno iba a escribir lo que hacia pero creo que un ejemplo es mas facil.
- Si su hspeed es -4 y estas a su izquierda te mueve -4 p?xeles a la izquierda.
- Si su hspeed es 4 y estas a su izquierda te mueve 1 p?xeles a la izquierda.
- Si su hspeed es 4 y estas a su derecha te mueve 4 p?xeles a la derecha.
- Si su hspeed es -4 y estas a su derecha te mueve 1 p?xeles a la derecha.
[gml]
if collision_rectangle(x-sprite_xoffset-1,y-sprite_yoffset+1,x+sprite_xoffset+1,y+sprite_yoffset-1,Pared,1,1){
plat.hspeed*=-1
}[/gml]
Bien esto es para evitar errores, b?sicamente hace un chequeo igual al del inicio para revisar si la plataforma aun esta alado de ti (que no deber?a) pero si aun esta invierte su velocidad horizontal es decir si era -4 se convierte en 4 y viceversa.
Uff por fin XD.
P.D: Me dices si no entendiste algo.
Excelente explicacion!
La leere de a poco para entenderla bien!
Eres un genio ^^
Y lograste solucionarlo bro?