用SDL2_gfx在C/C++中绘制一个实心圆
Draw a filled circle with SDL2_gfx in C/C++
我是SDL初学者。我想用SDL2画一个黑色的背景和一个蓝色的圆圈。由于无法使用SDL2绘制圆,因此我使用SDL2_gfx。我画一个黑色背景没有问题,但我不会用函数filled CircleRGBA来画一个圆圈。
#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驱动程序(nVidia GPU的免费/libre驱动程序)使用的共享库,所以这些错误可能不是我的错。
谢谢。
您调用的filledCircleRGBA
的alpha值为0。你的圈子是完全透明的。
对于Valgrind报告的错误,我刚刚注意到您实际上并没有调用SDL_Init
。这导致了一些泄漏,但并非全部泄漏。其他问题不是由您的代码引起的。
我还看到了一些Conditional jump or move depends on uninitialised value(s)
。Valgrind可以报告使用--track-origins=yes
选项创建的未初始化值的位置,这样您就可以查看是否将未初始化值传递给库函数,或者错误是否在函数中。
您可以为Valgrind创建一个抑制文件,以隐藏不属于您的泄漏。如果你想创建特定的规则,最好有库的调试符号,以避免隐藏使用SDL函数创建而不破坏它的情况。
- 如何在 Gnuplot 中分别绘制 2 个文件数据?我有一个文件"sin.txt",另一个文件"cos.txt",我想将它们分别绘制在一个图表上
- 绘制一个对象,比较模具缓冲区的两个不同值
- 使用 glDrawElements 绘制一个 std::vector
- 我正在尝试创建一个 C++ 贪吃蛇游戏,但我似乎无法绘制第二个高度边框,我该如何解决这个问题?
- 如何在openGL C++中绘制一个空心圆
- 尝试绘制存储在数组中的矩形,但只出现一个矩形?
- Opencv,在图像中的对象周围绘制一个框
- OpenGL 2D游戏只绘制第二个精灵纹理而不是第一个
- 图层不会绘制另一个图层
- 绘制椭圆延迟并绘制另一个椭圆延迟
- OPENCV C .在for循环中在不同的图像像素上绘制一个圆圈(应在每个循环运行时将图像打开)
- 直接X 11:在屏幕上绘制一个简单的彩色矩形
- 使用 C++ 库 GLEW 在 openGl 中绘制一个红色三角形
- 在另一个线程中绘制 OpenGL
- 如何在 MFC 中围绕当前光标的位置绘制一个矩形
- SFML在另一个对象上方绘制对象
- 创建一个包含要绘制的项的类(seg-fault)
- 为什么我的 OpenGL 对象相对于最后一个绘制的对象绘制
- 如何保持一个绘制矩形在相同的地方,因为相机周围移动
- 是否有可能保存当前的视口,然后在OpenGL和c++中在下一个绘制周期中重新绘制保存的视口?