在C/C++中用SDL2_gfx画一个实心圆
Draw a filled circle with SDL2_gfx in C/C++
我是 SDL 初学者。
我想用 SDL2 在其上绘制黑色背景和实心蓝色圆圈。由于SDL2无法画圆,所以我用SDL2_gfx. I have no problem to draw a black background, but I do not arrive to draw a circle with the function filledCircleRGBA.
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#include <SDL2/SDL.h>
#include <SDL2/SDL2_gfxPrimitives.h>
#define DEFAULT_WINDOW_WIDTH 800
#define DEFAULT_WINDOW_HEIGHT 600
void
print_SDL_error()
{
fputs("SDL_Error: ", stderr);
fputs(SDL_GetError(), stderr);
fputc('\n', stderr);
}
bool
initSDL()
{
if(SDL_Init(SDL_INIT_VIDEO) < 0)
{
fprintf(stderr, "SDL could not initialize!\n");
print_SDL_error();
return false;
}
return true;
}
SDL_Window*
initMainWindow()
{
SDL_Window* window;
window = SDL_CreateWindow("SDL2 test",
SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
DEFAULT_WINDOW_WIDTH, DEFAULT_WINDOW_HEIGHT,
SDL_WINDOW_SHOWN);
if(window == NULL)
{
fprintf(stderr, "SDL could not create a window!\n");
print_SDL_error();
}
return window;
}
SDL_Window*
initSDLAndMainWindow(SDL_Window* * window)
{
return initSDL() ? initMainWindow() : NULL;
}
void
quit(SDL_Window* main_window)
{
SDL_DestroyWindow(main_window);
SDL_Quit();
}
int
main(int argc, char* argv[])
{
SDL_Window* main_window;
main_window = initMainWindow();
if(main_window == NULL)
{
quit(NULL);
return EXIT_FAILURE;
}
SDL_Renderer* main_window_renderer;
main_window_renderer = SDL_CreateRenderer(main_window, -1, SDL_RENDERER_ACCELERATED);
if(main_window_renderer == NULL)
{
fprintf(stderr, "Renderer could not be created!\n");
print_SDL_error();
quit(main_window);
return EXIT_FAILURE;
}
SDL_SetRenderDrawColor(main_window_renderer, 0, 0, 0, 0);
SDL_RenderClear(main_window_renderer);
SDL_RenderPresent(main_window_renderer);
SDL_Delay(2000);
if(filledCircleRGBA(main_window_renderer,
150, 150, 75,
0, 0, 255, 0) != 0)
{
fprintf(stderr, "A circle was not rendered!\n");
print_SDL_error();
SDL_DestroyRenderer(main_window_renderer);
quit(main_window);
return EXIT_FAILURE;
}
SDL_RenderPresent(main_window_renderer);
SDL_Delay(2000);
SDL_DestroyRenderer(main_window_renderer);
quit(main_window);
return EXIT_SUCCESS;
}
我 运行 在 Debian GNU/Linux 8 "Jessie" 下,我使用我的发行版的 libsdl2-dev 和 libsdl2-gfx-dev。
为了编译,我使用 gcc -O0 -g sdl2-test.c `sdl2-config --cflags --libs` -lSDL2_gfx
.
此外,valgrind 通知我 21 个上下文中有 21 个错误。 3 个错误来自 SDL2 调用,19 个来自 nouveau_dri.so,我认为这是 nouveau driver (a free/libre driver for nVidia GPU) 使用的共享库,所以这可能不是我的错。
谢谢。
您正在调用 filledCircleRGBA
,alpha 值为 0。您的圈子是完全透明的。
对于 Valgrind 报告的错误,我只是注意到您实际上并没有调用 SDL_Init
。这导致了一些泄漏,但不是全部。其他的不是你的代码造成的。
我也看到了一些Conditional jump or move depends on uninitialised value(s)
。 Valgrind 可以报告使用 --track-origins=yes
选项创建未初始化值的位置,这样您就可以查看是否将未初始化值传递给库函数,或者错误是否在函数中。
您可以为 Valgrind 创建一个 suppression file 来隐藏不属于您的泄漏。如果您想创建足够特定的规则以避免隐藏使用 SDL 函数创建内容但不破坏它的情况,最好为库提供调试符号。
我是 SDL 初学者。 我想用 SDL2 在其上绘制黑色背景和实心蓝色圆圈。由于SDL2无法画圆,所以我用SDL2_gfx. I have no problem to draw a black background, but I do not arrive to draw a circle with the function filledCircleRGBA.
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#include <SDL2/SDL.h>
#include <SDL2/SDL2_gfxPrimitives.h>
#define DEFAULT_WINDOW_WIDTH 800
#define DEFAULT_WINDOW_HEIGHT 600
void
print_SDL_error()
{
fputs("SDL_Error: ", stderr);
fputs(SDL_GetError(), stderr);
fputc('\n', stderr);
}
bool
initSDL()
{
if(SDL_Init(SDL_INIT_VIDEO) < 0)
{
fprintf(stderr, "SDL could not initialize!\n");
print_SDL_error();
return false;
}
return true;
}
SDL_Window*
initMainWindow()
{
SDL_Window* window;
window = SDL_CreateWindow("SDL2 test",
SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
DEFAULT_WINDOW_WIDTH, DEFAULT_WINDOW_HEIGHT,
SDL_WINDOW_SHOWN);
if(window == NULL)
{
fprintf(stderr, "SDL could not create a window!\n");
print_SDL_error();
}
return window;
}
SDL_Window*
initSDLAndMainWindow(SDL_Window* * window)
{
return initSDL() ? initMainWindow() : NULL;
}
void
quit(SDL_Window* main_window)
{
SDL_DestroyWindow(main_window);
SDL_Quit();
}
int
main(int argc, char* argv[])
{
SDL_Window* main_window;
main_window = initMainWindow();
if(main_window == NULL)
{
quit(NULL);
return EXIT_FAILURE;
}
SDL_Renderer* main_window_renderer;
main_window_renderer = SDL_CreateRenderer(main_window, -1, SDL_RENDERER_ACCELERATED);
if(main_window_renderer == NULL)
{
fprintf(stderr, "Renderer could not be created!\n");
print_SDL_error();
quit(main_window);
return EXIT_FAILURE;
}
SDL_SetRenderDrawColor(main_window_renderer, 0, 0, 0, 0);
SDL_RenderClear(main_window_renderer);
SDL_RenderPresent(main_window_renderer);
SDL_Delay(2000);
if(filledCircleRGBA(main_window_renderer,
150, 150, 75,
0, 0, 255, 0) != 0)
{
fprintf(stderr, "A circle was not rendered!\n");
print_SDL_error();
SDL_DestroyRenderer(main_window_renderer);
quit(main_window);
return EXIT_FAILURE;
}
SDL_RenderPresent(main_window_renderer);
SDL_Delay(2000);
SDL_DestroyRenderer(main_window_renderer);
quit(main_window);
return EXIT_SUCCESS;
}
我 运行 在 Debian GNU/Linux 8 "Jessie" 下,我使用我的发行版的 libsdl2-dev 和 libsdl2-gfx-dev。
为了编译,我使用 gcc -O0 -g sdl2-test.c `sdl2-config --cflags --libs` -lSDL2_gfx
.
此外,valgrind 通知我 21 个上下文中有 21 个错误。 3 个错误来自 SDL2 调用,19 个来自 nouveau_dri.so,我认为这是 nouveau driver (a free/libre driver for nVidia GPU) 使用的共享库,所以这可能不是我的错。
谢谢。
您正在调用 filledCircleRGBA
,alpha 值为 0。您的圈子是完全透明的。
对于 Valgrind 报告的错误,我只是注意到您实际上并没有调用 SDL_Init
。这导致了一些泄漏,但不是全部。其他的不是你的代码造成的。
我也看到了一些Conditional jump or move depends on uninitialised value(s)
。 Valgrind 可以报告使用 --track-origins=yes
选项创建未初始化值的位置,这样您就可以查看是否将未初始化值传递给库函数,或者错误是否在函数中。
您可以为 Valgrind 创建一个 suppression file 来隐藏不属于您的泄漏。如果您想创建足够特定的规则以避免隐藏使用 SDL 函数创建内容但不破坏它的情况,最好为库提供调试符号。