使用 SDL2 绘制矩形

Posted

技术标签:

【中文标题】使用 SDL2 绘制矩形【英文标题】:Drawing a rectangle with SDL2 【发布时间】:2014-03-20 09:10:06 【问题描述】:

我刚开始使用 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

SDLSDL2 需要先初始化才能使用。初始化 SDL 的方法是下面的函数。

int SDL_Init(Uint32 flags)

其中flags 对于不同的子系统可以是不同的值。使用SDL_INIT_EVERYTHING,初始化一切。

int SDL_Init(SDL_INIT_EVERYTHING)

阅读更多关于它的信息here.。


初始化SDL_WindowSDL_Renderer

需要先设置SDL_RendererSDL_Window,然后才能使用它们。你已经正确地创建了你的窗口,所以我不会介绍它。以下是如何设置SDL_Renderer

SDL_Renderer* SDL_CreateRenderer(SDL_Window* window,
                                 int         index,
                                 Uint32      flags)

index 定义要使用的驱动程序。将其设置为-1 以使用支持其他参数的第一个驱动程序。 flags用于优化渲染、软件渲染、防止vsync等。设置为SDL_RENDERER_ACCELERATED

阅读更多关于SDL_CreateRendererhere的信息。

混合SDLSDL2

SDL_Surface 主要用于SDL,而不是SDL2SDL2_imageSDL2_ttf 等仍然使用SDL_Surface,但它们在使用之前被转换为SDL_Texture

SDL_FillRect(...); 也主要是 SDL 的东西。但如上所述,SDL_Surface 可以使用,但您需要先将其转换为SDL_Texture

SDL_Texture* SDL_CreateTextureFromSurface(SDL_Renderer* renderer,
                                          SDL_Surface*  surface)

阅读更多here。

并使用

int SDL_RenderCopy(SDL_Renderer*   renderer,
                   SDL_Texture*    texture,
                   const SDL_Rect* srcrect,
                   const SDL_Rect* dstrect)

要渲染它,请阅读更多here。

无限循环(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;

结果


您可以在我的blog. 上阅读有关 SDL2 的更多信息

【讨论】:

哇!非常感谢您的帮助和解释!这很有帮助! 一些修复... SDL_Renderer 需要一个参数,而 SDL_RenderDrawRect 需要传入 R SDL_RenderClear(pRenderer) 的地址; .. SDL_RenderDrawRect(pRenderer, &r); @Begui 谢谢!我一定是写得太快了,因为我在第一部分的参数是正确的。 很好的解释!但我遇到了一个问题,也许你可以帮忙。当我尝试通过调用 SDL_CreateRender 设置渲染器时,返回 NULL,当我调用 SDL_GetError() 时,它告诉我“OpenGL 上下文已创建”。这是什么意思?似乎没有任何东西可以渲染,我猜是因为这个。我尝试使我的文件与您的文件完全相同,但它仍然会发生。提前致谢! @JulianCleary 我已经更新了代码,其中有一些错误。如果您仍然无法让它工作,您应该使用您的代码创建一个新问题。我很乐意为您提供进一步的帮助。

以上是关于使用 SDL2 绘制矩形的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SDL2 中旋转矩形?

SDL 基本绘图

SDL2 OpenGL C++ 移动使用 VBO 和 FBO 绘制的精灵

C ++ SDL2:如何将矩形渲染到多个视口中

使用shader绘制矩形矩形框圆形圆形框(WebGL-Shader开发基础02)

使用shader绘制矩形矩形框圆形圆形框(WebGL-Shader开发基础02)