Edit: Eu corrigi o problema, tornando a jumpvelocity aquela que é modificada e adicionada e a yvelocity é igual à jumpvelocity * t. Isto é o que eu tenho agora:
if (GUI->Space && grounded){
jumpvelocity = -185.f * 2 / gravity;
grounded = false;
}
if(!grounded ){
if(jumpvelocity < terminaly){
jumpvelocity += 185.f * t * 4 / gravity;
yvelocity = jumpvelocity * t;
}
else{
jumpvelocity = terminaly;
yvelocity = jumpvelocity * t / gravity;
}
}
else{
yvelocity = 0.f;
jumpvelocity = 0.f;
}
Obrigado pela ajuda.
Estou tentando fazer minha gravidade funcionar. O código que eu tenho até agora é
if (jumpvelocity < 0){
yvelocity = jumpvelocity * t *2/gravity;
jumpvelocity += 185.f*t * 2 / gravity;
}
else if(!grounded ){
if(yvelocity < terminaly)
yvelocity += t / gravity;
else
yvelocity = terminaly;
}
A gravidade aumenta para cima, fazendo com que a queda e o salto sejam mais lentos. Seu valor padrão é 1. Jumpvelocity é definido como 185 quando o jogador deseja pular. Meu problema é que você cai mais devagar em uma taxa de quadros mais lenta, mas salta na mesma velocidade como se fosse uma taxa de quadros mais alta. Como eu faria com que o quadro fosse independente? T é tempo delta.
jumpvelocity
a média com o valor anterior ao atualizaryvelocity
, fornecendo um erro de precisão que piorará com menor taxa de quadros. O que você chama deyvelocity
fato deve ser,ymovement
pois é uma velocidade multiplicada pelo tempo. Você está atualizandojumpvelocity
quando o personagem não toca mais o chão, o que não tem significado físico. Sua verificaçãoterminaly
é feita antes da atualização, causandojumpvelocity
umterminaly
aumento maior e piorando nas taxas de quadros inferiores.Respostas:
Em cada iteração do loop principal:
currentTime
(por exemplo, SDL_GetTicks ())timeDelta = currentTime - lastTime
timeDelta
para segundos (geralmente em ms ou ns), armazene comotimeDeltaSeconds
For each entity in entities: entity.position = velocityInUnitsPerSecond * timeDeltaSeconds
lastTime = currentTime
(também pode ser feito antes da etapa 1 em vez de aqui)... Você precisará ajustar seus números atuais para que estejam em unidades por segundo, ou seja, para que eles façam sentido a 1FPS. Por exemplo, se você esperava que a velocidade horizontal do seu personagem fosse 2 pixels por décimo de segundo, agora você precisa defini-la como 20 pixels por segundo. Dessa forma, o acima irá funcionar corretamente.
Para alguns aplicativos, é melhor fixar seu timestep em um determinado valor. Nesse caso
timestep != timeDelta
,. O último é a quantidade de tempo do sistema que realmente passou; o primeiro é um valor quantizado que você deseja consumir do seu acumulador de tempo cada vez que aplica atualizações lógicas no seu jogo. Isso ajuda na integração quando você está usando solucionadores iterativos, como os encontrados nos conhecidos mecanismos de física, porque os intervalos de tempo devem ser iguais ao fazer o cálculo. Nesse caso, como você não está gastando todo o tempo restante em cada tick, você terá frações de tempo restantes e precisará acumulá-las para usá-las em ticks posteriores. Para saber mais sobre isso, leia Fix Your Timestep, de Glenn Fiedler.fonte
velocityInUnitsPerSecond
mas a velocidade média durante o período decorrido. Se a velocidade é constante, seu código está correto. Se a velocidade varia linearmente, como é o caso da gravidade, esse valor é0.5 * (OldVelocity + NewVelocity)
. Caso contrário, pode ser necessário integrar-se em um intervalo de tempo menor para evitar problemas de precisão.Parece que não
jumpvelocity
é necessário. Saltar significa ajustar instantaneamente a velocidade para um determinado valor: uma vez que os pés não tocam mais o chão, a única coisa que pode mudar de velocidade é a gravidade (e a resistência do ar, que você implementa usando a velocidade terminal).Outra observação: as divisões de ponto flutuante são extremamente lentas. Eu sugiro que você armazene em
1.0f / gravity
vez degravity
.Finalmente, existe a possibilidade de que, para um quadro,
yvelocity
seja maior queterminaly
.Minha sugestão:
E lembre-se de que o seguinte não é preciso:
Você precisa fazer:
fonte