Pergunta

Como fazer jogos com gravidade lidar com a relação entre mover coisas como jogadores, monstros, ou objectos e o chão? É o jogador constantemente "cair" no chão e estar recuperou-se?

Duas maneiras de reagir a colisões que eu encontrei estão se movendo o jogador de volta ao seu local anterior antes da colisão, e testar a nova posição antes de passar para ver se ele iria resultar em uma colisão, mas eu não vejo como qualquer um destes pode lidar com uma plataforma que está a subir para cima e precisa ser capaz de levantar o jogador. Eu estou olhando para isso de uma perspectiva de design 2D jogo, mas eu imagino que o mesmo problema ocorre em design de jogos 3D. Alguma dica? Todas as referências que eu deveria verificar? Obrigado.

Foi útil?

Solução

Você pode querer verificar para fora de GameDev.net gravidade FAQs para alguns informações básicas.

Uma vez que você está fazendo um jogo e não uma física modelador de alta precisão do que nós podemos se safar fazendo integrações Euler . Se a sua necessidade de precisão aumenta o método de integração popular, mais que vejo usado é um Runge-Kutta (RK4 ) integração. Você provavelmente não vai precisar deles para um jogo simples, mas eles definitivamente são usados ??na simulação de física mais avançada e jogos 3D. A desvantagem com o uso de RK4 é ligeiramente maior complexidade e ligeiramente mais lenta. É porém muito preciso, mas por agora, vamos ficar com boa ole Euler.

Eu fiz uma pergunta semelhante, " Como fazer Eu aplico a gravidade para minha saltando jogo de bola ", e tem várias respostas boas. A primeira coisa que você vai fazer é escolher uma constante de gravidade arbitrário para o seu jogo. Na minha aplicação bola quicando eu uso uma constante gravidade padrão de 2000px / s. Você vai querer jogar com esta constante gravidade para obter o efeito desejado para o seu jogo particular.

Em seguida, você quer ter certeza de que você está tornando o seu jogo e atualizar seu jogo de objetos de forma independente. Isso é para evitar que seus objetos no jogo de se mover muito rápido em computadores rápidos e lentos em computadores lentos. Você quer que a física e velocidade com que os objetos se movem em torno de ser independente da velocidade do computador. Um bom artigo sobre isso é jogo de física: Corrigir o seu timestep .

Então, como vamos fazer isso? Você mantém o controle de quanto tempo se passou desde a última chamada para o método Update. Eu criei 2 threads, embora não seja diretamente necessário. Eu tenho um fio de atualização do jogo e um fio de renderização. Os controles de rosca atualização atualizando o no jogo de objetos posições. O fio atualização sabe quando foi anterior chamado, o tempo atual e de que calcula o tempo decorrido desde o método de atualização foi chamado.

Para aplicar gravidade que irá juntar-se a velocidade Y do nosso objeto de nossa constante gravidade multiplicada pelo tempo decorrido.

private long previousTime = System.currentTimeMillis();
private long currentTime = previousTime;

public void updateGame()
{
    currentTime = System.currentTimeMillis();
    float elapsedSeconds = (currentTime - previousTime) / 1000f; 

    foreach(GameObject gameObject in gameObjects)
    {
        // Apply gravity to velocity vector
        gameObject.velocity.y += (gravityConstant * elapsedSeconds); 

        // Move objects x/y position based off it's velocity vector
        gameObject.position.x += (gameObject.velocity.x * elapsedSeconds); 
        gameObject.position.y += (gameObject.velocity.y * elapsedSeconds);

    }

    checkCollisions();

    previousTime = currentTime;
}

Isso vai mover todos os seus objetos com base em seu vetor velocidade do e aplicar a gravidade para eles com base em sua constante gravidade. O melhor de tudo ele faz isso independentemente da velocidade de computadores!

Para responder à sua outra pergunta, sim os objetos terá constantemente a "força" da gravidade sobre sua y vetor. Por isso, será constantemente colidindo com o chão. No entanto, uma coisa que você quer fazer é usar um valor Epsilon para, eventualmente, trazer a sua velocidade de gameObject a zero. Então, durante a detecção de colisão, como parte de seu processo de poda normalmente você pode ignorar a verificação se um objeto não-movimento é colidir com qualquer coisa (não vice-versa embora!).

O que eu gostaria de fazer com colisões é assim que eu encontrar objetos em colisão (penetrando uns aos outros), eu vou empurrá-los para além de sua distância de tradução mínimo (MTD) que os separa. Esta etapa é fundamental caso contrário você terá o bug freqüentemente visto em jogos de objetos "preso" em conjunto jitterly movendo. Uma vez que eles são separados eu calculo a minha resposta colisão.

Usando este método ele vai funcionar bem no seu cenário descrito de uma plataforma elevatória. A plataforma vai continuar a subir, a gameObject vai separar-se usando o MTD entre si ea plataforma e vai naturalmente subir com ele.

Se yOU precisar de ajuda na resposta colisão Eu sugeriria olhar:

Outras dicas

Uma abordagem utilizada em alguns jogos é para enganar: temos um estado separado para caminhar vs no ar. Embora curta, o motor de jogo pode determinar a inclinação do ser superfície se aproximou e, se não for muito íngreme, mover o personagem na direção da superfície, bem como dando ao personagem o bom posicionamento vertical em relação à superfície.

Como para a física, estou me tornando um fã de integração Verlet conforme descrito no Gamasutra : Caráter avançado Física . Simplifica equações de atualização física (não tem que manter o controle de velocidade!) E simplifica colisões (não tem que ajustar a velocidade!). Dito isto, ele tem algumas nuances se você precisar de precisão.

Um dos mais livros completos sobre este assunto é em tempo real Detecção de Colisão por Christer Ericson . Ele tem um companheiro blogue também. Eric Lengyel é Matemática para o jogo 3D Programação e Computação Gráfica é útil também.

Estou não especificamente um programador de jogos, mas este é o meu entendimento:

  • Em um mundo ideal, com uma "taxa de quadros infinita", você detectar a colisão precisamente no momento em que ocorreu, e usar um pouco de física padrão para modelar as novas velocidades e acelerações dos órgãos após a colisão (veja um padrão de mecânica do ensino médio livros didáticos, ou vários livros intitulada coisas como "Física para Jogos Programadores")
  • Na realidade, porque você tem uma taxa de quadros fixos e, portanto, corpos só se movem com uma certa granularidade, você geralmente precisa adicionar um truque extra, tais como calcular com antecedência o caminho relativo que os corpos vão viajar no próximo quadro e vendo se qualquer um dos caminhos cruzam
  • se eles se cruzam, então o ponto de intersecção na verdade será um estimativa , mas um pouco imprecisa, do ponto em que os corpos realmente teria colidido; então você tem a opção de não se importar e tendo essa estimativa como o ponto de intersecção e linearmente interpolação para obter as velocidades no ponto de colisão, ou fazer um cálculo mais preciso agora que você descobriu que eles vão se cruzam, para obter o real / ponto de tempo / velocidades de colisão

Além de modelar as colisões, uma boa abordagem é também modelar transferências contínuas de energia (ou impulso, ou apenas a velocidade, dependendo da complexidade do seu simulação). Quando o jogador está de pé sobre uma plataforma, armazenar essas informações no objeto que representa a plataforma, e toda vez que a velocidade do objeto é ajustada você pode aplicar diretamente que a mudança para o jogador desta forma vinculado ou outros objetos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top