如何使用 SDL2 在C++中将框渲染到屏幕上

How do I render a box to the screen in C++ using SDL2?

本文关键字:屏幕 SDL2 何使用 C++      更新时间:2023-10-16

我正在尝试找出 C++ 中的 SDL2 库,但似乎无法正确配置代码以简单地在屏幕上绘制一个矩形。我应该采取哪些不同的做法?

#include <SDL.h>
bool success = true;  //success flag for functions, etc
int ScreenWidth = 640;  //screen width and height for SDL window
int ScreenHeight = 480; //
int main(int argc, char* argv[])
{
    SDL_Init(SDL_INIT_EVERYTHING);
    SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "1");
    SDL_Window* window = SDL_CreateWindow( "Game", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, ScreenWidth, ScreenHeight, SDL_WINDOW_SHOWN);
    SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
    SDL_SetRenderDrawColor( renderer, 0xFF, 0xFF, 0xFF, 0xFF);  
    bool quit = false;
    SDL_Event event;
    while (!quit)
    {
        SDL_RenderClear(renderer);
        while (SDL_PollEvent(&event))
        {
            if (event.type == SDL_QUIT)
                quit = true;
        }
        SDL_Rect box;
        box.w = 30;
        box.h = 30;
        box.x = 50;
        box.y = 50;
        SDL_SetRenderDrawColor(renderer, 0xFF,0x00,0x00,0xFF);
        SDL_RenderFillRect(renderer, &box);
        SDL_RenderPresent(renderer);    
    }
    return 0; //because main is an int task
}

编辑:这是完整的文件。

我希望它在屏幕上画一个红色矩形,但窗口完全是红色的(大小、名称等正确,可以正确退出)。

您必须在所有渲染调用之后调用SDL_RenderPresent。在这种情况下,SDL_RenderFillRect(...)

SDL_RenderClear在呈现循环的开头用于清除缓冲区。

来自 SDL2 维基

的示例

SDL_SetRenderDrawColor()同时影响SDL_RenderFillRect()SDL_RenderClear()

绘制红色方块后,您需要在下一次SDL_RenderClear()调用之前将颜色重新设置为白色:

#include <SDL2/SDL.h>
int main( int argc, char** argv )
{
    SDL_Init( SDL_INIT_EVERYTHING );
    SDL_SetHint( SDL_HINT_RENDER_SCALE_QUALITY, "1" );
    SDL_Window* window = SDL_CreateWindow( "Window", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_SHOWN );
    SDL_Renderer* renderer = SDL_CreateRenderer( window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC );
    bool running = true;
    while( running )
    {
        SDL_Event ev;
        while( SDL_PollEvent( &ev ) )
        {
            if( SDL_QUIT == ev.type )
            {
                running = false;
                break;
            }
        }
        SDL_SetRenderDrawColor( renderer, 0xFF, 0xFF, 0xFF, 0xFF );
        SDL_RenderClear( renderer );
        SDL_Rect box;
        box.w = 30;
        box.h = 30;
        box.x = 50;
        box.y = 50;
        SDL_SetRenderDrawColor( renderer, 0xFF, 0x00, 0x00, 0xFF );
        SDL_RenderFillRect( renderer, &box );
        SDL_RenderPresent( renderer );
    }
    return 0;
}

我想通了!

我需要将SDL_SetRenderDrawColor(渲染器,0xFF,0xFF,0xFF,0xFF)放在循环内部,这样它就会将渲染器重置为白色。我只是在开始时将其设置为白色一次,因此SDL_RenderClear用当前的绘制颜色(红色)填充窗口。感谢Tinfoil煎饼和genpfault帮助我!