Corrida jogo de carro, carro em movimento mais rápido no computador mais rápido
-
18-09-2019 - |
Pergunta
Eu entendo por que ele faz isso, mas eu realmente não tenho qualquer ideia de como evitar isso. Assim, o cenário é, cada quadro I mover o carro por um certo de pixels predefinidos. O que acontece é quando eu vou no computador lento ou mais rápido ... bem, eu recebo menos ou mais quadros por segundo para que o carro se move tanto mais lento ou mais rápido. Eu queria saber como eu poderia evitar isso.
Eu suspeito que eu teria o mesmo problema usando qualquer biblioteca ... Esta é a minha primeira vez fazendo coisas em tempo real assim.
Solução
Eu suspeito que sua aparência atual Código de alguma forma como este
// to be called every frame
void OnEveryFrame()
{
MoveCar();
DrawCarToScreen();
}
Mas deve ser assim:
// to be called - for example - 50 times per second:
void OnEveryTimerEvent()
{
MoveCar();
}
// to be called every frame
void OnEveryFrame()
{
LockTimerEvents();
DrawCarToScreen();
UnlockAndProcessOutstandingTimerEvents();
}
Você tem que configurar um evento temporizador de acordo, é claro.
Outras dicas
Mover carro de acordo com temporizadores e não framerate. ou seja, modelo de carro deve ser independente da representação display.
Você pode resolver isso usando temporizadores precisos e matemática vetor.
Assim, por uma questão de argumento permite sugerir o seu código de desenho pode ser chamado a qualquer momento, por exemplo, Um segundo separados ou 3 segundo de intervalo ou 0,02 segundos de intervalo.
Tome a velocidade de movimento do carro a ser 40 pixels por segundo.
Assim, o número de pixels que deve mover é (TIME_NOW - LAST_FRAME_TIME) * 40px
.O movimento deve ser restringida por um período de tempo "real", ou seja, o carro irá se mover na velocidade de x pixel por fatia de tempo.
Leia o relógio em tempo real, e mover o carro uma distância apropriada para o tempo decorrido. Isto pode parecer um pouco "jerky" se o computador é muito lento, mas faz com que a velocidade do carro independente da velocidade da CPU.
Você precisa limitar o framerate para quadros X por segundo (60 FPS é o mais comum). Esta é uma característica comum na maioria dos frameworks multimídia, incluindo SFML. Para SFML eu olhar para a janela Método / RenderWindow SetFramerateLimit (unsigned int Limit) .
Você precisa corrigir o seu timestep . Basicamente, cada quadro que você mover o carro a uma distância que varia de acordo com quanto tempo efectivamente decorrido desde a última chamada de atualização. Desta forma, você começa a velocidade correta, independentemente da taxa de quadros.
Você tem que salvar o tempo antes do carro e desenhos em movimento.
Salvar o tempo após todos os cálculos.
Mover seu carro por Npixels / segundo