这是我的代码:
template<typename G, typename N> void load_xbm(G* g,N w, N h,unsigned char* data)
{
Uint32 rmask, gmask, bmask, amask;
/* SDL interprets each pixel as a 32-bit number, so our masks must depend
on the endianness (byte order) of the machine */
#if SDL_BYTEORDER == SDL_BIG_ENDIAN
rmask = 0xff000000;
gmask = 0x00ff0000;
bmask = 0x0000ff00;
amask = 0x000000ff;
#else
rmask = 0x000000ff;
gmask = 0x0000ff00;
bmask = 0x00ff0000;
amask = 0xff000000;
#endif
SDL_Surface* s = g->backend_surface();
s = SDL_CreateRGBSurface(SDL_HWSURFACE,w,h,16,rmask,gmask,bmask,amask);
g->backend_surface( s );
for (N x = 0; x < w; x++)
{
for(N y = 0; y < h; y++)
{
g->put_pixel(x,y,data[y*x]);
}
}
SDL_Flip( s );
}
g->backend_surface()
只是在SDL_Surface*
中返回一个G
成员。w
是xbm位图的宽度,h
是高度,data
是unsigned char
的数组,其中包含每个像素的颜色。g->put_pixel()
是SDL docs中putpixel
方法的简单包装,使用backend_surface
作为示例putpixel
函数的第一个参数。现在,当我执行它时,程序会以
0x3
退出。通过调试代码,我发现它在调用putpixel
方法时退出,请注意putpixel
方法在其他地方工作正常。我还发现,只有当x
的y
和putpixel
参数大于Surface的原始宽度和高度时,它才会退出,但是我没有使用SDL_CreateRGBSurface
将表面调整为所需的宽度和高度? 最佳答案
在这里野外猜测...
此SDL tutorial example(第2.5点)表示在调用此函数之前必须锁定Surface。是你的?
关于c++ - 在SDL中编码X位图加载器?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9016121/