用SDL2绘制矩形 [英] Drawing a rectangle with SDL2

查看:0
本文介绍了用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

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的更多信息

这篇关于用SDL2绘制矩形的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