c++ - SDL 在 Linux 上运行几秒钟后没有响应

标签 c++ linux sdl sdl-2

我正在阅读 SDL 游戏开发书籍,但我什至无法让第一个文件正常工作。应用程序启动后,它会渲染窗口,几秒钟后,Linux 说游戏没有响应并要求我强制退出。如果我单击“等待”,则每隔几秒就会重复一次。我注意到的一件事是 SDL_PollEvent 永远不会返回 true。我不确定为什么事情不起作用。这是我的代码。

main.cpp

#ifdef __cplusplus
#include <cstdlib>
#else
#include <stdlib.h>
#endif

#include "Game.h"

// our Game object
Game* g_game = 0;
int main(int argc, char* argv[]) {
    g_game = new Game();
    g_game->init("Chapter 1", 100, 100, 640, 480, 0);
    while(g_game->running()) {
        g_game->handleEvents();
        //g_game->update();
        g_game->render();
    }
    g_game->clean();
    return 0;
}

游戏.h

#ifndef __Game__
#define __Game__
#if !WINDOWS
#include <SDL2/SDL.h>
#else
#include <SDL.h>
#endif

class Game {
public:
    Game() {}
    ~Game() {}
// simply set the running variable to true
    bool init(const char* title, int xpos, int ypos, int width, int
        height, bool fullscreen);
    void render();
    void update();
    void handleEvents();
    void clean();
// a function to access the private running variable
    bool running() {
        return m_bRunning;
    }
private:

    SDL_Window* m_pWindow;
    SDL_Renderer* m_pRenderer;

    bool m_bRunning;
};

#endif /* defined(__Game__) */

游戏.cpp

#include "Game.h"
#include <iostream>

bool Game::init(const char* title, int xpos, int ypos, int width,
                int height, bool fullscreen) {
// attempt to initialize SDL
    if(SDL_Init(SDL_INIT_EVERYTHING) == 0) {
        std::cout << "SDL init success\n";
// init the window
        int flags = 0;
        if(fullscreen) {
            flags = SDL_WINDOW_FULLSCREEN;
        }
        m_pWindow = SDL_CreateWindow(title, xpos, ypos,
                                     width, height, flags);
        if(m_pWindow != 0) { // window init success
            std::cout << "window creation success\n";
            m_pRenderer = SDL_CreateRenderer(m_pWindow, -1, 0);
            if(m_pRenderer != 0) { // renderer init success
                std::cout << "renderer creation success\n";
                SDL_SetRenderDrawColor(m_pRenderer,
                                       255,0,255,255);
            } else {
                std::cout << "renderer init fail\n";
                return false; // renderer init fail
            }
        } else {
            std::cout << "window init fail\n";
            return false; // window init fail
        }
    } else {
        std::cout << "SDL init fail\n";
        return false; // SDL init fail
    }
    std::cout << "init success\n";
    m_bRunning = true; // everything inited successfully, start the main loop
    return true;
}

void Game::render() {
    SDL_RenderClear(m_pRenderer); // clear the renderer to the draw color
    SDL_RenderPresent(m_pRenderer); // draw to the screen
}

void Game::clean() {
    std::cout << "cleaning game\n";
    SDL_DestroyWindow(m_pWindow);
    SDL_DestroyRenderer(m_pRenderer);
    SDL_Quit();
}

void Game::handleEvents() {
    SDL_Event event;
    while(SDL_PollEvent(&event)) {
        std::cout << "Checking Events";
        switch(event.type) {
        case SDL_QUIT:
            std::cout << "Quiting";
            m_bRunning = false;
            break;
        default:
            break;
        }
    }
}

编辑:

所以我制作了代码的最小版本,现在我收到一个新错误。该错误显示“段错误(核心已转储)”。基于在调试中将其运行到特定行,错误似乎出现在“SDL_Texture *tex = SDL_CreateTextureFromSurface(ren, bmp);”行上我不确定错误是什么

这是最小代码:

#ifdef __cplusplus
#include <cstdlib>
#else
#include <stdlib.h>
#endif
#include <iostream>
#include <SDL2/SDL.h>

int main(int argc, char** argv) {
    if(SDL_Init(SDL_INIT_EVERYTHING) != 0) {
        std::cout << "SDL_Init Error: " << SDL_GetError() << std::endl;
        return 1;
    }
    SDL_Window *win = SDL_CreateWindow("Hello World!", 100, 100, 640, 480, SDL_WINDOW_SHOWN);
    if(win == NULL) {
        std::cout << "SDL_CreateWindow Error: " << SDL_GetError() << std::endl;
        SDL_Quit();
        return 1;
    }
    SDL_Renderer *ren = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
    if(ren == NULL) {
        SDL_DestroyWindow(win);
        std::cout << "SDL_CreateRenderer Error: " << SDL_GetError() << std::endl;
        SDL_Quit();
        return 1;
    }
    std::string imagePath = "cb.bmp";
    SDL_Surface *bmp = SDL_LoadBMP(imagePath.c_str());
    if(bmp == NULL) {
        SDL_DestroyRenderer(ren);
        SDL_DestroyWindow(win);
        std::cout << "SDL_LoadBMP Error: " << SDL_GetError() << std::endl;
        SDL_Quit();
        return 1;
    }
    SDL_Texture *tex = SDL_CreateTextureFromSurface(ren, bmp);
    if(tex == NULL) {
        SDL_DestroyRenderer(ren);
        SDL_DestroyWindow(win);
        std::cout << "SDL_CreateTextureFromSurface Error: " << SDL_GetError() << std::endl;
        SDL_Quit();
        return 1;
    }
    SDL_FreeSurface(bmp);
    SDL_Event e;
    bool quit = false;
    while(!quit) {
        while(SDL_PollEvent(&e)) {
            //If user closes the window
            if(e.type == SDL_QUIT) {
                quit = true;
            }
            //If user presses any key
            if(e.type == SDL_KEYDOWN) {
                quit = true;
            }
            //If user clicks the mouse
            if(e.type == SDL_MOUSEBUTTONDOWN) {
                quit = true;
            }
        }
        SDL_RenderClear(ren);
        SDL_RenderPresent(ren);
    }
    SDL_DestroyTexture(tex);
    SDL_DestroyRenderer(ren);
    SDL_DestroyWindow(win);
    SDL_Quit();
    return 0;
}

最佳答案

我已经在 Linux 下使用 SDL 2.0.4 成功编译并运行了您的最小代码。我使用了一个简单的图像作为“cb.bmp”。

尝试以下操作:

  1. 像这样编译:g++ -Wall -ggdb $(sdl2-config --cflags) -o program main.cpp -lSDL2

  2. gdb ./program,然后输入“run”

  3. 崩溃时,输入“bt”(用于回溯)

  4. 将输出复制到此处

我的猜测是:要么不支持“bmp”文件格式,要么不支持渲染驱动程序。尝试使用:

SDL_CreateRenderer(win, -1, 0);

关于c++ - SDL 在 Linux 上运行几秒钟后没有响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26528158/

相关文章:

c++ - 基类应该具有属性吗?

c++ - 文件关闭后如何避免数组中的对象超出范围?

python - 无法使用 Ctrl-C 终止 Python 脚本

c++ - 将数据从 C++ 加载到 QML Scatter3d 项

c++ - 使用C++ OpenMP和文件io进行并行化。性能问题

c++ - 如何从终端运行用 eclipse 编写的 c++ 程序

c - Makefile 找不到 linux/library

在 macOS 上打包为 .app 时,自定义二进制文件以低 DPI 运行

c++ - SDL 忽略我的主文件

qt - MacOS Qt 上包含 SDL 框架