Window 在 SDL2 中随时间改变颜色

Window Changes Color Over Time In SDL2

我在 SDL2 中创建了一个以红色打开的 window。我需要 window 在几秒钟后改变颜色,并在 window 打开时继续这样做。所以 window 可能会打开红色,停留五秒钟然后变成绿色五秒钟然后变成蓝色五秒钟然后循环回到红色并再次开始整个过程​​。

int WindowOpen() {

bool quit = false;

SDL_Window *window;                    // Declare a pointer

SDL_Init(SDL_INIT_VIDEO);              // Initialize SDL2

                                       // Create an application window with the following settings:
window = SDL_CreateWindow(
    "My SDL2 window",                  // window title
    SDL_WINDOWPOS_UNDEFINED,           // initial x position
    SDL_WINDOWPOS_UNDEFINED,           // initial y position
    640,                               // width, in pixels
    480,                               // height, in pixels
    SDL_WINDOW_OPENGL                  // flags - see below
    );

SDL_Renderer *renderer = NULL;
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); 
SDL_Event* MainEvent = new SDL_Event();
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);

// Check that the window was successfully created
if (window == NULL) {
    // In the case that the window could not be made...
    printf("Could not create window: %s\n", SDL_GetError());
    return 1;
}

SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);//red. Was testing to see if window would open red and change to green then blue but this doesn't work.
//SDL_Delay(3000);
//SDL_SetRenderDrawColor(renderer, 300, 150, 0, 155);//green
//SDL_Delay(3000);
//SDL_SetRenderDrawColor(renderer, 129, 150, 500, 105);//blue

while (quit == false && MainEvent->type != SDL_QUIT) { //While quit is false, run window and renderer.
    SDL_PollEvent(MainEvent);
    SDL_RenderClear(renderer);
    SDL_RenderPresent(renderer);
}


// The window is open: could enter program loop here (see SDL_PollEvent())

//SDL_Delay(3000);  // Pause execution for 3000 milliseconds, for example

// Close and destroy the window
SDL_DestroyWindow(window);
SDL_DestroyRenderer(renderer);
delete MainEvent;

// Clean up
SDL_Quit();

}

SDL_SetRenderDrawColor 只是设置渲染器绘制的颜色,如果您要求的话。要用该颜色填充后台缓冲区,您应该跟进 SDL_RenderClear。填满后台缓冲区后,要在屏幕上绘制它,您需要调用 SDL_RenderPresent.

while (quit == false && MainEvent->type != SDL_QUIT) { //While quit is false, run window and renderer.
    SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);//red. Was testing to see if window would open red and change to green then blue but this doesn't work.
    SDL_RenderClear(renderer);
    SDL_RenderPresent(renderer);
    SDL_Delay(3000);
    SDL_SetRenderDrawColor(renderer, 300, 150, 0, 155);//green
    SDL_RenderClear(renderer);
    SDL_RenderPresent(renderer);
    SDL_Delay(3000);
    SDL_SetRenderDrawColor(renderer, 129, 150, 500, 105);//blue
    SDL_RenderClear(renderer);
    SDL_RenderPresent(renderer);
    SDL_Delay(3000);

    SDL_PollEvent(MainEvent);
}

将您的主循环更改为类似的内容将执行与您想要的类似的操作,但延迟为三秒。此外,通过这种方式,您的主循环将花费 9 秒来执行,这意味着退出事件处理最多可能需要 9 秒。这不是很好,但修复它留作 reader.

的练习