gpt4 book ai didi

c++ - 处理曲面 vector 时如何正确使用 SDL_FreeSurface

转载 作者:行者123 更新时间:2023-11-28 01:12:32 25 4
gpt4 key购买 nike

我在 SDL 中设置了一个小型射击游戏作为我自己的教程。我有一个射弹结构

struct projectile
{
SDL_Surface* surface;
int x;
int y;
};

然后我将其放入 vector 中。

vector<projectile> shot;
projectile one_shot;

当我按下空格键时,我创建了一个新的抛射物并将其添加到 vector 中,然后在渲染时将它们 blitted。

这工作正常,但我在看似随机的情况下收到“程序已停止工作”错误。

所以我想知道释放表面的正确方法是什么。

  • 之后我会释放它们吗?
  • 我是否在每个镜头离开屏幕时释放它?
  • 还是其他选择?

更新:

我发现当我退出时崩溃的地方,当我开了几枪,他们都退出了屏幕。我尝试用“正确的复制方式”替换将表面添加到 vector 的代码,如 seen in this example , 它仍然以相同的方式运行。

这就是我释放表面的方式。

if(shot.at(i).y < 0 - shot.at(i).surface->h)
{
SDL_FreeSurface(shot.at(i).surface);
shot.erase(shot.begin() + i);
}

任何人都有想法或一些示例代码,我可以查看以解决这个问题。

最佳答案

如果多个射弹使用相同的 sprite(就像在几乎所有基于 sprite 的游戏中一样),最好使用包含您的游戏使用的所有图像的图像缓存并仅在其中进行内存管理。在开始时或按需填充它,并在退出时冲洗它。然后射弹只需要向这个缓存请求一个指向“arrow.png”的指针,缓存加载它(如果需要)并返回表面指针。

这样的缓存可以是一个简单的 std::map< string, SDL___Surface* >,只有像 get_surface(string) 和 flush() 这样的函数。

编辑:这个想法的实现:

class image_cache{
map<string, SDL_Surface*> cache_;
public:
SDL_Surface* get_image(string file){
map<string, SDL_Surface*>::iterator i = cache_.find(file);
if(i == cache_.end()) {
SDL_Surface* surf = SDL_LoadBMP(file.c_str());
i = cache_.insert(i, make_pair(file, surf));
}
return i->second;
}
void flush(){
map<string, SDL_Surface*>::iterator i = cache_.begin();
for(;i != cache_.end();++i)
SDL_FreeSurface(i->second);
cache_.clear();
}
~image_cache() {flush();}
};

image_cache images;
// you can also use specialized caches instead of a global one
image_cache projectiles_images;

int main()
{
...
SDL_Surface* surf = images.get_image("sprite.png");
...
}

关于c++ - 处理曲面 vector 时如何正确使用 SDL_FreeSurface,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1729699/

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