8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

SDL2 窗口不显示

Austin Wolff 2月前

61 0

我正在尝试按照教程创建一个空白窗口,可以使用 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() 有关

帖子版权声明 1、本帖标题:SDL2 窗口不显示
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Austin Wolff在本站《ubuntu》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 问题是缺少 zlib1g-dev 库。安装后问题解决。

返回
作者最近主题: