[英]Drawing a rectangle with 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;
}
您的代码有几个问题,我将尝试解决其中的大多数问题。
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
用于优化渲染,软件渲染,防止vsync等。将其设置为SDL_RENDERER_ACCELERATED
。
在此处阅读有关SDL_CreateRenderer
更多信息。
SDL
和SDL2
SDL_Surface
主要是SDL
使用的东西,而不是SDL2
。 SDL2_image
, SDL2_ttf
等仍然使用SDL_Surface
,但是在使用它们之前将它们转换为SDL_Texture
。
SDL_FillRect(...);
也是大多数SDL
东西。 但是如上所述,可以使用SDL_Surface
,但是您需要SDL_Texture
其转换为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 );
暂停5000毫秒或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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.