SDL 代码编译但窗口不显示

Posted

技术标签:

【中文标题】SDL 代码编译但窗口不显示【英文标题】:SDL code compiles but the window doesn't show up 【发布时间】:2015-01-06 18:30:50 【问题描述】:

窗口可以正常打开,但是在更改了一些变量名称后,它并没有显示出来。我无法撤消更改,因为我已尝试重新启动 PC。

我正在使用 Microsoft Visual Studio 2013 Professional、msvc2012 plus SDL2 和 SDL_Image。 不知道这是否重要,但笔记本电脑的配置是:i7、8gb ram、windows 8.1 pro、gtx 850M 4gb vram。

代码如下:

游戏.h

#ifndef GAME_H
#define GAME_H

#include "SDL.h"

class Game

public:
    Game();
    ~Game();
    bool init(const char* title, int xpos, int ypos, int width, int height, int flags);
    void render();
    void update();
    void handleEvents();
    void clean();
    bool running()  return gameRunning; 
private:
    SDL_Window * window;
    SDL_Renderer * renderer;
    SDL_Rect * player;

    bool gameRunning;
;


#endif

游戏.cpp

#include "Game.h"

Game::Game()

    player->x = 0;
    player->y = 0;
    player->w = 32;
    player->h = 32;


Game::~Game()




bool Game::init(const char* title, int xpos, int ypos, int width, int height, int flags)

    if (SDL_Init(SDL_INIT_EVERYTHING) == 0)
    
        window = SDL_CreateWindow(title, xpos, ypos, width, height, flags);
        if (window != 0)
        
            renderer = SDL_CreateRenderer(window, -1, 0);
            if (renderer != 0)
            
                SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
            
            else  return false; 
         else  return false; 
     else  return false; 

    gameRunning = true;

    return true;


void Game::render()

    SDL_RenderClear(renderer); 

    //SDL_RenderFillRect(renderer, &*player);

    SDL_RenderPresent(renderer);


void Game::handleEvents()

    SDL_Event event;
    if (SDL_PollEvent(&event))
    
        switch (event.type)
        
        case SDL_QUIT:
            gameRunning = false;
            break;
        default:
            break;
        
    


void Game::clean()

    SDL_DestroyWindow(window);
    SDL_DestroyRenderer(renderer);
    SDL_Quit();


void Game::update()



main.cpp

#include "Game.h"

Game* game;
int main(int argc, char* argv[])

    game = new Game();
    game->init("Lumia", 100, 100, 640, 480, 0);
    while (game->running())
    
        game->handleEvents();
        game->update();
        game->render();
    
    game->clean();
    return 0;

【问题讨论】:

检查 Game::init 是否返回 false,然后确保您的应用程序的入口点是 WinMain。如果您将项目创建为控制台应用程序,则不会。 我创建为一个空项目,子系统设置为Windows。 构建调试版本,启动调试器,在main函数的第一条语句上设置断点,运行程序。如果调试器没有在断点处停止,那么您就知道您的 main 函数没有被调用。如果它停止了,则逐行执行代码,看看会发生什么。 @JoachimPileborg 程序启动,但没有任何反应,为了停止程序我不得不通过调试强制退出它>>停止调试 那意味着你的main 函数没有被调用。 IIRC SDL2 库有其 自己的 main 函数,它显然会覆盖你的。 【参考方案1】:

在你的类Game 中,player 是一个指针。

当你这样做时

Game::Game()

    player->x = 0;
    player->y = 0;
    player->w = 32;
    player->h = 32;

指针 player 从未被初始化,它没有指向一个有效的对象,所以你不能取消引用它或者这是未定义的行为(可能是你的调试器停止的原因)。

您需要先构造player,然后再尝试分配它,就像您在尝试使用之前在main 中构造了一个新的Game

【讨论】:

以上是关于SDL 代码编译但窗口不显示的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Emscripten + SDL 中禁用窗口事件捕获?

使用 openGL 在 SDL2 中全屏显示窗口

OpenGL VBO 不显示

CMake 找不到 SDL2

为啥 SDL 程序不显示 BMP 图片?

SDL OpenGL 窗口无响应,透明