Я начинающий SDL.
Я хотел бы нарисовать черный фон и закрашенный синий круг на нем с помощью SDL2. Поскольку нет возможности нарисовать круг с SDL2, я использую SDL2_gfx. У меня нет проблем, чтобы нарисовать черный фон, но я не прихожу, чтобы нарисовать круг с функция fillCircleRGBA.
#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 600void
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 (бесплатный / libre драйвер для графического процессора nVidia) так что это не моя вина.
Благодарю.
Ты звонишь filledCircleRGBA
со значением альфа 0. Ваш круг полностью прозрачен.
Из-за ошибок, о которых сообщает Valgrind, я просто заметил, что вы на самом деле не звоните SDL_Init
, Это вызывает некоторые утечки, но не все из них. Другие не вызваны вашим кодом.
Я также вижу некоторые Conditional jump or move depends on uninitialised value(s)
, Valgrind может сообщать, где неинициализированное значение было создано с помощью --track-origins=yes
Таким образом, вы можете увидеть, передали ли вы неинициализированное значение в библиотечную функцию или ошибка в функции.
Вы можете создать файл подавления чтобы Вэлгринд скрыл утечки, которые не твои. Лучше всего иметь отладочные символы для библиотек, если вы хотите создать определенные правила, чтобы избежать сокрытия случаев, когда вы создаете что-то с помощью функции SDL и не уничтожаете это.
Других решений пока нет …