Good afternoon everyone. I’m doing a task - to write a game on SDL2. I faced a problem: sprites are vertically unsynchronized when rendering and all this turns into stripes. When I move the window or click the mouse, the sprites are rendered as they should be. Attached screenshots. I have never worked with SDL2 before. I couldn’t find a solution on google.
How my window looks:
I attached code below
main() function:
#include "Game.hpp"
int main(int argc, char* argv[])
{
return run(new Game);
}
Class Game:
#include "Game.hpp"
Game::Game() : w(800), h(600), fullscr(false) {}
Game::Game(int width, int height, bool fullscreen) : w(width), h(height), fullscr(fullscreen) {}
void Game::PreInit(int& width, int& height, bool& fullscreen)
{
width = w;
height = h;
fullscreen = fullscr;
}
bool Game::Init()
{
doodle = createSprite("../assets/doodle/blue-lik-left.png");
background = createSprite("../assets/bck.png");
platform = createSprite("../assets/platform.png");
// Random placement of platforms
int plat_width{}, plat_height{};
getSpriteSize(platform, plat_width, plat_height);
srand(time(0));
for (std::size_t i = 0; i < 10; ++i)
{
plat[i].x = rand() % w - plat_width;
plat[i].y = rand() % h - plat_height;
}
return true;
}
void Game::Close()
{
destroySprite(doodle);
destroySprite(background);
destroySprite(platform);
}
bool Game::Tick()
{
drawTestBackground();
drawSprite(background, 0, 0);
drawSprite(doodle, doodle_pos.x, doodle_pos.y);
for (std::size_t i = 0; i < 10; ++i)
drawSprite(platform, plat[i].x, plat[i].y);
return false;
}
void Game::onMouseMove(int x, int y, int xrelative, int yrelative)
{
}
void Game::onMouseButtonClick(FRMouseButton button, bool isReleased)
{
}
void Game::onKeyPressed(FRKey k)
{
}
void Game::onKeyReleased(FRKey k)
{
}
const char* Game::GetTitle()
{
return "Doodle Jump";
}
run() function:
static SDL_Renderer *g_renderer;
static int g_width = 800;
static int g_height = 600;
static int g_framework_initialized = false;
FRAMEWORK_API int run(Framework* framework)
{
SDL_Window *window;
Uint32 flags;
int done;
SDL_Event event;
for (int i = 0; i < (int)FRKey::COUNT; ++i)
{
GKeyState[i] = false;
}
Framework* GFramework = framework;
bool fullscreen;
GFramework->PreInit(g_width, g_height, fullscreen);
flags = SDL_WINDOW_HIDDEN;
if (fullscreen) {
SDL_ShowCursor(0);
flags |= SDL_WINDOW_FULLSCREEN;
}
if (SDL_Init(SDL_INIT_VIDEO) == -1) {
fprintf(stderr, "SDL_Init(SDL_INIT_VIDEO) failed: %s\n", SDL_GetError());
return(2);
}
if (SDL_CreateWindowAndRenderer(0, 0, flags, &window, &g_renderer) < 0) {
fprintf(stderr, "SDL_CreateWindowAndRenderer() failed: %s\n", SDL_GetError());
return(2);
}
{
/* Show the window */
SDL_SetWindowTitle(window, GFramework->GetTitle());
SDL_SetWindowSize(window, g_width, g_height);
SDL_ShowWindow(window);
g_framework_initialized = true;
if (!GFramework->Init())
{
fprintf(stderr, "Framework::Init failed\n");
SDL_Quit();
exit(1);
}
done = 0;
while ( ! done ) {
while ( SDL_PollEvent(&event) ) {
switch (event.type) {
case SDL_KEYUP:
switch (event.key.keysym.sym) {
case SDLK_RIGHT:
case SDLK_LEFT:
case SDLK_DOWN:
case SDLK_UP:
{
int key_index = (event.key.keysym.sym - SDLK_RIGHT);
if (GKeyState[key_index])
{
GFramework->onKeyReleased((FRKey)key_index);
GKeyState[key_index] = false;
}
break;
}
case SDLK_ESCAPE:
done = 1;
break;
default:
break;
}
break;
case SDL_KEYDOWN:
switch (event.key.keysym.sym) {
case SDLK_RIGHT:
case SDLK_LEFT:
case SDLK_DOWN:
case SDLK_UP:
{
int key_index = (event.key.keysym.sym - SDLK_RIGHT);
if (!GKeyState[key_index])
{
GFramework->onKeyPressed((FRKey)key_index);
GKeyState[key_index] = true;
}
}
break;
default:
break;
}
break;
case SDL_MOUSEBUTTONDOWN:
if (event.button.button <= SDL_BUTTON_RIGHT) {
GFramework->onMouseButtonClick((FRMouseButton)(event.button.button - SDL_BUTTON_LEFT), false);
}
break;
case SDL_MOUSEBUTTONUP:
if (event.button.button <= SDL_BUTTON_RIGHT) {
GFramework->onMouseButtonClick((FRMouseButton)(event.button.button - SDL_BUTTON_LEFT), true);
}
break;
case SDL_MOUSEMOTION:
GFramework->onMouseMove(event.motion.x, event.motion.y, event.motion.xrel, event.motion.yrel);
break;
case SDL_QUIT:
done = 1;
break;
default:
break;
}
}
SDL_RenderClear(g_renderer);
SDL_Rect viewport;
SDL_RenderGetViewport(g_renderer, &viewport);
/* Draw a gray background */
SDL_SetRenderDrawColor(g_renderer, 0xA0, 0xA0, 0xA0, 0xFF);
SDL_RenderClear(g_renderer);
done |= GFramework->Tick() ? 1 : 0;
SDL_RenderPresent(g_renderer);
SDL_Delay(1);
}
}
GFramework->Close();
SDL_DestroyRenderer(g_renderer);
SDL_DestroyWindow(window);
g_framework_initialized = false;
/* We're done! */
SDL_Quit();
return(0);
}
I don’t have to change anything in the run() function at all. It’s kind of a part of the framework. And I don’t understand what the hell is going on))) Does anyone know what’s going on here? Thanks in advance for your help.