想到一个将裁剪大图的便利方法
sdl吧
全部回复
仅看楼主
level 12
用一张大图的固定区域创建texture,而不是保存一个大图的texture和一个矩形给render调用,二楼说方法
2018年01月07日 04点01分 1
level 12
关于图片切割我有个想法:创建一个单例的图片缓冲,并维护一个map<字符串,表面>,实现的方法有loadfile(file),并创建surface,添加到map中,还有方法createtexture(file,rect),通过file寻找surface,找不到的话就调用loadfile方法,找到的话就通过map[file]取出surface,再用createrbgsurface创建一个透明的用于拷贝的surfacecopy,调用blitsurface将surface的固定区域blit到copy上,用copy创建texture,释放copy,返回texture。之后放代码
2018年01月07日 04点01分 2
level 12
ImageCache类:
class ImageCache
{
public:
static ImageCache* getInstance()
{
if (instance_ == NULL)
{
instance_ = new ImageCache();
}
return instance_;
}
void LoadFile(const char*filename);
SDL_Texture* CreateTexture(SDL_Renderer* renderer, const char* filename, SDL_Rect* srcrect);
private:
ImageCache();
ImageCache(const ImageCache&);
ImageCache& operator=(const ImageCache&);
static ImageCache* instance_;
ImageMap cache_;
};
2018年01月07日 05点01分 3
前面还有个声明:using ImageMap = std::map<const char*, SDL_Surface*>;
2018年01月07日 05点01分
level 12
LoadFile函数的实现:
void ImageCache::LoadFile(const char* filename)
{
SDL_RWops* rwtemp = SDL_RWFromFile(filename, "rb");
SDL_Surface* sur = NULL;
if (IMG_isPNG(rwtemp))
{
sur = IMG_LoadPNG_RW(rwtemp);
}
if (IMG_isJPG(rwtemp))
{
sur = IMG_LoadJPG_RW(rwtemp);
}
if (IMG_isBMP(rwtemp))
{
sur = IMG_LoadBMP_RW(rwtemp);
}
SDL_FreeRW(rwtemp);
SDL_assert(NULL != sur);
cache_.insert(ImageMap::value_type(filename, sur));
}
2018年01月07日 05点01分 4
level 12
CreateTexture函数的实现:
SDL_Texture* ImageCache::CreateTexture(SDL_Renderer* renderer, const char* filename, SDL_Rect* srcrect)
{
if (renderer == NULL)
{
SDL_SetError("renderer is null.\n");
return NULL;
}
if (filename == NULL)
{
SDL_SetError("file name is null");
return NULL;
}
if (cache_.find(filename) == cache_.end())
{
LoadFile(filename);
}
SDL_Surface* sur = cache_[filename];
if (sur == NULL)
{
cache_.erase(filename);
SDL_SetError("load file failure");
return NULL;
}
SDL_Surface* surcopy = NULL;
if (srcrect != NULL)
{
surcopy = SDL_CreateRGBSurface(0, srcrect->w, srcrect->h, 32, 0x00FF0000, 0x0000FF00, 0x000000FF, 0xFF000000);
}
else
{
surcopy = SDL_CreateRGBSurface(0, sur->w, sur->h, 32, 0x00FF0000, 0x0000FF00, 0x000000FF, 0xFF000000);
}
if (surcopy == NULL)
{
return NULL;
}
SDL_BlitSurface(sur, srcrect, surcopy, NULL);
SDL_Texture* tex = SDL_CreateTextureFromSurface(renderer, surcopy);
SDL_FreeSurface(surcopy);
return tex;
}
2018年01月07日 05点01分 5
level 13
单例保存所有的texture,使用相同的texture,可以有一个指针和矩形,在渲染时使用矩形和指针texture,是这个意思吧?
2018年01月08日 15点01分 6
保存的是原始surface,surface有从一个surface中的一部分拷贝到另一个surface上的方法,再用这个surface创建texture,每次创建texture就大小就只有所需要的大小。
2018年01月08日 15点01分
你说的那种方法是我原来用的,保存texture和一个rect以供rendercopy使用,但这样的texture是为了renderer服务的,而且这样创建的texture实际上并非真正的创建,只是创建一个矩形而已。
2018年01月08日 15点01分
回复 巨蟹爷12138 :这没什么关系吧?这样的映射会减少内存的使用。如果每次渲染都截下来的话,就需要内存不断的开辟 释放,碎片越来越多。不利于运行。游戏运行所需的就是把纹理渲染到renderer中,这些渲染应该是封装好的,只要结果正确,运行高效。至于里面,就是黑匣子,无所谓实现
2018年01月09日 03点01分
@小牛_牛sky 但这样映射必定会将2个在一张图的不同texture联系在一起,如果某一个修改了texture的属性,那么所有的都会被修改。
2018年01月09日 04点01分
level 13
默默注释,静静学习,
2018年01月09日 02点01分 7
level 1
哇,666
2018年04月06日 21点04分 8
1