Pendientes de 45 ° en un juego de plataformas 2D basado en mosaicos

12

Quiero tener pendientes simples de 45 ° en mi plataforma basada en mosaicos, sin embargo, parece que no puedo descifrar el algoritmo. Eche un vistazo al código y al video, ¿tal vez me estoy perdiendo lo obvio?

//collisionRectangle is the collision rectangle of the player with 
//origin at the top left and width and height
//wantedPosition is the new position the player will be set to.
//this is determined elsewhere by checking the bottom center point of the players rect
if(_leftSlope || _rightSlope)
{        
    //Test bottom center point
    var calculationPoint = new Vector2(collisionRectangle.Center.X, collisionRectangle.Bottom);
    //Get the collision rectangle of the tile, origin is top-left
    Rectangle cellRect =
        _tileMap.CellWorldRectangle(
            _tileMap.GetCellByPixel(calculationPoint));
    //Calculate the new Y coordinate depending on if its a left or right slope
    //CellSize = 8
    float newY = _leftSlope
                            ? (calculationPoint.X % CellSize) + cellRect.Y
                            : (-1 * (calculationPoint.X % CellSize) - CellSize) + cellRect.Y;
    //reset variables so we dont jump in here next frame
    _leftSlope = false;
    _rightSlope = false;
    //now change the players Y according to the difference of our calculation
    wantedPosition.Y += newY - calculationPoint.Y;
}

Video de cómo se ve: http://youtu.be/EKOWgD2muoc

xNidhogg
fuente
1
¿No son impresionantes los vectores? : D
Gustavo Maciel

Respuestas:

10

Por lo que entiendo al leer su pregunta, desea calcular la Yposición correcta , dada la Xposición del jugador. Esto es bastante trivial. Echa un vistazo a esta imagen:

Pendiente

Suponiendo que su mosaico de pendiente esté en una posición dada x,y(el origen está en la parte inferior izquierda como en la imagen). Tiene la posición del jugador x1y el ancho y la altura de la casilla inclinada ( u, v). x, yy x1son coordenadas mundiales.

Dados estos parámetros, la posición Y de tus jugadores ( y1) sería:

y1 = y + (x1 - x) * (v / u)

Si solo se trata de ángulos de 45 grados, entonces se vuelve aún más simple:

y1 = y + (x1 - x)

Si la pendiente es al revés, es:

y1 = y + (v - (x1 - x))
bummzack
fuente
después de aplicar la corrección @SkimFlux más tu nuevo formulario más algunas cosas estúpidas, pasé por alto que funcionó. Gracias.
xNidhogg
¿No podrías usar y = mx + b para un cálculo más simple?
ashes999
@ ashes999 No creo que sea mucho más simple de lo que escribí. ¿Qué son my ben tu cálculo?
bummzack
@bummzack m es su pendiente (1 para una pendiente de 45 grados hacia abajo, -1 para hacia arriba) y b sería la intersección en el eje x. Álgebra de grado 9. Sólo digo'.
cenizas999
@ ashes999 Sí, ha pasado mucho tiempo. Siéntase libre de publicar esta ecuación como respuesta.
bummzack
8

Aunque esto ya está respondido, permítame ofrecerle otra ecuación: y = mx + bdonde y es la coordenada calculada, m es la pendiente (-1 para bajar a 45 grados, 1 para subir a 45 grados), y b es la intersección en y - - la coordenada y donde x = 0.

Esto le permite un poco más de flexibilidad; puede cambiar m para calcular una pendiente diferente que no sea de 45 grados. Por ejemplo, una m de pi / 3 le da una pendiente de 30 grados.

cenizas999
fuente
4

Puede encontrar mucho valor en este sitio: http://info.sonicretro.org/Sonic_Physics_Guide

Específicamente para lo que está buscando, consulte la sección Azulejos sólidos: pendientes y curvas. Básicamente muestra cómo se cree que esto se logró en los primeros juegos de Sonic.

SpartanDonut
fuente
lectura interesante, pero demasiado compleja. Este tipo de pendiente es el único que quiero, por lo tanto, debería simplificar la solución. Un mapa de altura / sensor / sistema de escáner sería excesivo para esto. Gracias por desenterrar el enlace, sin embargo.
xNidhogg
2

Es posible que desee investigar la Teoría del eje separado, resolverá su problema de pendiente, pero requiere bastante matemática y la teoría en sí misma toma un tiempo para entenderlo. Te he vinculado a un tutorial y un libro que lo explica mejor

Tutorial de metanetsoftware

Detección de colisión en tiempo real

dbomb101
fuente
eso es demasiado, imo. Este es un caso altamente simplificado y no habría necesidad de otros usos de SAT. Sin embargo, gracias por tomarse el tiempo de abrir los enlaces.
xNidhogg
2

Creo que tiene un error off-by-one en otro lugar, o no está configurando los indicadores _leftSlope / _rightSlope en el momento correcto. Este código no toca el movimiento X en absoluto, pero ese parece ser su problema en el video.

Debe verificar si esas banderas se activan en absoluto. Luego verifique su detección de colisión horizontal: no desea que se active en una pendiente.

SkimFlux
fuente
oh dios cierto. En realidad, no quiero la detección de colisión horizontal o vertical cuando esto sucede. Olvidé totalmente deshabilitar eso. Se ve de alguna manera mejor ahora, pero aún no está hecho. Gracias.
xNidhogg