CSDN=>FAQ=>FAQ 展示
  • 问题内容:关于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)
相关FAQ
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo