SDL_UpperBlit:传递NULL表面错误

时间:2017-01-23 12:23:55

标签: c++ sdl

在以下代码中:

#include <iostream>
#include "SDL.h"
using namespace std;


int main(int argc, char** argv)
{
    SDL_Surface*  screenSurface = nullptr;
    SDL_Surface* image = nullptr;
    SDL_Window* window = nullptr;

    const Uint8* keystate;

    SDL_Rect offset;
    offset.x = 100;
    offset.y = 200;

    if (SDL_Init(SDL_INIT_VIDEO) < 0)
    {
        cout << "Window initialization error: " << SDL_GetError();
    }
    else
    {
        window = SDL_CreateWindow("game", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 800, 600, SDL_WINDOW_SHOWN);

        bool isRunning = true;
        SDL_Event ev;

        //game loop
        while (isRunning)
        {
            while (SDL_PollEvent(&ev) != 0)
            {
                if (ev.type == SDL_QUIT)
                    isRunning = false;
            }

            keystate = SDL_GetKeyboardState(NULL);
            if (keystate[SDL_SCANCODE_W])
            {
                offset.y -= 1;
            }
            else if (keystate[SDL_SCANCODE_A])
            {
                offset.x -= 1;
            }
            else if (keystate[SDL_SCANCODE_S])
            {
                offset.y += 1;
            }
            else if (keystate[SDL_SCANCODE_D])
            {
                offset.x += 1;
            }

            screenSurface = SDL_GetWindowSurface(window);
            image = SDL_LoadBMP("world.bmp");
            SDL_BlitSurface(image, NULL, screenSurface, &offset);
            SDL_UpdateWindowSurface(window);
            cout << SDL_GetError() << endl;
        }
    }

    SDL_FreeSurface(image);
    SDL_DestroyWindow(window);

    image = nullptr;
    window = nullptr;
    SDL_Quit();

    return 0;

}

我收到错误,说:&#34; SDL_UpperBlit:传递NULL表面错误。&#34;但是直到我在SDL_PollEvent的while循环中使用switch语句到在isRunning while循环中使用SDL_SCANCODE_的if语句之后才发生错误。因此错误不会立即发生,但过了一会儿,就像10秒左右一样。因此,我可以使用WASD移动world.bmp一段时间,然后我得到错误&#34; SDL_UpperBlit:传递NULL表面错误。&#34;。

解决方案是什么?

1 个答案:

答案 0 :(得分:1)

image = SDL_LoadBMP("world.bmp");

这会从磁盘加载world.bmp,创建一个全新的曲面并将图像存储在其中。你永远不会破坏这个表面,也不会检查错误。

当您每帧运行一次时,SDL会快速耗尽资源,SDL_LoadBMP会返回NULL发出信号,然后您将NULL传递给SDL_BlitSurface

只加载一次资源,并在合适的时间处理它们。 C ++有智能指针和RAII为你做这件事。