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

一楼留给链接http://blog.csdn.net/crocodile__/article/details/11860129

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

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

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

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

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只代表设计与思考的告一段落,最重要的是这之前的准备。

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

 五、关键代码

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

View Code

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

具体的流程如下:

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

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

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

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

5.步骤4创建的DC关联内存位图(以后称为bmpdc,缓冲画布关联DC简称为bufferdc)选择素材bmp并调用贴图函数TransparentTlt将素材贴到画布上。

    6.重复步骤5,直到所有素材都被贴到画布上。

    7.将画布上的像素位块转移到设备上BitBlt。

      View Code

敌机移动采用定时器驱动,定时器的调用模式比较明了:设置定时器、取消定时器、定时器处理。

SetTimer设置定时器,KillTimer取消定时器, 在消息处理中对定时器关联事件进行处理

View Code

    View Code

    View Code

    做了两个定时器来针对不同的需求:1.敌机向保卫者基地冲锋和子弹移动,要求移动幅度小且具有连贯性;2.保卫者的武器自动攻击,这个时间间隔比较长,要不满屏子弹,小时候特想有的大招,随便挥挥手,神兵自天而降,干掉所有的怪物,额,我这思考能力又把主题扯远了。

保卫者的子弹打中敌机和保卫者遭遇敌机都需要产生对应的特效,摧毁敌机和保卫者被干掉,这就需要碰撞检测,当然,小游戏要求的精度不高,可以简单的以矩形包围体进行近似化检测,矩形包围体发生碰撞就断定发生了碰撞事件,从而触发相应的处理。

View Code

    View Code

     好吧,代码中已经暴露了下一阶段的内容,就是积分和等级体系,这没啥好讲的。

捎带展示一下无意中添加的一个特性吧,窗口可以随着背景素材的大小进行自动扩展,游戏元素比如敌机、保卫者、子弹等都可以随时替换并根据替换的素材大小自行调节,会自动适应窗口大小,限制也是有的,就是飞机爆炸图片的段数是固定的,小飞机有两个阶段,中飞机有三个阶段,大飞机有四个阶段,游戏元素支持随意替换是因为设计时候采用的素材大小而非固定值的方式,窗口大小随着背景调整大小贴一段代码,稍等,大家可能还比较好奇,这个对话框是怎么整的,咋没有系统绘制的非客户区呢?一并告诉你。

View Code

    这两个函数在我的另外一个小游戏中也有用到,美女找茬。

注册全局快捷键的就不想贴啦,我的另外一篇博客专门讲了机制和用法:http://www.cnblogs.com/learn-my-life/p/3382703.html 

六、小结

最初的想法就是写一个类似现在的小游戏来学习技术,当目标达到的时候却发现我可以继续做下去,可以把我会的一些知识都给容纳进这个游戏,想到的一些新点子也会通过学习的方式逐步添加进来,先扯一些呗,伤害计算系统,网络游戏有3种伤害计算公式,减法、除法、乘法,到时候在这里实践一下。玩家信息记录模式,给出一些可选的角色列表,每个角色分别有移动速度增强、伤害增强等特性,玩家的信息在一次结束游戏后被加密保存至指定目录。信息查看面板,主面板保持最简洁,显示武器装甲分数,其他的信息通过切换画面提供等。也会增加更多游戏元素,绚丽多变的武器,敌机根据地位会携带相应的装备。从练习的角度来看,肯定是优先实现那些用到了不同技术的功能,我会继续把这个游戏做下去,有兴趣的同学请加个关注。

转载于:https://www.cnblogs.com/learn-my-life/p/3396714.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/261119.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

内容营销11金规

