SDL2 window 失焦时不起作用
SDL2 window does not work when out of focus
我想在 window 上不断 运行 创建一个矩形。事实证明,仅当我向 window 提供任何输入(将光标围绕它浮动或按下按键)时,矩形才会移动。有没有办法让它运行不间断?
运行宁矩形的代码:
#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;
}
您的循环以事件为中心。如果 window 没有焦点,它将不会收到任何输入事件,而这通常是您收到的所有事件。
你有选择。
设置一个计时器以定期注入自定义事件,在没有收到其他事件时驱动您的循环。
让循环不依赖于事件,而是持续运行然后在循环内部检查是否碰巧有事件要处理,如果没有,做其他事情。
我想在 window 上不断 运行 创建一个矩形。事实证明,仅当我向 window 提供任何输入(将光标围绕它浮动或按下按键)时,矩形才会移动。有没有办法让它运行不间断?
运行宁矩形的代码:
#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;
}
您的循环以事件为中心。如果 window 没有焦点,它将不会收到任何输入事件,而这通常是您收到的所有事件。
你有选择。
设置一个计时器以定期注入自定义事件,在没有收到其他事件时驱动您的循环。
让循环不依赖于事件,而是持续运行然后在循环内部检查是否碰巧有事件要处理,如果没有,做其他事情。