(SOLUCIO)Slopes (deslizar) movimiento tipo Zelda con código de colisiones perfectas

Publicado por ZELDA, Julio 27, 2022, 01:10:30 AM

Tema anterior - Siguiente tema

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

ZELDA

Ya quedo, tuve que hacerle muchísimas modificaciones al codigo, les dejo el editable arreglado Se los dejo por si alguno tiene problemas similares
Buenos días Comunidad, mi duda es que quisiera lograr slopes con este codigo, para un juego tipo Zelda
repeat (abs(xvel))
{
    if (place_meeting(x + sign(xvel), y, obj_Wall)) { break; }
    x += sign(xvel);
}

repeat (abs(yvel))
{
    if (place_meeting(x, y + sign(yvel), obj_Wall)) { break; }
    y += sign(yvel)
}

if (Down) { yvel = 2; }
if (Left) { xvel = -2; }
if (Up) { yvel = -2; }
if (Right) { xvel = 2; }
if (!Left && !Right) { xvel = 0; }
if (!Up && !Down) { yvel = 0; }
Este mismo codigo lo uso en plataformas, y ahi si logre hacer slopes
repeat(abs(xvel))
{
    var slope = 0;
    while(!place_free(x + xvel, y - slope) && slope <= abs(1 * xvel / 2)) { slope += 1; }
    if (!place_free(x + sign(xvel), y - slope)) { break; }
    else { y -= slope; }
    x += sign(xvel);
    //Bajar slopes
    if (place_free(x, y) && yvel >= 0 && !place_free(x, y + 2 + abs(xvel)))
    {
        while (place_free(x, y + 1)) { y += 1; }
    }
}
y funciona bien en plataformas, pero porque el personaje se pega a la slope y solo avanza cuando uno aprieta izquierda o derecha, pero no en el tipo Zelda
les dejo un editable para que vean el error.
Nota: Uso gms2, pero lo hice de nuevo en gm8 para compartirlo ya que se me hace mas fácil.

EDITO: obtuve un avance, pero igual no queda bien
//Colisiones perfectas en x
repeat(abs(xvel))
{
    slope = 0;
    while(place_meeting(x + xvel, y - slope, object1) && slope <= abs(1 * xvel / 2)) { slope += 1; }
    if (place_meeting(x + sign(xvel), y - slope, object1)) { break; }
    else { y -= slope; }
    x += sign(xvel);
}
//en y
repeat (abs(yvel))
{
    slope = 0;
    while (place_meeting(x - slope, y + yvel, object1) && slope <= abs(1 * yvel)) { slope += 1; }
    if (place_meeting(x - slope, y + sign(yvel), object1)) { break; }
    else { x -= slope; }
    y += sign(yvel);
}
Pueden intentar ponerlo en el editable.

Powered by EzPortal
SMF spam blocked by CleanTalk