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); }