The problem with your code, as of now, is that you’re only render the rectangles one frame, which is in the SDL_KEYDOWN event. There’s a few things that can be changed in your code. Some of them regarding the design and some of them regarding to make the program works the way it’s planned. Here’s my version of your code.
Code:
Code:
#include “SDL.h”
#include
SDL_Window* m_pWindow = NULL;
SDL_Renderer* m_pRenderer = NULL;
SDL_Event m_Event;
bool m_Running = true;
bool m_Render1 = false;
bool m_Render2 = false;
bool Init()
{
// Initialize SDL
// If there was a problem with initializing SDL, return false
if(SDL_Init(SDL_INIT_EVERYTHING) == -1)
return false;
else
{
// Create the SDL window
m_pWindow = SDL_CreateWindow("Render rectangles", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 800, 600, SDL_WINDOW_SHOWN);
// If the SDL window has been successfully created
if(m_pWindow)
{
// Create the SDL renderer
m_pRenderer = SDL_CreateRenderer(m_pWindow, -1, SDL_RENDERER_ACCELERATED);
// If the SDL renderer has been successfully created
if(m_pRenderer)
{
// Clear the window to white
SDL_SetRenderDrawColor(m_pRenderer, 0xFF, 0xFF, 0xFF, 0xFF);
}
// If there was a problem creating the SDL renderer
else
return false;
}
// If there was a problem creating the SDL window
else
return false;
}
// If everything was successfully initialized / created
return true;
}
void Close()
{
// Shut down SDL, destroy textures, surfaces and such
SDL_Quit();
}
void RenderRectangle(int RectangleXPosition, int RectangleYPosition, int RectangleWidth, int RectangleHeight, SDL_Color RectangleColor, bool Filled)
{
// Create the rectangle to render
SDL_Rect Rectangle = {RectangleXPosition, RectangleYPosition, RectangleWidth, RectangleHeight};
// Set the rectangle color
SDL_SetRenderDrawColor(m_pRenderer, RectangleColor.r, RectangleColor.g, RectangleColor.b, RectangleColor.a);
// Render a filled rectangle
if(Filled)
SDL_RenderFillRect(m_pRenderer, &Rectangle);
// Render a unfilled rectangle
else
SDL_RenderDrawRect(m_pRenderer, &Rectangle);
}
int main(int argc, char* args[])
{
if(!Init())
std::cout << “Failed to init!” << std::endl;
else
{
while(m_Running)
{
while(SDL_PollEvent(&m_Event))
{
if(m_Event.type == SDL_QUIT)
m_Running = false;
if(m_Event.type == SDL_KEYDOWN)
{
if(m_Event.key.keysym.sym == SDLK_1)
{
/*
If the bool is true, it will be changed to false
If the bool is false, it will be changed to true
*/
m_Render1 = !m_Render1;
// If(m_Render1) is the same as If(m_Render1 == true)
if(m_Render1)
std::cout << "render1: true " << std::endl;
else
std::cout << "render1: false" << std::endl;
}
if(m_Event.key.keysym.sym == SDLK_2)
{
m_Render2 = !m_Render2;
if(m_Render2)
std::cout << "render2: true " << std::endl;
else
std::cout << "render2: false" << std::endl;
}
}
}
// Clear the current render target
SDL_RenderClear(m_pRenderer);
if(m_Render1)
{
// The color of the rectangle (red)
SDL_Color RectangleColor = {0xFF, 0x00, 0x00, SDL_ALPHA_OPAQUE};
// Draw a filled rectangle on the chosen position, in the chosen color
RenderRectangle(200, 200, 32, 32, RectangleColor, true);
}
if(m_Render2)
{
// The color of the rectangle (blue)
SDL_Color RectangleColor = {0x00, 0x00, 0xFF, SDL_ALPHA_OPAQUE};
// Draw a unfilled rectangle on the chosen position, in the chosen color
RenderRectangle(300, 200, 32, 32, RectangleColor, false);
}
// Clear the window to white after the render operations
SDL_SetRenderDrawColor(m_pRenderer, 0xFF, 0xFF, 0xFF, SDL_ALPHA_OPAQUE);
// Update the window
SDL_RenderPresent(m_pRenderer);
}
}
Close();
return 0;
}