Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1366341
  • 博文数量: 118
  • 博客积分: 3888
  • 博客等级: 中校
  • 技术积分: 2940
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-10 18:15
个人简介

一看二做三总结

文章分类

全部博文(118)

分类: C/C++

2007-02-22 14:27:02

  游戏制作过程中常常需要在背景图案上加入一些障碍物,当障碍物边界不规则的时候就需要去掉障碍物图片中的背景颜色,实现障碍物与背景的无缝结合。

一、原理:

    游戏中嵌入物体与电影中特技的制作过程相似,在拍摄过程中使用纯色(一般为绿色吧)拍摄人物的动作,然后利用电脑用需要的背景替换纯色背景。游戏制作中嵌入物体的过程也是先制作背景色为纯色(例程里使用红色)的物体图片,利用与背景进行与或运算等图像处理技术实现物体与背景的无缝结合。

二、源码:

下列代码演示了嵌入障碍物的过程。

BOOL AddObstacle(CBitmap* backBmp,

       int nbackLen, int nbackWith,

       CBitmap* ttBmp, int nLeft,

       int nTop, int nLen, int nWith)
{
    CClientDC dc(this);
    CBitmap hBMP,mBMP,backBmp;
    hBMP.CreateCompatibleBitmap(&dc, nLen, nWith);    
//创建位图内存
    mBMP.CreateBitmap(nLen, nWith, 1, 1, NULL);            
//创建单色掩码位图
    backBmp.CreateCompatibleBitmap(&dc, 800, 600);

    CDC        hDC0,mDC0,backDC,memDC;
    hDC0.CreateCompatibleDC(&dc);                
//创建设备句柄
    mDC0.CreateCompatibleDC(&dc);                
//创建设备句柄
    backDC.CreateCompatibleDC(&dc);

    memDC.CreateCompatibleDC(&dc);


    CBitmap *oldBMP = (CBitmap *)hDC0.SelectObject(hBMP);
    CBitmap *oldmBMP = (CBitmap *)mDC0.SelectObject(mBMP);
    CBitmap *oldbBMP = (CBitmap *)backDC.SelectObject(backBmp);

    CCBitmap *oldmemBMP = (CBitmap *)backDC.SelectObject(memBmp);
    
// 将源DC中的位图拷贝到临时DC中

    backDC.StretchBlt(0,0,800,600,&memDC,0,0,nbackLen,nbackWidth,SRCCOPY);
    hDC0.SelectObject(ttBmp);

    hDC0.SetBkColor(RGB(0,255,0));
// 设置透明色
    mDC0.BitBlt(0, 0, nLen, nWith, &hDC0, 0, 0, SRCCOPY);
//生成透明区域为白色,其它区域为黑色的掩码位图

    hDC0.SetBkColor(RGB(0,0,0));
    hDC0.SetTextColor(RGB(255,255,255));
    hDC0.BitBlt(0, 0, nLen, nWith, &mDC0, 0, 0, SRCAND);
//生成透明区域为黑色,其它区域保持不变的位图

    backDC.BitBlt(nLeft, nTop, nLen, nWith, &mDC0, 0, 0, SRCAND);
//"与"运算,在hdc0生成掩模,透明部分保持屏幕不变,其它部分变成黑色
    backDC.BitBlt(nLeft, nTop, nLen, nWith, &hDC0, 0, 0, SRCPAINT);
//"或"运算,生成最终透明效果
    dc.BitBlt(0,0,800,600,&backDC,0,0,SRCCOPY);

    hDC0.SelectObject(&oldBMP);
    mDC0.SelectObject(&oldmBMP);
    backDC.SelectObject(&oldbBMP);
    memDC.SelectObject(&oldmemBMP);

    hDC0.DeleteDC();
    mDC0.DeleteDC();
    backDC.DeleteDC();
    memDC.DeleteDC();

    hBMP.DeleteObject();
    mBMP.DeleteObject();
    backBmp.DeleteObject();
    return TRUE;
}

阅读(3359) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~