在以下代码中:
#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;。
解决方案是什么?
答案 0 :(得分:1)
image = SDL_LoadBMP("world.bmp");
这会从磁盘加载world.bmp
,创建一个全新的曲面并将图像存储在其中。你永远不会破坏这个表面,也不会检查错误。
当您每帧运行一次时,SDL会快速耗尽资源,SDL_LoadBMP
会返回NULL
发出信号,然后您将NULL
传递给SDL_BlitSurface
只加载一次资源,并在合适的时间处理它们。 C ++有智能指针和RAII为你做这件事。