DrawPoint call from an object Window unresponsive

I made a function to draw circles in SDL through only the outside points or a filed circle.
All goes well whenever i call the drawpoint or drawline function in the main.
the problems begin when i call the render function of an object and call drawPoint and drawLine in there.
I checked all functions if they return an SDL_error but non is thrown. window and renderer are both present and not null.
But the window is all white and seems unresponsive as nothing is being drawn on the window. it seems odd that it would be white as i start the overall rendering process with a black window clear.

The main function:
int main(int argc, char* argv[])
{
SDL_Init(SDL_INIT_EVERYTHING);

SDL_WindowWrapper window("FlatGalaxy", 800, 600, false);
SDL_RendererWrapper renderer(window, -1);
vector<GameObject> GameObjectList;

GameObject object1(45, 310, 1, 0, 20, "blue"); //create my object at and x (45) and y (310) value and a radius (20) and color.
GameObjectList.push_back(object1);

SDL_SetRenderDrawColor(renderer.Get(), 0, 0, 0, SDL_ALPHA_OPAQUE);
SDL_RenderClear(renderer.Get());

#if false
SDL_SetRenderDrawColor(renderer.Get(), 255, 255, 255, SDL_ALPHA_OPAQUE);
for (GameObject Object : GameObjectList)
{
Object.Render(renderer);
}
#endif
SDL_SetRenderDrawColor(renderer.Get(), 255, 0, 0, SDL_ALPHA_OPAQUE);
SDL_RenderDrawLine(renderer.Get(), 100, 100, 200, 200);
object1.Render(renderer); //problem is here!!
SDL_RenderDrawRect(renderer.Get(), &GameObjectList[0].m_DrawRect);

SDL_RenderPresent(renderer.Get());

//SDL_Delay(10000);
SDL_Event e;
bool quit = false;
while (!quit)
{
	while (SDL_PollEvent(&e) != 0)
	{
		if (e.type == SDL_QUIT)
		{
			quit = true;
		}
	}
}
SDL_Quit();
return 0;

}

the objects render function:
void GameObject::Render(SDL_RendererWrapper a_Renderer)
{
if (SDL_SetRenderDrawColor(a_Renderer.Get(), 0, 0, 255, SDL_ALPHA_OPAQUE) < 0)
{
printf(“SDL_Draw Color Set failed: %s\n”, SDL_GetError());
}
//SDL_RenderDrawLine(a_Renderer.Get(), 100, 200, 200, 100);
DrawCircle(a_Renderer, m_DrawRect.x + m_Radius, m_DrawRect.y + m_Radius, m_Radius, false);
}

