C#基础视频教程7.2 如何编写简单游戏
前面一小节我们实现了简单的碰撞检测,但是实际上游戏的对象并不是一个标准的矩形(小鸟是一个不规则的物体,其实碰撞的管道也是不规则物体),所以如果真的要做的比较完美,我们自己要写一个方法,能够导入一个图像,然后自己照着图像描绘一个不规则的轮廓,然后把这个轮廓提取出来点,以后判断的时候只要判断所有A图形轮廓的点是否在B区域就可以了。所以前面的矩形和椭圆已经不够用了,我们要用一个自定义的点位数组point[]来构建不规则多边形Polygon,当需要的判断点的时候就遍历这个point数组即可。

为了提高用户体验,我们假定:鼠标左键双击:开始绘制(重新绘制)鼠标右键单击:结束绘制(绘制完毕)鼠标中间单击:暂停绘制/继续绘制。这些方法百度不难找到,注意为了快速验证功能,我们直接放一个picturebox并且在初始化的时候注册几个事件(鼠标的单机,双击,移动三个,你也可以注册到Form1上)

当然你也可以设置成别的触发方式(我后来觉得鼠标按下和松开来表示暂停绘制和继续绘制更加合理,鼠标按下则继续绘制,鼠标松开只是移动,则不管)

我们用鼠标照着描绘轮廓的时候,是采用记录鼠标轨迹的方法得到的若干个点(可能有几百几千个),跟前面讲的一样,实际上也不需要这么密集(碰撞了就是碰撞了,不区分鸟的嘴撞到了还是鸟的下巴撞到了),所以跟前面一样要做一个可以自己定义疏密程度的方法,本来原始数据有1000个,我可以设置5个点采集一个,或者10个点采集一个,整体的点的数量就少得多了。

我们得到的一堆点实际上只是鼠标的轨迹记录,而实际上我们真正需要的是一些相对点(比如我要写一个绘制鸟的方法,只要指定一个起始点,一个缩放比例或者XY的两个缩放比例,就可以把后面所有的点都同比例的生成出来),所以在记录点的时候实际上还要做处理。第一个点X_1,Y_1,后面的点只保留跟前面点的XY差值即可,整个数组可以保存出去,跟前面讲的一样,数据格式都是我们可以自己定义的,最简单的txt就行了,可以看到第一行确实比较特殊,如果不是写这个不太好理解每个竖杠隔开的数字的意义。

从结果来看,跟我们预期的基本一致,我们把起点和终点用小圆特别画出来,因为有可能有一些误操作(比如开始绘图的时候并不是真正鼠标在要绘制的第一个点上,我们在导出点位处理的时候可以加判断,如果起点和终点差太多可以让起点强制等于终点坐标)

尤其要注意:这三个平移,缩放和旋转功能是非常有价值的。比如我们要做管道,随机的宽度和高度,那么只需要对标准的矩形按照X和Y的缩放比例即可。而且在很多打飞机游戏中,子弹需要一边走一遍旋转,坦克游戏和俄罗斯方块都可以旋转90度调整姿态等等。即便在这个范例中,我们绘制出来的小鸟可能跟最后要填充的图片也不匹配,那么就需要一些缩放和旋转让多边形和导入的图片匹配。

如果你的GDI+的参数非法,比如缩放比例是0,则整个窗口都会是一个叉叉(读者需要在自己做GDI+功能的时候注意防止非法的情况),我这里演示了Y的缩放比例数值为0 的时候效果,更多出错的情况读者可以自己去验证。

更多教学视频和资料下载,欢迎关注以下信息:
我的优酷空间:
http://i.youku.com/acetaohai123

我的在线论坛:
http://csrobot.gz01.bdysite.com/

