飞机大战程序设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
程序设计综合实践
实习报告
一、实习题目:飞机大战游戏
二、实习时间:2014.9.20-2014.9.30实习地点:J13-132、232
三、实习任务:通过项目实战,掌握C++面向对象编程的基础技术和Windows 应用程序的编程方法,能够运用MFC技术及其开发环境进行小项目的开发。
四、小组分工说明:
五、实习成绩
六、指导教师对实习的评语:
指导教师(签章):
年月日
飞机大战游戏
1.实习目的
1.1使学生全面了解软件项目实施的过程,理解软件企业对于程序员的基本
素质和技术能力要求。
1.2使学生掌握C++及Window程序设计的基本技术,能够运用MFC技术及其
开发环境进行小型项目的开发。
1.3重点培养学生的独立创新精神和查阅资料能力,提高其口头和书面的沟
通能力。
1.4使学生掌握快速学习新知识、新技术方法,培养良好的分析问题和解决
问题的能力
1.5重点提高学生的编程能力,使学生建立正确的编程理念,养成规范的编
程习惯。
2. 实习计划
1、9.20—9.21先建立CGameObject 类,利用继承机制,根据此类进行依次的派生。
2、9.22—9.25再建立派生类:Bomb,Ball,Enemy,MyPlane,Explosion等,
并实现各自功能。
3、9.26—9.29在xxView.cpp中的OnTimer中实现背景的设置,对敌机,
导弹,敌机子弹,爆炸效果的绘制,以及敌机子弹和战机,导弹和敌机的碰撞检验,并添加爆炸效果
4、9.29—9.30最后释放pDC以及定时器
3.实习过程
3.1 技术准备
透明贴图技术
绘制透明位图的关键就是创建一个“掩码”位图(mask bitmap),这个“掩码”位图是一个单色位图,它是位图中图像的一个单色剪影。
在详细介绍实现过程之前先介绍下所使用的画图函数以及函数参数所代表的功能;整个绘制过程需要使用到BitBlt()函数。整个功能的实现过程如下:
(1) 创建一张大小与需要绘制图像相同的位图作为“掩码”位图;
(2) 将新创建的“掩码”位图存储至掩码位图的设备描述表中;
(3) 把位图设备描述表的背景设置成“透明色”,不需要显示的颜色;
(4) 复制粘贴位图到“掩码”位图的设备描述表中,这个时候“掩码”位图
设备描述表中存放的位图与位图设备描述表中的位图一样;
(5) 把需要透明绘制的位图与对话框绘图相应区域的背景进行逻辑异或操
作绘制到对话框上;
(6) 把“掩码”位图与这个时候对话框相应区域的背景进行逻辑与的操作;
(7) 重复步骤5的操作,把需要透明绘制的位图与对话框绘图相应区域的背
景进行逻辑异或操作绘制到对话框上;
(8) 最后把系统的画笔还给系统,删除使用过的GDIObject,释放非空的指
针,最后把新建的设备描述表也删除。
BOOL CGameObject::LoadImage(CImageList& imgList,UINT bmpID,COLORREF crMask,int cx,int cy,int nInitial)
{
CBitmap bmp;
if(!bmp.LoadBitmap(bmpID))
return FALSE;
if(!imgList.Create(cx, cy, ILC_COLOR24|ILC_MASK, nInitial, 0))//图像的长、宽、显示样式、图像可控数
return FALSE;
imgList.Add(&bmp, crMask);//滤掉底色
return TRUE;
}
CObList链表
在本程序中使用了CObList链表来分别存储敌机,炸弹,导弹,爆炸效果。CObList 链表类似于一个双向链表,POSITION类型的变量为链表的键。使用POSITION变量,既可以作为链表循环中的循环变量,也可以作为标记某个位置的标签。我们可以通过获得莫元素的POSITION()来访问它。
本程序中主要用到的函数有:
GetHeadPosition()——获取链表首元素的POSITION
AddTail()——向链表尾部添加新的元素
GetNext( POSITION& rPosition )——返回当前rPosition指向的元素,并使rPosition指向下一个元素
碰撞检验相关函数
用CRect类中的GetRect()函数可以获得当前对象的矩形区域,IntersectRect()函数判断战机与敌机、子弹与战机,导弹与敌机,导弹与子弹是否相撞。
设置定时器、销毁定时器
Windows定时器是一种输入设备,它周期性地在每经过一个指定的时间间隔后就通知应用程序一次。程序将时间间隔告诉Windows,然后Windows给您的程序发送周期性发生的WM_TIMER消息,以表示时间到了。
SetTimer()函数来设置定时器,控制每隔多少毫秒执行一次什么任务。用KillTime函数来销毁定时器。
键盘控制
添加OnKeyDown()和OnKeyUp()函数,通过修改战机的相应参数来实现对战机的控制,如上下左右运动,发射子弹等等。
双缓冲技术
关于双缓冲技术主要就是利用缓存的原理进行将所有的东西都先存在一个缓冲的虚拟的区域,然后再一次性的将所有的虚拟缓存中的东西都放入实在的存储器中。
CDC* pDC=GetDC();
CDC cdc;
cdc.CreateCompatibleDC(pDC);//依附窗口DC创建兼容内存DC
所有的图像文字均存入cdc中,然后一次性的通过
cdc.BitBlt(0,0,rc.Width(),rc.Height(),&cdc,0,0,SRCCOPY);//双缓冲BitBlt()函数,防止窗口刷新而闪烁
将内存DC上的图像拷贝到前台
cdc.DeleteDC();