void GameObject::DrawCircle(SDL_RendererWrapper a_Renderer, int a_CentreX, int a_CentreY, int a_Radius, bool IsFilled)
{
const int32_t diameter = (a_Radius * 2);

int32_t x = (a_Radius - 1);
int32_t y = 0;
int32_t tx = 1;
int32_t ty = 1;
int32_t error = (tx - diameter);

#if true
if (SDL_RenderDrawPoint(a_Renderer.Get(), a_CentreX + x, a_CentreY - y) < 0)
{
printf(“SDL_draw_point failed: %s\n”, SDL_GetError());
}
if (SDL_RenderDrawPoint(a_Renderer.Get(), a_CentreX + x, a_CentreY + y) < 0)
{
printf(“SDL_draw_point failed: %s\n”, SDL_GetError());
}
if (SDL_RenderDrawPoint(a_Renderer.Get(), a_CentreX - x, a_CentreY - y) < 0)
{
printf(“SDL_draw_point failed: %s\n”, SDL_GetError());
}
if (SDL_RenderDrawPoint(a_Renderer.Get(), a_CentreX - x, a_CentreY + y) < 0)
{
printf(“SDL_draw_point failed: %s\n”, SDL_GetError());
}
if (SDL_RenderDrawPoint(a_Renderer.Get(), a_CentreX + y, a_CentreY - x) < 0)
{
printf(“SDL_draw_point failed: %s\n”, SDL_GetError());
}
if (SDL_RenderDrawPoint(a_Renderer.Get(), a_CentreX + y, a_CentreY + x) < 0)
{
printf(“SDL_draw_point failed: %s\n”, SDL_GetError());
}
if (SDL_RenderDrawPoint(a_Renderer.Get(), a_CentreX - y, a_CentreY - x) < 0)
{
printf(“SDL_draw_point failed: %s\n”, SDL_GetError());
}
if (SDL_RenderDrawPoint(a_Renderer.Get(), a_CentreX - y, a_CentreY + x) < 0)
{
printf(“SDL_draw_point failed: %s\n”, SDL_GetError());
}
#else
while (x >= y)
{
if (!IsFilled)
{
// Each of the following renders an octant of the circle
SDL_RenderDrawPoint(a_Renderer.Get(), a_CentreX + x, a_CentreY - y); //1
SDL_RenderDrawPoint(a_Renderer.Get(), a_CentreX + x, a_CentreY + y); //2
SDL_RenderDrawPoint(a_Renderer.Get(), a_CentreX - x, a_CentreY - y); //3
SDL_RenderDrawPoint(a_Renderer.Get(), a_CentreX - x, a_CentreY + y); //4
SDL_RenderDrawPoint(a_Renderer.Get(), a_CentreX + y, a_CentreY - x); //5
SDL_RenderDrawPoint(a_Renderer.Get(), a_CentreX + y, a_CentreY + x); //6
SDL_RenderDrawPoint(a_Renderer.Get(), a_CentreX - y, a_CentreY - x); //7
SDL_RenderDrawPoint(a_Renderer.Get(), a_CentreX - y, a_CentreY + x); //8
}
else
{
//SDL_RenderDrawLine
SDL_RenderDrawLine(a_Renderer.Get(), a_CentreX + x, a_CentreY - y, a_CentreX, a_CentreY - y); //1
SDL_RenderDrawLine(a_Renderer.Get(), a_CentreX + x, a_CentreY + y, a_CentreX, a_CentreY + y); //2
SDL_RenderDrawLine(a_Renderer.Get(), a_CentreX - x, a_CentreY - y, a_CentreX, a_CentreY - y); //3
SDL_RenderDrawLine(a_Renderer.Get(), a_CentreX - x, a_CentreY + y, a_CentreX, a_CentreY + y); //4
SDL_RenderDrawLine(a_Renderer.Get(), a_CentreX + y, a_CentreY - x, a_CentreX, a_CentreY - x); //5
SDL_RenderDrawLine(a_Renderer.Get(), a_CentreX + y, a_CentreY + x, a_CentreX, a_CentreY + x); //6
SDL_RenderDrawLine(a_Renderer.Get(), a_CentreX - y, a_CentreY - x, a_CentreX, a_CentreY - x); //7
SDL_RenderDrawLine(a_Renderer.Get(), a_CentreX - y, a_CentreY + x, a_CentreX, a_CentreY + x); //8
}

	if (error <= 0)
	{
		++y;
		error += ty;
		ty += 2;
	}

	if (error > 0)
	{
		--x;
		tx += 2;
		error += (tx - diameter);
	}

}
#endif
}

i hope someone can help.
Thank you in advance.

Hi and welcome to the forum!

You’re calling your GameObject::Render() function before your mainloop (while(!quit){}) starts.
If the code for some reason get stuck in the while loop in the GameObject::DrawCircle() function, the mainloop never starts, which means SDL won’t handle any window events, which means the window becomes unresponsive and so on.

A typical SDL mainloop looks like this:

while(!Quit)
{
	while(SDL_PollEvent(&Event))
	{
		switch(Event.type)
		{
			case SDL_QUIT:
			{
				Quit = true;

				break;
			}

			default:
				break;
		}
	}

	// Game logic handling
	Update();

	// Game rendering
	Render();
}

In short:

  • Execute your GameObject::Render() function inside the mainloop, instead of executing it before the mainloop.
  • Make sure that the code doesn’t get stuck in the while loop in the GameObject::DrawCircle() function.