gpt4 book ai didi

c++ - SDL_UpperBlit : passed a NULL surface error

转载 作者:行者123 更新时间:2023-11-28 05:19:34 24 4
gpt4 key购买 nike

在下面的代码中:

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

}

我收到一条错误消息:“SDL_UpperBlit:传递了一个 NULL 表面错误。”但是直到我从在 SDL_PollEvent 的 while 循环中使用 switch 语句,到仅在 isRunning while 循环中使用使用 SDL_SCANCODE_ 的 if 语句,错误才发生。所以错误不会立即发生,而是在片刻之后发生,比如 10 秒左右。因此,我可以使用 WASD 在 world.bmp 中移动一小会儿,然后我收到错误消息“SDL_UpperBlit:传递了一个 NULL 表面错误。”。

解决这个问题的方法是什么?

最佳答案

image = SDL_LoadBMP("world.bmp");

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

当您每帧运行一次时,SDL 很快就会耗尽资源,SDL_LoadBMP 返回 NULL 以发出信号,然后您将 NULLSDL_BlitSurface

只加载您的资源一次,并注意在正确的时间销毁它们。 C++ 具有智能指针和 RAII 可以为您做到这一点。

关于c++ - SDL_UpperBlit : passed a NULL surface error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41806306/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com