Inclinações de 45 ° em um jogo de plataformas 2D baseado em ladrilhos

12

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

xNidhogg
fonte
1
Os vetores não são impressionantes? : D
Gustavo Maciel

Respostas:

10

Pelo que entendi, lendo sua pergunta, você deseja calcular a Yposição correta , considerandoX posição do jogador. Isto é bastante trivial. Veja esta imagem:

declive

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, x1a largura e a altura do ladrilho inclinado ( u, v). x, ye x1são coordenadas do mundo.

Dado esses parâmetros, a posição Y de seus jogadores ( y1) seria:

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

Se você está lidando apenas com ângulos de 45 graus, fica ainda mais simples:

y1 = y + (x1 - x)

Se a inclinação for inversa, é:

y1 = y + (v - (x1 - x))
bummzack
fonte
depois de aplicar a correção @SkimFlux, além do seu novo formulário, além de algumas coisas estúpidas que eu ignorei, funcionou. obrigado.
XNidhogg
Você não poderia usar y = mx + b para um cálculo mais simples?
ashes999
@ ashes999 Acho que não fica muito mais simples do que escrevi. O que são me bno seu cálculo?
bummzack
@bummzack m é a sua inclinação (1 para uma inclinação de 45 graus para baixo, -1 para cima) eb seria a interceptação no eixo x. Álgebra de grau 9. Apenas dizendo'.
precisa saber é o seguinte
@ ashes999 Sim, já faz muito tempo. Sinta-se livre para postar esta equação como resposta.
bummzack
8

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.

ashes999
fonte
4

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.

SpartanDonut
fonte
leitura interessante, mas muito complexa. Esse tipo de inclinação é o único que eu quero, portanto, deve simplificar a solução. Um sistema de mapa / sensor / scanner de altura seria um exagero para isso. Obrigado por desenterrar o link, no entanto.
XNidhogg
2

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

dbomb101
fonte
isso é demais, imo. Este é um caso altamente simplificado e não haveria necessidade de outros usos do SAT. Obrigado por reservar um tempo para acessar os links.
XNidhogg
2

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.

SkimFlux
fonte
oh deus certo. Na verdade, eu não quero detecção de colisão horizontal ou vertical quando isso acontecer. Eu esqueci totalmente de desativar isso. Parece um pouco melhor agora, mas ainda não está pronto. Obrigado.
XNidhogg