在尝试打印图片C ++时,SDL只会绘制黑屏

时间:2016-04-12 20:44:08

标签: c++ sdl

class Game {

public:
    Game(int width, int height) {
        gwidth = width;
        gheight = height;
    }
    ~Game() {



    }
    bool initGame() {
        bool sucsess = true;
        if (SDL_Init(SDL_INIT_VIDEO) < 0) {
            sucsess = false;
            }

            //gTetrisSurface = SDL_LoadBMP("TetrisBg.bmp");

        gWindow = SDL_CreateWindow("Petris V1", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, gwidth, gheight, SDL_WINDOW_SHOWN);
        gScreenSurface = SDL_GetWindowSurface(gWindow);
        gMainBG = SDL_LoadBMP("test.bmp");

        /**if (gMainBG == NULL) {
            return false;
        }**/
        bool running = true;
        //SDL_SetWindowFullscreen(gWindow, SDL_WINDOW_FULLSCREEN_DESKTOP);
        while (running == true) {
            SDL_BlitSurface(gMainBG, NULL, gScreenSurface, NULL);
            SDL_UpdateWindowSurface( gWindow );

        }
        return sucsess;

    }

protected:
    int gwidth, gheight;
    SDL_Window* gWindow = NULL;
    SDL_Surface* gScreenSurface = NULL;
    SDL_Surface* gTetrisSurface = NULL;
    SDL_Surface* gPongSurface = NULL;
    SDL_Surface* gMainBG = NULL;

};

这背后的想法是,这应该是一个巨大的表面,包含2个其他游戏的其他表面。问题是,它似乎不会绘制我试图在其上绘制的BMP。因此,我的发展有点困难。有人看到这个问题可能会闷闷不乐吗?谢谢!

编辑:我这样做是为了刷新事件,但是,我做了一些调试,问题似乎是img文件返回NULL,为什么?它应该加载一个bmp ...(根本没有错误消息..)

2 个答案:

答案 0 :(得分:2)

从SDL2的文档中: https://wiki.libsdl.org/SDL_GetWindowSurface

  

如果调整窗口大小,此曲面将无效。调整窗口大小后,必须再次调用此函数以返回有效曲面。   您可能无法在此窗口中将其与3D或渲染API结合使用。

我的建议是避免直接使用窗口表面。 相反,您应该使用渲染器并将自己的主曲面复制到背景纹理。

SDL2迁移指南清楚地解释了在屏幕上复制曲面和纹理的正确方法,尤其是段落“If your game wants to do both”。

答案 1 :(得分:0)

整个问题是BMP文件位于错误的文件夹中。

如果有人遇到同样的问题,图片应该与src(调试时)或解决方案(如果构建)位于同一目录中。

希望这对未来的某个人有所帮助,无论是哪种方式,都要感谢那些试图想出其他可能性的人。

(使用visual studio)