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]
Vim.

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.
Vim.

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).


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 ^^