-
问题内容:关于DDColorKey的问题
- 原讨论链接:http://community.csdn.net/expert/topicview1.asp?id=1108086
- 所属论坛:游戏开发
审核组:其他
- 提问者:greendesert
解决者:greendesert
- 感谢:swordsmith、cooljjyy、mimile
- 关键字:函数 调用 控件 专题开发/技术/项目 字段 触发器 变量 语句 堆栈 窗体 视图 游戏开发 初学者入门
- 答案:
我在学习DirectDraw,用photoshop来编辑我的背景图和精灵图,都是24位色BMP,DirectDraw的颜色模式设置为16位色。在精灵图中的透明部分我是用RGB(50,10,30)这个颜色进行填充,然后将RGB(50,10,30)设为屏外表面的关键色,之后就调用
HRESULT __fastcall TZDDraw::SetColorKeyToSurface(LPDIRECTDRAWSURFACE pdds, COLORREF rgb)
{
DDCOLORKEY ddck;
ddck.dwColorSpaceLowValue=ColorMatchToSurface(pdds,rgb);
ddck.dwColorSpaceHighValue=ddck.dwColorSpaceLowValue
return pdds->SetColorKey(DDCKEY_SRCBLT,&ddck);
}
这个函数进行设置,但奇怪的是,在进行块拷贝时精灵图仍然留有颜色为RGB(50,10,30)的边框。试了很多次都不行,但是当在photoshop中重新用RGB(0,0,0)或者RGB(255,255,255),对精灵图进行填充后,再进行块拷贝,精灵图的黑色或者白色的部分就是透明的了。这是为什么。拜托兄弟们不吝赐教。
还有,将24位色转变为16位色的565格式,是不是可以直接用
RGB_16BIT565(r,g,b)((r<<11)|(g<<5)|(b))
这样能不能将上面那个函数改为
...
ddck.dwColorSpaceLowValue=RGB_16BIT565(red,green,blue);
...
似乎更简单明了些
---------------------------------------------------------------
好像还要用GetPixelFormat得到dwRBitMask,dwGBitMask,dwBBitMask,再与你要设置的颜色进行运算(怎么算记不清了),然后才用来设置ColorKey吧。
另外你的24->16转换好像是对的。
另外我没有用过ColorMatchToSurface,是哪里来的。
---------------------------------------------------------------
可能错误是这样,比如说red分量是50,用2进制表示是00110010.但是16bit的red分量只占5位,所以红色分量的有效位只有前面5位,于是变成了00110000,也就是48.可能ddraw判断colorkey不是按照16bit色去比较,而是把16bit转换为24bit以后再和colorkey进行比较的.
所以你的图片中的背景色从16bit转换为24bit以后变成了RGB(48,8,24),用这个去代替你的背景色看看,我以前也遇到过相同的情况,这样是可以解决的.
---------------------------------------------------------------
我觉得可能是这样,photoshop的填充功能是有过渡效果的,所以在人物的边缘会留下一圈,那些颜色不是RGB(50,10,30),而是与那相近的值。建议你在windows画笔中重新用RGB(50,10,30)填充一次试试。
- 评价:
给朵鲜花(0)
扔个鸡蛋(0)