问题交流:
QQ:910358960
C#基础视频教程7.2 如何编写简单游戏的更多相关文章
- C#基础视频教程7.5 如何编写简单游戏
有一些BUG需要处理,比如小鸟太高或者太低都应该报错(不然直接掉到窗口下面去了),这个方法跟前面的HitTest应该独立开来,而不是掺和在一起 测试确实可以检测是否超过边界(如果要非常精确,那么就 ...
- C#基础视频教程7.3 如何编写简单游戏
前面我们大致实现了鸟的一圈轨迹(其实如果你不做这个,就用两个矩形块的碰撞检测代替也可以),跟所有前面的教程一样,草稿打完了就要设计封装成一个类.至少到目前为止我们已经知道了鸟的属性和方法,先不要管方法 ...
- C#基础视频教程7.4 如何编写简单游戏
接下来我们实现整个的游戏流程,当点击开始游戏,则需要三个事情开始运行 1 小鸟初始化并往下掉(当然还是可以用按钮让他飞一下) 2 每隔一定时间从左侧产生一个管子(宽度和高度随机,产生周期2000ms左 ...
- C#基础视频教程7.1 如何编写简单游戏
要做一个FlappyBird,最核心的功能是创建几个区块,如果发生碰撞则游戏结束(小鸟撞到管子上,或者小鸟到地上),至于随机生成一些管子,小鸟如何跳跃,最后如何统计分数,都不难想通要怎么做. 首先 ...
- C#基础视频教程5.1 如何编写简单的超级热键
我们上一节介绍了编写简单计算器,实际上也是出于实用角度(这个计算器只要你肯改,肯定能做的比微软自带的计算器好用).这一节介绍做简单的超级热键(所谓的超级热键是指自定义快捷键的功能) 超级热键的最关键一 ...
- C#基础视频教程5.3 如何编写简单的超级热键
跟前面一章讲解计算器一样,到最后一小节,我们总是要把代码规整好,让整个程序显得非常简洁,先做个文件夹把我们自定义的类库都放进去 然后我们开始整理Form1里面的代码,为了实现超级热键的功能,我们应 ...
- C#基础视频教程5.2 如何编写简单的超级热键
我们前面已经理解了如何使用官方的代码实现鼠标键盘的监控,其实还差一点,因为他的代码只能捕捉单个的按键,而其实我们要的是组合键.什么是组合键呢?比如我想定义同时按下WIN+C是去执行屏幕截图.这只要理解 ...
- C#基础视频教程4.3 如何编写简单的计算器
我们接着往下改,为了让这个计算器更加实用,我们要像官方的计算器一样可以接着计算(你算出来一笔数据之后,可以接着累加累减,我们暂时不考虑加括号,优先级之类的,因为绝大部分情况下我们打开计算器就是为了进行 ...
- C#基础视频教程4.2 如何编写简单的计算器
用过VB6或者早期代码的人都应该能感觉到,C#目前也没看出来有什么特别之处,所谓的面向对象也没有什么体现.所以我们需要在原有基础上重写一份代码,然后比较两种做法的优缺点.我们在项目上右击添加一个Fun ...
随机推荐
- Redis学习篇(六)之ZSet类型及其操作
ZADD 作用: 将元素及其分数添加到集合中 语法: ZADD key score membre [score member] 当集合元素已经存在时,再次添加会更新其分数 当score是 +inf 时 ...
- 加密url
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha 可以采用 https 证书 双向 加密验证. 加密到 JNI 里面,还是可以通过抓包工具 ...
- 解决关于stack溢出的问题
开发中经常遇到: 前端遇到Uncaught RangeError: Maximum call stack size exceeded错误 后台遇到java.lang.OutOfMemoryError: ...
- 【MPI】并行求和
比较简单的并行求和 读入还是串行的 而且无法处理线程数无法整除数据总长度的情况 主要用到了MPI_Bcast MPI_Scatter MPI_Reduce typedef long long __in ...
- django深入-ORM操作
1 ORM添加 1.1 一对多添加 方式一: pub_obj=Publish.objects.get(id=2) Book.objects.create(title="python" ...
- 是否排序好了 Exercise07_19
import java.util.Scanner; import java.util.Arrays; /** * @author 冰樱梦 * 时间2018年12月 * 题目:是否排序好了 * */ p ...
- 【8.17校内测试】【模拟】【set】【网络流】
为什么每次想的最久的题得的分数最低!!!qwqwq 再也不在noip上尝试A*叻!! 模拟题,先把能消的消掉,双指针从两端向中间扫描,如果头尾合并可以消,就把它消掉,最后判断一下.因为消完过后num保 ...
- 02-MariaDB主从安装SpringBoot整合MyBatis配置
关于MariaDB的介绍 MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为My ...
- 把json格式的字符串转换成javascript对象或数组
第一种 JSON.parse(jsonString) 第二种 eval("("+jsonString+")") 第三种 var obj=(function ...
- SVN 服务器搭建及使用 一
SVN服务器搭建和使用(一) Subversion是优秀的版本控制工具,其具体的的优点和详细介绍,这里就不再多说. 首先来下载和搭建SVN服务器. 现在Subversion已经迁移到apache网站上 ...