MFC 游戏 常用技术演示稿.ppt

  1. 1、本文档共20页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
MFC 游戏 常用技术演示稿

本章目标 多缓冲技术 位图透明处理 半透明处理 物理运动 匀速运动 绘图概述 Windows 环境下看到各种元素,如菜单、按钮、窗口、图像等,都是通过绘制而成,只是计算机的处理速度比手工绘制要快的太多,因此在我们看起来好像所有的图形文字都是同时出现的。 上述绘图这种方式称之为普通绘图方式。虽然这种方式能满足相当一部分的绘图要求,但当要绘制的对象相对复杂,尤其是含有大量位图时,此时就会产生画面会显示的很慢,对于运动的画面,会给视觉带来“卡”住了的感觉,屏幕也会呈现出大量闪烁。显然是不理想的绘图方式。出现上述问题GDI该如何处理,才能得到最佳效果呢? 双缓冲技术 双缓冲的原理,可以这样形象的理解:把计算机屏幕看作一块画板。首先,我们在内存环境中建立一个“虚拟“的画板;然后,在这块内存画板上绘制复杂的图形,当图形全部绘制完毕时,最后,再一次性的把内存中绘制好的图形“拷贝”到屏幕的上。 采取这种方法可以提高绘图速度,极大的改善绘图效果。 双缓冲实现2-1 实现双缓冲可以由四个步骤完成: 为屏幕 DC 创建兼容的内存 DC ,使用CDC成员函数:CDC::CreateCompatibleDC(); 创建内存位图:CBitmap::CreateCompatibleBitmap() ; 把内存位图选入设备环境:CDC::SelectObject(),可以理解为选择画布 ,然后开始绘图操作; 把绘制好的图形“拷贝“到屏幕上:CDC::BitBlt() 。 双缓冲实现2-2 动画处理的应用举例 位图透明处理5-1 所有的图文件都是以一个四方矩形来存储的,但有时我们可能会需要把一张精灵图片贴到窗口的背景图上,而这种情况下如果我们直接进行贴图,就会得到如下的效果: 位图透明处理5-2 位图透明处理5-3 如上效果显然不是所要的。实现理想的贴图,即用位图透明处理 制作透明效果有多种方法,但基本上都是利用贴图时不同的Raster运算,通过转换而最后产生相同的透明效果。 实现如下:以小精灵为例,准备好背景图,前景位图(小精灵)与屏蔽图 位图透明处理5-4 上图左边为前景图,右边黑白图称为“屏蔽图”,在透明的过程会用到它。 实现步骤: 首先将整个背景图贴到目的地DC中 将屏蔽图与背景图做“AND”(Raster值为SRCAND)运算,贴到目的地DC中 将前景图与背景图做“OR”(Raster值SRCPAINT)运算,贴到目的地DC中 位图透明处理5-5 为什么经过上面两个步骤能产生透明效果呢?具体分析如下: 在屏蔽图与背景图做AND运算时,分两个部分,第一部分:屏蔽图的黑色部分与背景做AND,得到的是全黑(黑色RGB值为全0存储,按位与即清0操作);第二部分:屏蔽图中的白色部分与背景图做AND运算得到是保留背景内容(白色RGB值为全1存储,任何数与1都保留为本身) 同上理,前景图(精灵)与背景图做OR运算时,前景黑色部分全0与任何数或运算都保留原来值,从而保留了背景的内容;此时背景准备要贴的精灵部分已是黑色,这时与前景做OR运算,保留的是前景的部分 半透明处理4-1 半透明在游戏中通常用来呈现若隐若现的特殊效果。事实上这种效果的运用相当频繁,比如雾气、鬼魂或隐形人物等,有时会以半透明的手法来表现 先分析下不透明处理,可以认为原来不透明处理的前景图不透明度为100%,而背景的在这块区域上的不透明度则为0%(完全透明,所不到背景),也就是背景在这块区域中色彩完全没有 半透明处理4-2 可是如果想要有半透明效果,让前景图看起来稍微透明一点,那就需要确定不透明值。假设确定不透明度是60%,也就是说前景图像素颜色在显示位置上的比例是60%,而剩下的40%当然就是背景像素的RGB颜色 如果可以将要显示区域的每一个像素颜色按照一定的不透明度比例进行合成,那么最后整个区域所呈现出来的就是所要的半透明效果了。综上述可以得出一个简单的公式: 半透明图色彩RGB值 = 前景图色彩*不透明度 + 背景图色彩*(1 - 不透明度) 半透明处理4-3 实现半透明处理的步骤操作如下: 取得位图结构,通过CBitmap::GetObject()成员函数取得 建立暂存数组,通过CBitmap::GetBitmaps()成员函数取得位图位值存到暂存数组中 合成像素颜色值,即上述的半透明图色彩RGB值公式,改变暂存数组RGB值 重设位图颜色,CBitmap::SetBitmaps()成员函数 半透明处理4-4 应用举例 物理运动2-1 将真实世界中的物理现象呈现于游戏中,对于游戏设计来说是相当重要的一门课题,例如物体移动、碰撞或者物体爆炸等,都属于物理现象。程序中要制作这些真实世界中的物理现象的效果,需要用到以前所学的物理概念与数学计算 物理运动2-2 物体处于运动状态,这

文档评论(0)

laolingdao1a + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档