Eu quero ter inclinações simples de 45 ° no meu jogo de plataforma baseado em ladrilhos, no entanto, simplesmente não consigo entender o algoritmo. Por favor, dê uma olhada no código e no vídeo, talvez eu esteja perdendo o óbvio?
//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;
}
Vídeo de como é: http://youtu.be/EKOWgD2muoc
xna
c#
xna-4.0
platformer
xNidhogg
fonte
fonte
Respostas:
Pelo que entendi, lendo sua pergunta, você deseja calcular a
Y
posição correta , considerandoX
posição do jogador. Isto é bastante trivial. Veja esta imagem:Supondo que o seu declive-tile esteja em uma determinada posição
x,y
(a origem está no canto inferior esquerdo como na imagem). Você tem a posição do jogador,x1
a largura e a altura do ladrilho inclinado (u, v
).x, y
ex1
são coordenadas do mundo.Dado esses parâmetros, a posição Y de seus jogadores (
y1
) seria:Se você está lidando apenas com ângulos de 45 graus, fica ainda mais simples:
Se a inclinação for inversa, é:
fonte
m
eb
no seu cálculo?Embora isso já esteja respondido, permita-me oferecer outra equação:
y = mx + b
onde y é a coordenada calculada, m é a inclinação (-1 para baixo a 45 graus, 1 para baixo a 45 graus) eb é a interceptação em y - - a coordenada y em que x = 0.Isso permite um pouco mais de flexibilidade; você pode alterar m para calcular uma inclinação diferente de 45 graus. Por exemplo, um m de pi / 3 fornece uma inclinação de 30 graus.
fonte
Você pode encontrar muito valor neste site: http://info.sonicretro.org/Sonic_Physics_Guide
Especificamente para o que você está procurando, consulte a seção Solid Tiles: Slopes and Curves. Basicamente, mostra como se acredita que isso foi realizado nos primeiros jogos do Sonic.
fonte
Talvez você queira dar uma olhada na Teoria do Eixo Separado. Isso resolverá o problema da inclinação, mas exige um pouco de matemática e a própria teoria leva um tempo para esclarecer suas dúvidas. Eu o vinculei a um tutorial e a um livro que explica melhor
Tutorial do metanetsoftware
Detecção de colisão em tempo real
fonte
Eu acho que você tem um erro off-by-one em outro lugar ou não está definindo sinalizadores _leftSlope / _rightSlope no momento certo. Esse código não toca no movimento X, mas esse parece ser o seu problema no vídeo.
Você deve verificar se esses sinalizadores são acionados. Em seguida, verifique sua detecção de colisão horizontal: você não deseja que ele seja acionado em uma inclinação.
fonte