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
xna
c#
xna-4.0
platformer
xNidhogg
fuente
fuente
Respuestas:
Por lo que entiendo al leer su pregunta, desea calcular la
Y
posición correcta , dada laX
posición del jugador. Esto es bastante trivial. Echa un vistazo a esta imagen: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 jugadorx1
y el ancho y la altura de la casilla inclinada (u, v
).x, y
yx1
son coordenadas mundiales.Dados estos parámetros, la posición Y de tus jugadores (
y1
) sería:Si solo se trata de ángulos de 45 grados, entonces se vuelve aún más simple:
Si la pendiente es al revés, es:
fuente
m
yb
en tu cálculo?Aunque esto ya está respondido, permítame ofrecerle otra ecuación:
y = mx + b
donde 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.
fuente
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.
fuente
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
fuente
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.
fuente