用SDL2_gfx在C/C++中绘制一个实心圆

Draw a filled circle with SDL2_gfx in C/C++

本文关键字:一个 绘制 gfx SDL2 C++      更新时间:2023-10-16

我是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函数创建而不破坏它的情况。