Estou trabalhando em um jogo de corrida de carros e acabei de implementar um sprite fantasma para repetir corridas passadas. Uso um mecanismo de física e, depois de muita leitura, cheguei à conclusão de que a melhor maneira de armazenar os dados fantasmas para reprodução seria registrar a posição e a rotação do carro em determinados momentos, como por exemplo descrito aqui: https: // gamedev. stackexchange.com/a/8380/26261 .
Mas qual seria uma boa maneira de encontrar esses pontos no tempo durante a reprodução? Um exemplo seria um registro com esses dados:
time: +3.19932 (seconds since race start)
position: 180,40 (position at that time)
rotation: 30.4 (rotation at that time)
Mas eu tenho vários problemas com isso:
Quando reproduzo, é improvável que eu atinja novamente o ponto no tempo exato em 3.19932 - mais provavelmente, terei um ponto no tempo em torno de 3.1 e precisarei encontrar o registro de correspondência mais próximo. Ao interpolar, até a correspondência mais próxima acima e abaixo. Isso parece muito ineficiente e demorado?
Em qual estrutura de lista eu poderia armazenar esses registros para uma reprodução posterior? Uma matriz? Isso não significa que o tempo de busca por registros correspondentes a um determinado tempo aumentará quanto mais tempo a corrida?
Qual frequência devo usar para pontos no tempo? Cada quadro seria um exagero - acho que eu deveria salvar, ou seja, cada enésimo quadro e interpolar entre eles, o que dificulta ainda mais as questões de armazenamento.
Então, essa idéia é a abordagem correta? Se sim, como eu poderia armazenar e recuperar os dados com eficiência? Observe que geralmente eu gostaria de usar a estrutura de dados acima, não os estados de jogos determinísticos e a gravação de entrada do usuário etc.
Obrigado por qualquer ajuda!
Edição: Eu sei que devo descrever o ambiente que eu uso: Cocos2D para iPhone. Existe um método update:(ccTime)delta
. Idealmente, esse método seria chamado a cada 1/60 segundos, mas não há garantia - delta
é o tempo real passado desde o último clique no jogo e pode ser muito mais ou menos que 1/60. É nesse método que eu gostaria de armazenar o estado atual do jogo.
Respostas:
Não :)
Digamos que você o armazene como uma matriz (observe que os instantâneos estão em ordem cronológica, mas não uniformemente espaçados):
Então, quando o replay / jogo começa, você obtém o primeiro e o segundo elemento da matriz:
Então, em cada quadro (
currentTime
é a hora atual neste novo jogo):Obviamente, isso pode ser otimizado armazenando em cache alguns dos cálculos. Não há pesquisa na matriz, apenas pesquisando índices específicos.
fonte
Não é muito difícil. Você pode armazenar seus dados em pontos arbitrários no tempo (quanto mais, melhor) e pode interpolar os valores dos dados com base no carimbo de data / hora que você está procurando e nos dados de dois registros de data e hora mais próximos, por exemplo:
Agora imagine que você deseja obter posição e rotação no tempo 0,10. Como 0,10 está entre os pontos '1' (significando 0,05 tempo) e '2' (significando 0,15 tempo), você precisa interpolar esses pontos.
Lerp
é apenas interpolação linear .Então, vamos preencher as lacunas com alguns exemplos (*).
HTH.
fonte