Рисование прямоугольника с SDL2
Я только начал использовать SDL2 и у меня уже есть проблема. Я хочу создать окно и покрасить его в красный. Но он остается белым, и я не понимаю, почему.
вот код :
int main (int argc, char** argv) {
SDL_Window* pWindow = NULL;
pWindow = SDL_CreateWindow("Jeu de la vie", SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED,
640,
480,
SDL_WINDOW_SHOWN);
SDL_Surface* pSurface = NULL;
pSurface = SDL_GetWindowSurface(pWindow);
SDL_FillRect(pSurface, NULL, SDL_MapRGB(pSurface->format, 255, 0, 0));
while(1);
SDL_FreeSurface(pSurface);
SDL_DestroyWindow(pWindow);
SDL_Quit();
return EXIT_SUCCESS;
}
1 ответов
есть несколько проблем с вашим кодом, я постараюсь решить большинство из них.
инициализировать SDL
SDL
и SDL2
необходимо инициализировать, прежде чем вы сможете его использовать. Способ инициализации SDL-это следующая функция.
int SDL_Init(Uint32 flags)
здесь flags
может быть различным значением для разных подсистем. Использовать SDL_INIT_EVERYTHING
, чтобы инициализировать все.
int SDL_Init(SDL_INIT_EVERYTHING)
подробнее о здесь..
инициализации SDL_Window
и SDL_Renderer
SDL_Renderer
и SDL_Window
необходимо настроить, прежде чем вы сможете их использовать. Вы уже создали свое окно должным образом, поэтому я не буду покрывать это. Вот как настроить SDL_Renderer
SDL_Renderer* SDL_CreateRenderer(SDL_Window* window,
int index,
Uint32 flags)
index
определяет, какой драйвер использовать. Установить -1
для использования первого драйвера, поддерживающего другие аргументы. flags
используются для визуализации оптимизирован, rendiring программного обеспечения, предотвращения вертикальной синхронизацией и т. д.. Установить SDL_RENDERER_ACCELERATED
.
подробнее о SDL_CreateRenderer
здесь.
для смешивания SDL
и SDL2
SDL_Surface
в первую очередь что-б в SDL
, а не SDL2
. SDL2_image
, SDL2_ttf
etc все еще используется SDL_Surface
, но они превращаются в элемент SDL_Texture
прежде чем их можно использовать.
SDL_FillRect(...);
также в основном SDL
вещь. Но, как указано выше,SDL_Surface
можно использовать, но вам нужно преобразовать его в SDL_Texture
первый :
SDL_Texture* SDL_CreateTextureFromSurface(SDL_Renderer* renderer,
SDL_Surface* surface)
подробнее здесь.
и использовать
int SDL_RenderCopy(SDL_Renderer* renderer,
SDL_Texture* texture,
const SDL_Rect* srcrect,
const SDL_Rect* dstrect)
чтобы отобразить его, Прочитайте больше здесь.
бесконечный цикл ( while(1);
)
вы действительно не должны этого делать, это будет просто петля навсегда. Использовать SDL_Delay( 5000 );
приостановить на 5000msec или 5 секунд.
проще
можно использовать
int SDL_RenderDrawRect(SDL_Renderer* renderer,
const SDL_Rect* rect)
нарисовать прямоугольник.
вы должны использовать
int SDL_SetRenderDrawColor(SDL_Renderer* renderer,
Uint8 r,
Uint8 g,
Uint8 b,
Uint8 a)
чтобы установить цвет того, что вы рисуете, используйте
int SDL_RenderClear(SDL_Renderer* renderer)
после чего вы называете SDL_RenderDrawRect()
void SDL_RenderPresent(SDL_Renderer* renderer)
пример
#include <SDL2/SDL.h>
int main (int argc, char** argv)
{
SDL_Window* window = NULL;
window = SDL_CreateWindow
(
"Jeu de la vie", SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED,
640,
480,
SDL_WINDOW_SHOWN
);
// Setup renderer
SDL_Renderer* renderer = NULL;
renderer = SDL_CreateRenderer( window, -1, SDL_RENDERER_ACCELERATED);
// Set render color to red ( background will be rendered in this color )
SDL_SetRenderDrawColor( renderer, 255, 0, 0, 255 );
// Clear winow
SDL_RenderClear( renderer );
// Creat a rect at pos ( 50, 50 ) that's 50 pixels wide and 50 pixels high.
SDL_Rect r;
r.x = 50;
r.y = 50;
r.w = 50;
r.h = 50;
// Set render color to blue ( rect will be rendered in this color )
SDL_SetRenderDrawColor( renderer, 0, 0, 255, 255 );
// Render rect
SDL_RenderFillRect( renderer, &r );
// Render the rect to the screen
SDL_RenderPresent(renderer);
// Wait for 5 sec
SDL_Delay( 5000 );
SDL_DestroyWindow(window);
SDL_Quit();
return EXIT_SUCCESS;
}
результат
вы можете прочитать больше о SDL2 на моем блог.