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

SDL2 窗口不显示

Austin Wolff 2月前

62 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)
  • 当我尝试在 Ubuntu 22.04.3 LTS(Jammy Jellyfish)中编译本机 C# 库时出现此错误,它在 20.4 中并不存在。使用的命令是;dotnet publish -r linux-x64 -c Release -p:PublishAo...

    当我尝试在 Ubuntu 22.04.3 LTS(Jammy Jellyfish)中编译本机 C# 库时出现此错误,因为它在 20.4 中并不存在。

    使用的命令; dotnet publish -r linux-x64 -c Release -p:PublishAot=true

    错误;

    /usr/bin/ld.bfd:找不到 -lz:没有此文件或目录

    collect2:错误:ld 返回 1 退出状态 [test.csproj]/root/.nuget/packages/microsoft.dotnet.ilcompiler/8.0.2/build/Microsoft.NETCore.Native.targets(367,5):error MSB3073:命令 \'\'gcc\' \'test.o\' -o \'test.so\'-Wl,--version-script=obj/Release/net8.0/linux-x64/native/test.exports -Wl,--export-dynamic -gz=zlib -fuse-ld=bfd libf.a /root/.nuget/packages/runtime.linux-x64.microsoft.dotnet.ilcompiler/8.0.2/sdk/libbootstrapperdll.o/root/.nuget/packages/runtime.linux-x64.microsoft.dotnet.ilcompiler/8.0.2/sdk/libRuntime.WorkstationGC.a/root/.nuget/packages/runtime.linux-x64.microsoft.dotnet.il编译器/8.0.2/sdk/libeventpipe-disabled.a/root/.nuget/packages/runtime.linux-x64.microsoft.dotnet.ilcompiler/8.0.2/sdk/libstdc++compat.a/root/.nuget/packages/runtime.linux-x64.microsoft.dotnet.ilcompiler/8.0.2/framework/libSyste m.Native.a/root/.nuget/packages/runtime.linux-x64.microsoft.dotnet.ilcompiler/8.0.2/framework/libSystem.Globalization.Native.a/root/.nuget/packages/runtime.linux-x64.microsoft.dotnet.ilcompiler/8.0.2/framework/libSystem.IO.Compression.Native.a/root/.nuget/packages/runtime.linux-x64.microsoft.dotnet.ilcompiler/8.0.2/framework/libSystem.Net.Security.Native.a/root/.nuget/packages/runtime.linux-x64.microsoft.dotnet.ilcompiler/8.0.2/framework/libSystem.Security.Cryptography.Native.OpenSsl.ag -Wl,-rpath,'$ORIGIN' -Wl,--build-id=sha1 -Wl,--as-needed -Wl,-e0x0 -pthread -ldl -lz -lrt -lm -shared -Wl,-z,relro -Wl,-z,now -Wl,--eh-frame-hdr -Wl,--discard-all -Wl,--gc-sections\' 退出,代码为 1。

    另外,如果我进入 /usr/bin 并尝试, ld.bfd -lz 我会再次收到以下错误;

    ld.bfd: cannot find -lz: No such file or directory

    而如果我在一台能够编译该库而没有错误的机器上运行相同的程序,我会得到以下结果;

    ld.bfd: warning: cannot find entry symbol _start; not setting start address

    这让我认为 Ubuntu 中缺少某些库或组件,从而导致我收到错误消息。有人知道那可能是什么吗?

  • 问题是缺少 zlib1g-dev 库。安装后问题解决。

  • 我认为它不值得完整回答。不过如果你必须使用 WinMain,那就意味着你没有按照 SDL2 的本意使用它。

  • @Someprogrammerdude 也许吧?我对这个库不太熟悉,所以这基本上只是从教程中复制粘贴过来的

  • @genpfault 我实际上并没有在 Ubuntu 上运行它,它是在带有 WSL 的 Windows 系统上,所以我根本没有使用 X-server。

返回
作者最近主题: