The SDL forums have moved to
discourse.libsdl.org
.
This is just a read-only archive of the previous forums, to keep old links working.
SDL
Simple Directmedia Layer Forums
Game-Timing
axgs
Joined: 17 Apr 2016
Posts: 1
Posted: Mon Apr 18, 2016 6:19 am
Hi everyone,
is this the right approach to limit the game-timming. It works, but sometimes a sprite is not smooth in movement ( a little time).
some pseudo-Code:
lastGameTime=newGameTime;
RenderAllGameGfx();
UpdateAllGameObjects(); // playerX += dt * speedX;
newGameTime=SDL_GetTicks();
dt = (newGameTime-lastGameTime) / (1000.0/60.0);
On creating the SDL_Renderer I don´t have set the SDL_RENDERERPREVENT_VSYNC flag.
I am grateful for any comment.
Thanks
Alex
Naith
Joined: 03 Jul 2014
Posts: 158
Posted: Mon Apr 18, 2016 12:41 pm
Looks correct to me, except that when you're calculating the deltatime, you're dividing 1000.0 with 60.0, which I'm not sure why you do.
Example code on how I usually do it:
Code:
#include "SDL.h"
#define WINDOW_WIDTH 800
#define WINDOW_HEIGHT 600
#define PLAYER_WIDTH 32
#define PLAYER_HEIGHT 32
// Double for extra precision
double OldTime = 0.0;
double NewTime = 0.0;
double DeltaTime = 0.0;
// Floats for smooth movement
float PlayerPosX = (WINDOW_WIDTH / 2) - (PLAYER_WIDTH / 2)
float PlayerPosY = (WINDOW_HEIGHT / 2) - (PLAYER_HEIGHT / 2)
float SpeedX = 100.0f;
float SpeedY = 100.0f;
bool Running = true;
SDL_Rect PlayerRect = {(int)PlayerPosX, (int)PlayerPosY, PLAYER_WIDTH, PLAYER_HEIGHT};
SDL_Event Event;
int main(int argc, char* argv[])
{
// Initialize SDL and such
while(Running)
{
while(SDL_PollEvent(&Event))
{
switch(Event.type)
{
case SDL_QUIT:
{
Running = false;
break;
}
case SDL_KEYDOWN:
{
if(Event.key.keysym.sym == SDL_SCANCODE_UP)
PlayerPosY -= SpeedY * DeltaTime;
else if(Event.key.keysym.sym == SDL_SCANCODE_DOWN)
PlayerPosY += SpeedY * DeltaTime;
if(Event.key.keysym.sym == SDL_SCANCODE_LEFT)
PlayerPosX -= SpeedX * DeltaTime;
else if(Event.key.keysym.sym == SDL_SCANCODE_RIGHT)
PlayerPosX += SpeedX * DeltaTime;
break;
}
}
default:
break;
}
// Calculate the deltatime
m_NewTime = SDL_GetTicks();
m_DeltaTime = (m_NewTime - m_OldTime) / 1000.0;
m_OldTime = m_NewTime;
// Typecast into int's to get rid of decimal values
PlayerRect.x = (int)PlayerPosX;
PlayerRect.y = (int)PlayerPosY;
}
// Quit SDL and such
return 0;
}
Powered by
phpBB
© phpBB Group
Design by
Vjacheslav Trushkin
for
phpBBStyles.com
.
Content © SDL