Hello everyone !
I’m currently learning how to create a basic window and rectangles on screen with SDL2 in C++. Here are the main and Game files :
main.cpp
#include <iostream>
#include "Game.hpp"
#include "Player.hpp"
#include "Obstacle.hpp"
int main(int argc, char **argv)
{
Game *game = new Game();
if(game->init() != true)
{
std::cerr << "Error during initialization..." << std::endl;
}
else
{
Player *player = new Player(400,550,40,40);
Obstacle *obstacle = new Obstacle();
SDL_Rect player_box;
SDL_Rect obstacle_box;
while(game->handleEvents(*player) == true)
{
player_box.x = player->get_x();
player_box.y = player->get_y();
player_box.w = player->get_w();
player_box.h = player->get_h();
obstacle_box.x = obstacle->get_x();
obstacle_box.y = obstacle->get_y();
obstacle_box.w = obstacle->get_w();
obstacle_box.h = obstacle->get_h();
game->draw(player_box);
game->draw(obstacle_box);
if(obstacle->get_y() <= 600)
{
obstacle->move(1);
}
else
{
obstacle->set_y(20);
}
game->update();
}
}
delete game;
return 0;
}
Game.cpp
#include <iostream>
#include <SDL2/SDL.h>
#include "Game.hpp"
#include "Player.hpp"
Game::Game()
{
}
Game::~Game()
{
SDL_DestroyWindow(window);
SDL_Quit();
}
bool Game::init()
{
bool success = true;
if(SDL_Init(SDL_INIT_VIDEO) != 0)
{
std::cerr << "Error : Video init " << SDL_GetError() << std::endl;
success = false;
}
else
{
window = SDL_CreateWindow("C++",
SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED,
800,
600,
SDL_WINDOW_SHOWN);
if(window == NULL)
{
std::cerr << "Error : Window init " << SDL_GetError() << std::endl;
success = false;
}
else
{
window_renderer = SDL_CreateRenderer(window,-1,SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
if(window_renderer == NULL)
{
std::cerr << "Error : Video init " << SDL_GetError() << std::endl;
success = false;
}
}
}
return success;
}
bool Game::handleEvents(Player &player)
{
bool isRunning = true;
SDL_Event ev;
while(SDL_PollEvent(&ev) != 0)
{
if(ev.type == SDL_QUIT)
{
isRunning = false;
}
if(ev.type == SDL_KEYDOWN)
{
switch(ev.key.keysym.sym)
{
case SDLK_ESCAPE:
isRunning = false;
break;
case SDLK_LEFT:
if(player.get_x() >= 20)
{
player.move(-10);
}
break;
case SDLK_RIGHT:
if(player.get_x() <= 750)
{
player.move(10);
}
break;
default:
break;
}
}
}
return isRunning;
}
void Game::draw(SDL_Rect &rect)
{
SDL_RenderDrawRect(window_renderer,&rect);
SDL_SetRenderDrawColor(window_renderer,255,255,255,0);
SDL_RenderFillRect(window_renderer, &rect);
SDL_RenderPresent(window_renderer);
}
void Game::update()
{
SDL_Delay(1000/60);
SDL_SetRenderDrawColor(window_renderer,0,0,0,0);
SDL_RenderClear(window_renderer);
SDL_RenderPresent(window_renderer);
}
I would like to draw two rectangles, the player and the obstacle via the Game::draw() function. But the problem is that each time I update the screen, It goes black/white over and over. How can I solve this ? Maybe using SDL_Surface instead of drawing with the renderer ?
Kind Regards