C++ SDL2窗口在失焦时不工作

C++ SDL2窗口在失焦时不工作,c++,sdl-2,C++,Sdl 2,我想创建一个不断穿过窗口的矩形。结果表明,只有当我向窗口输入任何输入时(在其周围浮动光标或按键),矩形才会移动。有没有办法让它不停地运行 运行矩形的代码: #include <stdio.h> #include <SDL_image.h> #include <SDL.h> const int SCREEN_WIDTH = 640; const int SCREEN_HEIGHT = 480; SDL_Window *gWindow = nullptr; S

我想创建一个不断穿过窗口的矩形。结果表明,只有当我向窗口输入任何输入时(在其周围浮动光标或按键),矩形才会移动。有没有办法让它不停地运行

运行矩形的代码:

#include <stdio.h>
#include <SDL_image.h>
#include <SDL.h>


const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
SDL_Window *gWindow = nullptr;
SDL_Renderer *gRenderer = nullptr;

bool init()
{
    bool in = true;
    if (SDL_Init(SDL_INIT_VIDEO)<0)
    {
        printf("SDL_ did not init, %s", SDL_GetError());
        in = false;
    }
    else
    {
        if (!SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "1"))
        {
            printf("linear texture filtering boned.\n");
            in = false;
        }
        else
        {
            gWindow = SDL_CreateWindow("CELLULA_CHARLIE", 1000, SDL_WINDOWPOS_CENTERED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN | SDL_WINDOW_ALWAYS_ON_TOP);
            if (gWindow == nullptr)
            {
                printf("gwindow did not load, %s", SDL_GetError());
                in = false;
            }
            else
            {
                gRenderer = SDL_CreateRenderer(gWindow, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
                if (gRenderer == nullptr)
                {
                    printf("main renderer failed loading, %s", SDL_GetError());
                    in = false;
                }
                else
                {
                    SDL_SetRenderDrawColor(gRenderer, 255, 255, 255, 255);
                    int imgFlags = IMG_INIT_PNG;
                    if (!(IMG_Init(imgFlags)&imgFlags))
                    {
                        printf("Img did not init,  %s", IMG_GetError());
                        in = false;
                    }
                }
            }
        }
    }
    return in;
}


void close()
{
    SDL_DestroyRenderer(gRenderer);
    SDL_DestroyWindow(gWindow);
    //gMap = nullptr;
    gWindow = nullptr;
    gRenderer = nullptr;
    IMG_Quit();
    SDL_Quit();
}

int main(int argc, char*args[])
{
    int i = 0;
    SDL_Rect rectangle;
    rectangle.h = rectangle.w = 32;
    rectangle.x = rectangle.y = 0;

    if (!init())
    {
        printf("init failed\n");
    }
    else
    {

        bool quit = false;
        SDL_Event e;
        while (!quit)
        {
            while (SDL_PollEvent(&e) != 0)
            {
                if (e.type == SDL_QUIT)
                {
                    quit = true;
                }

                SDL_SetRenderDrawColor(gRenderer, 255, 255, 255, 255);
                SDL_RenderClear(gRenderer);


                rectangle.x = i * 32;
                rectangle.y = rectangle.x;
                i++;
                if (rectangle.x>500)
                {
                    i = 0;
                }
                SDL_SetRenderDrawColor(gRenderer, 0, 0, 0, 255);
                SDL_RenderFillRect(gRenderer, &rectangle);

                SDL_RenderPresent(gRenderer);
            }

        }
    }

    //the end//
    close();
    return 0;
}
#包括
#包括
#包括
屏幕宽度=640;
屏幕上的常数=480;
SDL_Window*gWindow=nullptr;
SDL_渲染器*gRenderer=nullptr;
boolinit()
{
bool in=真;
中频(SDL_初始化(SDL_初始化视频)500)
{
i=0;
}
SDL_SetRenderDrawColor(Grender,0,0,0,255);
SDL_RenderFillRect(灰色和矩形);
SDL_RenderPresent(gRenderer);
}
}
}
//结局//
close();
返回0;
}

您的循环以事件为中心。如果窗口没有焦点,它将不会接收任何输入事件,而这通常就是您得到的所有事件

你有选择

  • 设置一个计时器,定期注入一个自定义事件,在没有收到其他事件时驱动循环

  • 让循环不依赖于事件,只需连续运行,然后在循环内部检查是否有要处理的事件,如果没有,则执行其他操作


  • 您的循环以事件为中心。如果窗口没有焦点,它将不会接收任何输入事件,而这通常就是您得到的所有事件

    你有选择

  • 设置一个计时器,定期注入一个自定义事件,在没有收到其他事件时驱动循环

  • 让循环不依赖于事件,只需连续运行,然后在循环内部检查是否有要处理的事件,如果没有,则执行其他操作


  • 主循环代码应该在
    while(SDL\u polleevent())
    循环之后,而不是在它内部。主循环代码应该在
    while(SDL\u polleevent())
    循环之后,而不是在它内部。