改变SDL2窗口的背景?

7

我可以创建一个SDL2窗口,但我不知道如何更改此窗口的背景颜色。

我的代码:

#include "SDL.h"

SDL_Window *window;

void main()
{
    window = SDL_CreateWindow("TEST", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 480, SDL_WINDOW_SHOWN);

    SDL_Delay(3000);
}

我该如何将此窗口的背景色更改为黑色?


1
我在谷歌上搜索了“sdl背景”。谷歌给出的答案是(http://www.gamedev.net/topic/331639-setting-background-color-for-sdl/)。通常情况下,当谷歌无法解决问题时,请查看相关文档。 - Cheers and hth. - Alf
5个回答

24

你应该使用SDL_SetRenderDrawColor来设置绘制颜色,然后使用SDL_RenderClear

(代码来自SDL wiki

int main(int argc, char* argv[])
{
        SDL_Window* window;
        SDL_Renderer* renderer;

        // Initialize SDL.
        if (SDL_Init(SDL_INIT_VIDEO) < 0)
                return 1;

        // Create the window where we will draw.
        window = SDL_CreateWindow("SDL_RenderClear",
                        SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
                        512, 512,
                        0);

        // We must call SDL_CreateRenderer in order for draw calls to affect this window.
        renderer = SDL_CreateRenderer(window, -1, 0);

        // Select the color for drawing. It is set to red here.
        SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);

        // Clear the entire screen to our selected color.
        SDL_RenderClear(renderer);

        // Up until now everything was drawn behind the scenes.
        // This will show the new, red contents of the window.
        SDL_RenderPresent(renderer);

        // Give us time to see the window.
        SDL_Delay(5000);

        // Always be sure to clean up
        SDL_Quit();
        return 0;
}

2
如果您不使用SDL2渲染器,可以这样做:
只需调用:
SDL_GL_SwapWindow(window);

之后:

SDL_GL_MakeCurrent(window, context);

完成了!现在您有一个黑屏。


1
#include <SDL2/SDL.h>
#include <iostream>
using namespace std;

int main(){
    int width=512, height=512;
    SDL_Window *window=SDL_CreateWindow("Window", SDL_WINDOWPOS_CENTERED, 
    SDL_WINDOWPOS_CENTERED, width, height, SDL_WINDOW_RESIZABLE);

    if(window==NULL)
        cout << "There was an error while initializing the window" << endl << SDL_GetError << endl;

    SDL_Event event;
    bool running=true;

    while(running){
        while(SDL_PollEvent(&event)){
            if(event.type==SDL_QUIT){
                running=false;
                break;
            }
        }
        SDL_GetWindowSize(window, &width, &height);

        SDL_Surface *surface=SDL_GetWindowSurface(window);
        Uint32 skyblue=SDL_MapRGB(surface->format, 65,193,193);
        SDL_FillRect(surface, NULL, skyblue);
        SDL_UpdateWindowSurface(window);
    }

    SDL_DestroyWindow(window);
    SDL_Quit();
}

0
请注意,这些解决方案都无法正确地与OpenGL配合使用。问题是如何使用预定义的颜色初始化窗口,而不是如何绘制第一帧。在第一帧绘制之前仍会出现白色闪烁。

-1

试试这个:

SDL_Window *wind;
SDL_Surface *windSurface = NULL
void main()
{
    wind = SDL_CreateWindow("TEST", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 480, SDL_WINDOW_SHOWN);
    windSurface = SDL_GetWindowSurface(wind);  
    SDL_FillRect(windSurface, NULL, SDL_MapRGB(windSurface->format, 240, 200, 112));
        SDL_UpdateWindowSurface(wind);
    SDL_Delay(3000);
}
 

我的反对意见是:您正在使用未初始化的“wind”作为参数调用“SDL_GetWindowSurface”。之后,您使用“SDL_CreateWindow”对其进行初始化。如果有什么问题,那么这些操作的顺序是相反的。 - Theraot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接