Witam,
Przypominam sobie na nowo SDL2 i testuje jego poszczególne elementy. Otóż mam problem z diagonalnym poruszaniem obiektem. Ruch jest płynny, aż nadto....
Do obsługi klawiatury wykorzystuję SDL_GetKeyboardState(), flaga SDL_RENDERER_PRESENTVSYNC wyłączona, gdyż nie chcę przycinać FPS a ruch postaci i tak jest zależny od dt w ms. Poniżej zamieszczam główny kod i film obrazujący problem.
while (isRunning)
{
currentTime = SDL_GetTicks();
deltaTime = (currentTime - lastTime);
lastTime = currentTime;
while (SDL_PollEvent(&mEvent))
{
if (mEvent.type == SDL_QUIT || mEvent.key.keysym.sym == SDLK_ESCAPE)
{
isRunning = false;
}
}
keysState = SDL_GetKeyboardState(NULL);
if (keysState[SDL_SCANCODE_UP])
{
mSprite->getPlayerRect()->y -= movementSpeed * deltaTime;
//printf("X: %d | Y: %d\n", mSprite->getPlayerRect()->x, mSprite->getPlayerRect()->y);
printf("speed*dt: %f * %f = %f\n", movementSpeed, deltaTime, movementSpeed*deltaTime);
}
if (keysState[SDL_SCANCODE_DOWN])
{
mSprite->getPlayerRect()->y += movementSpeed * deltaTime;
//printf("X: %d | Y: %d\n", mSprite->getPlayerRect()->x, mSprite->getPlayerRect()->y);
printf("speed*dt: %f * %f = %f\n", movementSpeed, deltaTime, movementSpeed*deltaTime);
}
if (keysState[SDL_SCANCODE_LEFT])
{
mSprite->getPlayerRect()->x -= movementSpeed * deltaTime;
//printf("X: %d | Y: %d\n", mSprite->getPlayerRect()->x, mSprite->getPlayerRect()->y);
printf("speed*dt: %f * %f = %f\n", movementSpeed, deltaTime, movementSpeed*deltaTime);
}
if (keysState[SDL_SCANCODE_RIGHT])
{
mSprite->getPlayerRect()->x += movementSpeed * deltaTime;
//printf("X: %d | Y: %d\n", mSprite->getPlayerRect()->x, mSprite->getPlayerRect()->y);
printf("speed*dt: %f * %f = %f\n", movementSpeed, deltaTime, movementSpeed*deltaTime);
}
frameTime += deltaTime;
//odswiezanie animacji 4 razy na 1s
if (frameTime >= 250.f)
{
//printf("%f\n", deltaTime);
frameTime = 0;
mSprite->setNextSpriteFrame();
}
mSprite->render();
SDL_RenderPresent(mRenderer);
}
https://youtu.be/U9KDVapWpfs