Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: cristopher2545 en Junio 07, 2017, 07:36:37 PM

Título: Suavizar colisiones
Publicado por: cristopher2545 en Junio 07, 2017, 07:36:37 PM
HEY! tanto tiempo sin publicar por aquí me alegra mucho que este sitio siga vivo y con futuro  :) y como todos los martes llego la hora favorita de papa molestarlos con una duda :( prometo sera cortita

estaba trabajando en el proyecto Beat em up si no saben cual es pueden conseguir  el código fuente y saber mas de el aquí:
http://www.comunidadgm.org/juegos-en-desarrollo/beat-em-up-proyect/msg127183/#msg127183

bueno el punto es tengo unas colisiones independientes a las que uso para la pared esas colisiones pertenecen a los bloques  que puedo saltarles ensima todo funciona 10/10 pero hay un diminuto problema las colisiones no son lisas a que me refiero? a diferencia de las que tengo para paredes cuando te pegas a ellas y caminas reaccionan a tus movimientos dejándote deslizarte y eso es genial pero con las que tengo especialmente para objetos a los que me puedo trepar el sistema no funciona nada bien si trato de hacer lo mismo que en las otras me quedo atorado y no me puedo mover hasta que dejo de caminar contra el bloque.. alguna idea para repararlas?

código de colisión de objetos (te atoras) (este va en el evento colisión de cada objeto)
//sistema de colisiones
    if ( ( z < other.z && other.height+other.z < z ) // de aqui
         || ( z+height < other.z && z > other.height+other.z ) )
    {
  x1 = 0;
        y1 = 0;
        x = xprevious;
        y = yprevious;
       

    }// a aqui es el problema que menciono trate de reconstruir el sistema pero se niega a funcionar
    else
    {
        if( z < other.height+other.z ) //si estas sobre el bloque
        {
            if( y < other.y ) depth = other.depth - (other.y - y); //profundidad en el punto z
            z_floor = other.height+other.z-1;
        }
        else if( z > other.z) //si esta mas alto que el personaje dejalo pasar
        {
            if( y > other.y ) depth = other.depth + (other.y+y);
            //no hagas nada
        }
    }
}



y este código es para colisiones con objetos sólidos como una pared (este funciona genial y va en el evento STEP)
if (place_meeting(x+xSpeed,y,collider))
{
while(!place_meeting(x+sign(xSpeed),y,collider))
{
  x+=sign(xSpeed);
}
xSpeed = 0;
if (ySpeed == 0)
{
  RoundXCorners();
}
}
x += xSpeed;

if (place_meeting(x,y+ySpeed,collider))
{
while(!place_meeting(x,y+sign(ySpeed),collider))
{
  y+=sign(ySpeed);
}
ySpeed = 0;

}
y += ySpeed;



aqui un video ejemplo de lo que pasa atencion como trato de alejarme lo mas posible de los sestos verdes y los bloques de mario en algunas ocasiones me quedo atascado al caminar

https://www.youtube.com/watch?v=mHuniNICVEs&feature=youtu.be