Corrida jogo de carro, carro em movimento mais rápido no computador mais rápido

StackOverflow https://stackoverflow.com/questions/2201241

  •  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.

Foi útil?

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

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