"Controle de tempo" em um 2d de plataforma

9

Eu estou criando um jogo de plataformas 2D onde o jogador pode pressionar um botão e reiniciar o nível, apenas o personagem anterior também executará o nível ao mesmo tempo, como se estivesse voltando no tempo.

Sei que outros jogos já fizeram isso antes, e a maneira como pensei em fazê-lo é fazer com que o personagem do jogo tenha um conjunto de ações (ocioso, saltando, andando à esquerda etc.) e, em seguida, detecte alterações nessas ações e faça logon no uma lista junto com o tempo do jogo. Então, quando preciso que o personagem execute o nível novamente por conta própria, posso simplesmente passar pela lista alterando suas ações no momento certo.

Esse é o melhor jeito de fazer isso? Alguém tem alguma experiência nisso?

Obrigado.

Woody Zantzinger
fonte
O que você está procurando é mais um 'Replay' do que controle de tempo. Você pode encontrar alguns artigos interessantes sobre como lidar com isso, mas ainda digo que a resposta abaixo também é um bom começo nessa área. Lembre-se de que coisas 'aleatórias' no jogo estragam replays para o personagem 'fantasma' que o executa novamente, se puderem afetar o progresso.
James
3
Bom ponto sobre as partes "aleatórias". Certifique-se de usar um gerador aleatório que gere seus números com base em uma semente. Em seguida, salve a semente com sua reprodução e use a mesma semente ao reproduzir essa reprodução.
bummzack
Como você fez isso? Qual é a sua solução alternativa?

Respostas:

8

EDITAR:

Por favor, veja a resposta de @ Bluescrn a esta pergunta; ele elabora pontos fracos na repetição de controles, em vez de vetores ou posições de movimento.

-

Você está no caminho certo. Aqui está a abordagem que eu usaria:

Controladores

Crie uma classe Controller que receba a entrada do teclado e a transmita ao seu personagem. No entanto, também tenha um registro do controlador exatamente quando as teclas importantes (por exemplo, setas, salto, etc.) foram pressionadas e quando foram liberadas. Armazenaria esse tipo de informação:

actions[0].milliseconds = 400     actions[0].action = right pressed
actions[1].milliseconds = 1000    actions[1].action = jump pressed
actions[2].milliseconds = 1300    actions[2].action = jump released
actions[3].milliseconds = 2500    actions[3].action = jump pressed
actions[4].milliseconds = 3000    actions[4].action = jump released
actions[5].milliseconds = 5330    actions[5].action = right released

Um controlador possui dois modos:

  1. Registro: recebe entrada do teclado. Registra a entrada na lista. Entrega a entrada de caracteres com base no estado do teclado.
  2. Replay: ignora a entrada do teclado. Avanços na lista de acordo com milissegundos decorridos desde o início do nível. Entrega a entrada de caracteres com base no estado do teclado gravado no momento atual.

Personagens

Quando seu objeto Personagem é construído, ele cria um novo Controlador para si. O personagem pode estar em um dos dois modos a qualquer momento:

  1. Ativo: existe apenas um personagem ativo e esse é o que você controla. Quando o personagem está no modo ativo, seu controlador está no modo de gravação. Por padrão, quando um personagem é construído, ele está no modo Ativo.
  2. Fantasma: é esse que repete suas ações passadas. Quando um personagem entra no modo Ghost, ele muda sua aparência e define seu Controller no modo Replay.

Níveis

Um nível recém-iniciado

Quando você inicia o nível, crie um único personagem. Agora o nível começa e o jogador faz o que quer.

Quando o tempo é redefinido

Quando o nível for redefinido, faça três coisas:

  1. Diga ao personagem ativo atual para entrar no modo Ghost.
  2. Crie um novo personagem.
  3. Chame todos os caracteres para redefinir a si mesmos. Isso os colocará de volta na posição inicial sem movimento, etc. Eles, por sua vez, instruirão seus controladores a redefinir para milissegundos 0 sem nenhuma tecla pressionada.

Então o nível começa e o jogador faz o que quer.

doppelgreener
fonte
Isto é perfeitamente claro. Muito obrigado. Eu meio que tive a idéia certa, mas criaria um sistema central para registrar movimentos, mas fazer com que cada personagem registrasse seu próprio movimento é uma maneira muito mais fácil de fazer isso. Obrigado.
Woody Zantzinger
8

Se estiver reproduzindo entradas gravadas, considere as implicações de quaisquer objetos em movimento / destrutíveis / interativos no mundo, que podem ter se movido ou alterado de estado quando as ações são repetidas

Além disso, a reprodução de entradas não funcionará exatamente se o seu jogo usar um intervalo de tempo variável. Você pode considerar uma atualização de jogo em tempo fixo (com interpolação para renderização de taxa de quadros variável)?

bluescrn
fonte
11
+10 se eu pudesse. Grandes considerações. A reprodução de vetores de movimento ou posição seria superior à reprodução de entrada, dependendo do efeito desejado. Dezenas de milissegundos de imprecisão entre quadros são provavelmente mais fáceis de serem considerados ao trabalhar com movimento e posição do que com entrada.
Doppelgreener
4

Existem muitos tópicos que cobrem sistemas de gravação / reprodução de jogos / etc, que provavelmente devem ser a pedra angular de suas descobertas anteriores.

Aqui está um: Como projetar um sistema de repetição

Tetrad
fonte
0

Gravar a entrada do teclado pode não ser tão útil no seu caso. No entanto, você pode gerar um spline com uma linha do tempo. Você pode até retroceder o tempo se for complicado com as forças que você precisa aplicar

adrix89
fonte