Hi, I’m writing a little simple game and I’ve got a problem with smooth movement and I really don’t know how to solve it. I don’t even know if it can look better than now. Here is a link to video presenting how does it look right now(it’s 150mb, but it has to be 60fps to see the problem): https://mega.nz/#!jN9yEB6D!VWsdFDiyisFp6c_kb2_MdQVVMXp8ggBm-xweJmF7WCE
If you look closely you might see sometimes a little… I don’t know… “vibrating”, “lags”? When I’m running that from visual(debug mode) it’s more laggy but I recorded just exe file.
I’m using VSync in my code(I guess :D) and it looks something like that:
int main(int agrc, char* args[])
{
//init everything
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
//some not important declarations and definitions
SDL_Window *window = SDL_CreateWindow("game", 50, 50, win_size.x, win_size.y, SDL_WINDOW_OPENGL);
SDL_GLContext context = SDL_GL_CreateContext(window);
SDL_GL_SetSwapInterval(1);
glViewport(win_pos.x, win_pos.y, win_size.x, win_size.y);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glDisable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
//a little more declarations and definitions
while (run)
{
while (SDL_PollEvent(&event))
{
//input, not so important
}
//logic, speed=5(pixels)
if (moveUp && win_pos.y > 0)
win_pos.y -= speed;
if (moveDown && win_pos.y < map_height - win_size.y)
win_pos.y += speed;
if (moveLeft && win_pos.x > 0)
win_pos.x -= speed;
if (moveRight && win_pos.x < map_width - win_size.x)
win_pos.x += speed;
//rendering
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix();
glOrtho(win_pos.x, win_size.x + win_pos.x, win_size.y + win_pos.y, win_pos.y, -1, 1);
glTranslatef(win_pos.x, win_pos.y, 0.0f);
map.draw(win_pos.x, win_pos.y, win_size.x, win_size.y); //drawing function
glPopMatrix();
SDL_GL_SwapWindow(window);
}
//quit
}
//and a drawing code(for one tile, because map is tile based):
void Tile::draw(int x, int y)
{
pos.x = x;
pos.y = y;
glColor4ub(255, 255, 255, 255);
glEnable(GL_TEXTURE_2D);
switch (type)
{
case GROUND:
glBindTexture(GL_TEXTURE_2D, ground_texture);
break;
case ROOM:
glBindTexture(GL_TEXTURE_2D, room_texture);
break;
}
glBegin(GL_QUADS);
glTexCoord2d(0, 0); glVertex2i(x, y);
glTexCoord2d(1, 0); glVertex2i(x + size.x, y);
glTexCoord2d(1, 1); glVertex2i(x + size.x, y + size.y);
glTexCoord2d(0, 1); glVertex2i(x, y + size.y);
glEnd();
glDisable(GL_TEXTURE_2D);
}