内容营销11金规 现在也许是解释和讲述一个很重要观点的好时机:创造给力的内容十分关键,但还不够。你还必须提出满足大量其他目标的材料,而这些材料,符合给力的内容的惯例,或者(你知道我们马上谈论这一点&am…

eclipse3.4 SVN插件安装

2019独角兽企业重金招聘Python工程师标准>>> SVN插件: http://subclipse.tigris.org/update_1.6.x 汉化版,现在我这边eclipse3.4是可用的。 转载于:https://my.oschina.net/dreamnight/blog/695060

连接两个linux系统软件,【技术共享】synergy-两台电脑共享一套鼠标键盘-Linuxwindows...

PS:这软件倒是不错,可是这要求两台电脑显示器都可以看到.当然一般我们是用不到的.再加上是局域网,直接用远程桌面连接或者控制软件也可以的.前些天,我把自己的台式电脑搬到实验室,与实验室里分配给我的电脑一起用。为了方便使用,我尝试了下用…

容错性设计

即便你的产品90%的时间都运行良好。但是如果在用户需要帮助时置之不理,他们是不会忘记这一点的。——《getting real》 我们有时候不能不面对产品出错的时候。无论设计得多么用心,无论做了多少测试,用户仍然会遇到错误和问题。既然…

Spring Data 系列(二) Spring+JPA入门(集成Hibernate)

通过【Spring Data 系列(一) 入门】的介绍,通过对比的方式认识到Spring提供的JdbcTemplate的强大功能。通过使用JdbcTemplate,操作数据库,不需要手动处理Connection,Statement等底层SQL对象。可是,Spring对数据库的操作还远远没有…

emmet-vim

最近啊,我投奔了网页的开发,看了一本《head first HTML and CSS》的书,感觉非常不错,然后又配置了一些vim里面用到的插件,现在我把学习到的东西记录下来! 首先,我不会在这里写emmet 的具体操作方…

百度epoll

epoll编辑epoll是Linux内核为处理大批量句柄而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。目 录 1简介 2优点 2.1 支持一个进程打开大数目的socket描述符2.2 …

linux命令 正则表达式,详解Linux命令中的正则表达式

详解Linux命令中的正则表达式Mark Do 2017年9月19日 暂无评论 阅读 981 次命令中的正则表达式如果要在命令输出或文本中筛选内容时使用模糊查找,就需要使用正则表达式。正则表达式是一套由多个元字符组成的模糊查找模式,使用正则表达式可以快速查找和定位…

【转】符串搜索工具及XenoCode字符串自动解密工具

【http://www.cnblogs.com/chengchen/archive/2008/07/14/1242244.html】 我们在使用OD破解软件的时候,字符串搜索是最常用的功能之一。但是在DONET平台下似乎没有什么比较好的软件,于是自己动手写了一个软件。这个软件可以自动搜索DONET程序集中的所有的…

linux 封装python,基于linux下python学习(封装)

一、面向对象类的设计:在程序开发中,要设计一个类,通常需要满足以下三个要求:1、类名 这类事物的名字,满足大驼峰命名法2、属性 这类事物具有什么样的特征3、 方法 这类事物具有什么样的行为eg:小明今年18岁&#xf…

图解RAID 0, RAID 1, RAID 5, RAID 10

RAID(Redundant Array of Independent Disk 独立冗余磁盘阵列)技术是加州大学伯克利分校1987年提出,最初是为了组合小的廉价磁盘来代替大的昂贵磁盘,同时希望磁盘失效时不会使对数据的访问受损 失而开发出一定水平的数据保护技术。RAID就是一种由多块廉价…

Spring JPA 中的Repository体系

为什么80%的码农都做不了架构师&#xff1f;>>> Repository体系 org.springframework.data.repository.Repository<T, ID> ---- Repository体系的顶级接口,是个空接口 interface CrudRepository<T, ID extends Serializable> extends Repository<T,…

Codeforces 258B Little Elephant and Elections

题意&#xff1a;有7个人从m个数中任选一个不重复的&#xff0c;其中4和7是幸运数&#xff0c;一个人的幸运值等于他所选的数字中所有4的个数7的个数。求一个人的幸运值比其他6人幸运值总和大的方案数。 1 #include <iostream>2 #define MOD 10000000073 using namespace…

Python 数据分析 Matplotlib篇 plot设置线条样式(第2讲)

Python 数据分析 Matplotlib篇 plot设置线条样式(第2讲)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ�…

装 linux后 win7消失了,win7系统重装后ubuntu启动消失不见的解决方法

很多小伙伴都遇到过win7系统重装后ubuntu启动消失不见的困惑吧&#xff0c;一些朋友看过网上零散的win7系统重装后ubuntu启动消失不见的处理方法&#xff0c;并没有完完全全明白win7系统重装后ubuntu启动消失不见是如何解决的&#xff0c;今天小编准备了简单的解决办法&#xf…

linux虚拟主机泛解析,Apache虚拟主机的配置和泛域名解析实现代码

Apache虚拟主机的配置和泛域名解析实现代码更新时间&#xff1a;2012年03月11日 00:28:19 作者&#xff1a;Apache虚拟主机的配置和泛域名解析实现代码&#xff0c;需要的朋友可以参考下虚拟主机的配置基于IP地址的虚拟主机配置Listen 80DocumentRoot /www/jb51ServerName ww…

socket用法linux,linux socket编程,要用到哪些函数,和用法介绍?_Linux_天涯问答_天涯社区...

4、获得地址信息/* 来源: http://www.jfox.info/c/a/ic/18071a.html */#include #include /* for strncpy */#include #include #include #include #include intmain(){int fd;struct ifreq ifr;fd socket(AF_INET, SOCK_DGRAM, 0);/* I want to get an IPv4 IP address */if…

图灵访谈系列之一:陈世欣谈产品经理与社区

原文链接地址&#xff1a;点击打开链接 10月20日&#xff0c;产品经理社区PMCamp、极客社区TopGeek的发起者和组织者陈世欣先生来图灵做客&#xff0c;畅谈对产品经理成长和社区发展的看法。以下为图灵社区整理的相关谈话内容。 人物简介&#xff1a; 陈世欣 StingChen产品经理…

Jenkins 使用 maven 出现C:\Windows\system32\config\systemprofile的解决

jenkins 使用 maven 出现 C:\Windows\system32\config\systemprofile 的原因是 Jenkins 服务启动的账号使用了系统的账号&#xff0c;在服务里改成具体的桌面用户账号即可。 If your command runs fine on Win command prompt as user X, then you should run Jenkins with the…

在Linux下用源码编译安装apache2

Linux下安装一个软件&#xff0c;最好去看下它的官方guide&#xff0c;apache2.4的安装安装guide 0. installation guide http://httpd.apache.org/docs/2.4/install.html 然后是下载源码 1. download http2.4&#xff0c; 下载地址 下载好了以后&#xff0c;把它解压到一个路…