我正在尝试按照教程创建一个空白窗口,可以使用 Esc 按钮关闭该窗口,但该窗口从未显示。这是在运行 Ubuntu 20.05.6 的 WSL 上。代码编译并运行...
我正在尝试按照教程创建一个空白窗口,可以使用 Esc 按钮关闭该窗口,但该窗口从未显示。这是在运行 Ubuntu 20.05.6 的 WSL 上
代码编译并运行没有错误,但一旦运行它实际上什么也没做。任务栏上没有图标或类似的东西。
#include <SDL2/SDL.h>
#ifndef GAME_H
#define GAME_H
class Game
{
public:
Game();
bool Initialize();
void RunLoop();
void Shutdown();
private:
void ProcessInput();
void UpdateGame();
void GenerateOutput();
SDL_Window* mWindow;
bool mIsRunning;
};
#endif
Game.h - 这是包含函数声明的头文件
#include "Game.h"
#include <iostream>
Game::Game() {
this->mWindow = nullptr;
this->mIsRunning = true;
}
bool Game::Initialize() {
int sdlResult = SDL_Init(SDL_INIT_VIDEO);
if(sdlResult != 0) {
SDL_Log("Unable to initialize SDL: %s", SDL_GetError());
return false;
}
mWindow = SDL_CreateWindow(
"Test",
100,
100,
1024,
768,
SDL_WINDOW_SHOWN
);
if(!mWindow) {
SDL_Log("Failed to create window: %s", SDL_GetError());
}
return true;
}
void Game::Shutdown() {
SDL_DestroyWindow(mWindow);
SDL_Quit();
}
void Game::RunLoop() {
while(mIsRunning) {
ProcessInput();
UpdateGame();
GenerateOutput();
}
}
void Game::ProcessInput() {
SDL_Event event;
while (SDL_PollEvent(&event)) {
switch(event.type) {
case SDL_QUIT:
mIsRunning = false;
break;
}
}
const Uint8* state = SDL_GetKeyboardState(NULL);
if (state[SDL_SCANCODE_ESCAPE]) {
mIsRunning = false;
}
}
void Game::UpdateGame() {}
void Game::GenerateOutput() {}
int main (int argc, char** argv) {
Game game;
bool success = game.Initialize();
if(success) {
std::cout << SDL_GetError() << std::endl;
game.RunLoop();
}
game.Shutdown();
return 0;
}
Game.cpp - 这是 Game 类的实现。UpdateGame() 和 GenerateOutput() 都是空的,因为我在本教程中还没有讲到这一步。
代码没有输出 Initialize() 方法中的任何错误消息,因此我假设窗口已创建但未显示。最初,我还没有实现 ProcessInput() 方法,但此站点上的其他问题已通过添加事件循环得到解决,因此我也这样做了,但这并没有改变任何东西。有一个错误指出“未知像素格式”,但在运行调试器后,我将其追溯到一个 SDL 函数,该函数创建一个虚拟鼠标光标并调用一个带有参数的函数,这些参数将始终导致它失败,因此我认为它不相关。
编辑:当我在 Windows 而不是 WSL 中编译并运行它时,窗口就会出现。我确实必须在 Game.h 中定义 SDL_MAIN_HANDLED,我相信这与覆盖 WinMain() 有关