射击的乐趣:WIN32诠释打飞机游戏

楼上神贴,膜拜片刻......

一、游戏玩法和已经实现的功能

1.打开游戏会有提示是否开始游戏。

2.键盘↑↓←→控制保卫者飞机(米格21原型,米格粉们千万不要看这架飞机)上下左右移动,躲避敌机并利用机枪扫射敌机。

射击的乐趣:WIN32诠释打飞机游戏

3.击落大飞机获得100分,中型飞机奖励60分,小飞机奖励20分,左上角分数板显示游戏积分。

4.全局快捷键SHIFT+A重新开始游戏,CTRL+A强行退出游戏,空格键暂停以及继续游戏,也可以鼠标点击左上角的图标来切换暂停与继续模式。

5.保卫者的硬度比不上野蛮的敌机,发生碰撞时会被摧毁掉,注意,保卫者有两次重生机会。

6.敌机突破保卫者的防守阵地则宣告游戏结束。

7.等级增强功能,当击杀积分达到一定数值,敌机会更加疯狂的进攻,相应的,保卫者的节奏也会加快。

8.不要觉得素材太雷同,有兴趣的朋友可以更换素材,游戏支持按照素材的大小进行自动调整。选取背景以外图片请以白色作为背景色,图片大小自行调节,window7的画图功能就支持缩放比例功能。

二、技术积累

版本开发间歇期抽时间完成的,写作的过程比较零碎,基本是遇到不会的API就上百度文库、博客园、VC驿站来查使用方法或者案例,一边学习一边完善对win32模型的理解。

打个广告哈:诚邀widnows编程的兄弟姐妹们一起分享学习,要是有大牛愿意指点一下就更好了,在下邮箱believing_dan@hotmail.com  QQ:382128698

双缓冲技术实现平滑刷新画面,避免频繁paint造成的闪烁。

双缓冲技术用到的透明背景贴图,透明背景贴字。

构建自己的消息处理流程和注册全局快捷键,在Pretranslatemessage中拦截虚拟键盘消息并进行预处理,之前的一篇随笔WIN32消息机制有详细介绍。

从指定路径加载位图。

碰撞检测,目前实现比较粗糙,简化为矩形包围体进行碰撞检测。

客户区鼠标事件处理,当点击指定区域时才触发指定事件,对鼠标点击区域进行判断。

游戏状态标志加上定时器实现游戏暂停与游戏中状态切换,注册了两个定时器分别对应保卫者射击与敌机移动。

AfxMessageBox的运用,加入选择以及风格的提示消息。

三、捉虫子

1.为了让爆炸有一个平滑的显示效果,给飞机设计了NORMAL、BOOST、DESTROYED三个状态,BOOST状态判断是否贴了最后一张爆炸图,用了当前pos是否等于图片边缘的判断,没有考虑到int a = 10/3; int b = a*3;  b 其实不等于a的这种场景,导致飞机下落过程中看起来消失掉,真实状态却一直保持在BOOST。

2.同样是爆炸效果,保卫者未做移动频率限制,而敌机采用定时器控制移动,可能存在敌机已经为DESTROYED状态且尚未调用定时器清除掉数据时碰撞到保卫者的场景,保卫者移动碰撞检测剔除该场景。

四、感悟

对着书本苦读只能出秀才,勤于实践才能那啥,额,成大牛吧。计算机不只是编程,更是一种解决问题的方法,按下F5只代表设计与思考的告一段落,最重要的是这之前的准备。

学会计算机科学非常困难但绝对必要。

五、关键代码

成功加载一张位图并在对话框中显示是第一步。

射击的乐趣:WIN32诠释打飞机游戏

View Code

有了上面的基础就可以去理解一下双缓冲,双缓冲绘图的简单流程就是:创建一个缓冲图层buffbmp,创建两个画图对象bufferdc和bmpdc,bufferdc关联缓冲图层,bmpdc依次关联想要绘制的bmp信息并将之贴到缓冲图层,缓冲图层所有画面都绘制完毕才会贴到真正的设备上下文,优点在于最终呈现到设备的画面是一次成型的,相比逐次贴图到主画面的方式可以消灭掉闪烁现象。

具体的流程如下:

1.创建一个设备兼容位图CreateCompatibleBitmap作为缓冲层,初学者理解为创建一张画布;

2.创建一个用于关联画布的设备兼容的内存设备上下文环境CreateCompatibleDC,初学者理解成创建一个GDI的类对象,通过该对象可以调用GDI的各种绘图函数,该对象由windows保证与指定设备兼容,在关联的设备上都能运作良好;

3.GDI对象选择画布SelectObject,SelectObject是个重载函数,根据参数的不同产生不同的效果,选择画布以后绘图就在该画布上画画,选择画笔,以后绘图就使用指定的画笔。

4.重复步骤2创建一个用于关联内存位图(加载到内存中的素材)的设备兼容的内存设备上下文环境,这个名字真的很长。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgyffz.html