C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  117 Posts :: 2 Stories :: 61 Comments :: 0 Trackbacks

常用链接

留言簿(8)

搜索

  •  

最新评论

阅读排行榜

评论排行榜


    由于所有的图文件都是以一个四方矩形来存储的,但有时我们可能会需要把一张怪物图片贴到窗口的背景图上,而在这种情况下如果我们直接进行贴图,其结果如下图所示:
    这似乎不是所要的结果。在本篇随笔中将要讨论透明效果,就是要利用BitBlt()贴图函数以及Raster值的运算来将图片中不必要的部分去掉(又称去背),使得图中的主体可以与背景图完全融合。
    制作透明效果有多种方法,但基本上都是利用贴图时不同的
Raster运算,通过转换而最后产生相同的透明效果。
    以下面的恐龙图为例子,首先必须准备一张位图,它的色彩分配如下所示

    图中左边的图是要去背并贴在背景图上的前景图,右边的黑白图称为“屏蔽图”,在透明的过程中会用到它。把要去背的位图与屏蔽图合并成同一张图,透明的时候再按照需要来进行裁切。可以把它分成两张图,但这样程序必须运行两次图文件加载的操作。
    有了屏蔽图就可以利用贴图函数来产生透明效果了,所需进行的贴图步骤如下:
    (1)将屏蔽图与背景图做“AND”(Raster的SRCAND)运算,贴到目的地DC中。
    (2)将前景图与背景图做“OR”(Raster的SRCPAINT)运算,贴到目的地DC中。
    为什么经过上面的两个步骤就能产生透明的效果呢?可以参看下图:

 

    接下来说明上述两个步骤所产生的图点色彩的变化。
   
    1、屏蔽图与背景图做“AND”运算
    (1)屏蔽图中的黑色部分与背景图做“AND”运算
     
    (2)屏蔽图中的白色部分与背景图做“AND”运算
      
    经过这一运算所产生的结果如图20所示:

    2、前景图与背景图做“OR”运算
    (1)前景图中的彩色部分与图20做“OR”运算
      
    (2)前景图中的黑色部分与图20做“OR”运算
      
    经过这一运算后所显示的画面就是所需的透明图了,图下图所示

范例ch2_6:透明效果的显示。
下载地址:ch2_6(上传到windows live空间,可能需要MSN账号登陆)
说明:程序源代码中有相关的注释。
程序运行结果如下图:




PS:如想获得更多关于Visual C++游戏开发的内容,可点击随笔:《Visual C++游戏编程基础》学习笔记——索引随笔
posted on 2010-04-08 16:52 烟皑 阅读(1008) 评论(2)  编辑 收藏 引用 所属分类: 《Visual C++游戏编程基础》学习笔记

Feedback

# re: 游戏画面特效制作——透明效果 2010-04-08 17:35 陈梓瀚(vczh)
GDI的话需要引入一个img32.lib还是什么鬼lib的话,可以使用名字好像是TransparentBlt的函数,只要你的图片经过预处理,就可以根据每一个像素不同的alpha来处理每一个像素了。这样画出来会更快而且更漂亮。  回复  更多评论
  

# re: 游戏画面特效制作——透明效果 2010-04-08 17:37 烟皑
@陈梓瀚(vczh)
刚接触Visual C++游戏开发的东西,对GDI也不是特别的懂。你说的那些,等我弄得差不多了~~再去看看,然后再补充这篇博客~~谢谢了~  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理