Como lidar com plataformas móveis em um jogo de plataforma?

15

Não quero usar box2d nem nada, apenas plataformas móveis simples (caminhos de cima para baixo, esquerda-direita, diagonal e circular). Minha pergunta é lidar com a ordem de atualização / hierarquia de controle para que o jogador permaneça fixo na plataforma de forma sólida, sem pular ou balançar?

Iain
fonte

Respostas:

16

Minha solução seria tratar todas as entidades físicas no mapa do jogo como um nó de árvore e o próprio mapa como o nó raiz . Nós podem conter outros nós. Cada nó está contido (direta ou indiretamente) dentro do nó do mapa.

Por exemplo, digamos que seu personagem esteja em uma plataforma. O nó da plataforma contém o nó do personagem. Portanto, sempre que a plataforma se mover, os nós que ela contém (nesse caso, o personagem) também se moverão.

Para que isso aconteça, todo nó deve ter uma posição (x, y) em relação ao nó pai . Por exemplo, seu personagem pode estar localizado em (1,0) em relação à plataforma, que em si pode estar em (10,10) em relação ao mapa do jogo. Dessa forma, se a plataforma se mover, seu personagem se moverá implicitamente.

Nesta árvore hierárquica, a posição de cada nó é igual à soma de sua posição mais as posições de cada nó pai. Digamos que queremos obter a posição do personagem no mapa. Calculamos:

(posição do personagem) + (posição do nó pai) + (posição do nó raiz) = (1,0) + (10,10) + (0,0) = (11,0)

OK, então todo esse tempo seu personagem esteve na plataforma. Que tal pular? Bem, no momento em que ele pula, você o desconecta da plataforma e o anexa ao nó que contém a plataforma ; nesse caso, o mapa (nó raiz).

Quando ele pousar novamente, conecte-o a qualquer nó em que ele pousar.

jSepia
fonte
11
Eu também usaria a velocidade xey do nó para afetar o player. Exemplo 1: a plataforma se move muito rápido para cima e para, o jogador tem impulso para cima e é lançado. Exemplo 2: a plataforma está descendo um pouco mais devagar que o jogador que cai a uma velocidade mortal. A plataforma deve ser seguro à terra em vez de SPLUT
AttackingHobo
Essa é uma abordagem interessante, mas parece uma mudança completa no meu motor apenas para permitir movimentos de plataformas. Talvez se eu criar objectOnPlatform como um componente que puder para qualquer objeto que apenas temporariamente dê esse efeito?
Iain
10

Eu sugeriria tratar isso como um problema de pseudo-física e resolvê-lo usando o atrito com o solo.

Você já está usando a gravidade para segurar o personagem no chão, isso lida com as situações em que as plataformas se movem para cima e para baixo. Para lidar com o movimento esquerdo e direito, o chão deve exercer uma grande fricção no personagem. Normalmente, esse nível de atrito seria 1,0 ou 100%.

Se o personagem estiver parado, sua velocidade será 0 e, em vez disso, herdará 100% da velocidade da plataforma por causa do atrito. Algo como o seguinte:

character_velocity = friction * platform_velocity

O benefício dessa abordagem é que ela se presta facilmente a mecânicas adicionais de plataformas, como ser capaz de superar o atrito em ladeiras íngremes, permitindo que seu personagem deslize. Também permite reduzir facilmente o atrito para criar gelo no qual o personagem deslizará.

Também é mais fácil lidar com questões como paredes baixas suspensas que podem derrubar o seu jogador de uma plataforma móvel. Se você simplesmente trata o personagem como filho de uma plataforma pai, há uma boa chance de ele não interagir com muita facilidade com o resto da sua detecção de colisão sem muito trabalho.

Soviut
fonte
0

Você pode fixar a posição do jogador não "absoluta no nível", mas "relativa à plataforma" e, em seguida, ter uma função que forneça sua posição real. Eu não gosto disso.

Provavelmente seria melhor (e mais simples) vincular o player à plataforma para que, quando a plataforma se mova + x / + y, o jogador se mova o mesmo.

o0 '.
fonte