SDL在linux上运行几秒钟后没有响应

时间:2014-10-23 12:32:02

标签: 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;
}

Game.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__) */

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;
        }
    }
}

编辑:

所以我制作了代码的minamal版本,现在我收到了一个新的错误。错误显示“Segmentation Fault(core dumped)”。基于在调试中将其运行到特定行,错误似乎出现在“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;
}

1 个答案:

答案 0 :(得分:0)

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

尝试以下方法:

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

  2. gdb ./program,然后输入&#39;

  3. 崩溃时,输入&#39; bt&#39; (用于回溯)

  4. 复制输出

  5. 我的猜测是:&#34; bmp&#34;不支持文件格式或不支持呈现驱动程序。尝试使用:

      

    SDL_CreateRenderer(win,-1,0);