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 ...
随机推荐
- struts2和1的区别
先大致介绍下struts1和struts2 struts:过去最流行的web MVC组件,apache项目组的一个开源项目. struts2:现在非常流行的web MVC组件,是apache用stru ...
- 创建基于主-从视图的应用程序(Master-Detail Application)
以Master-Detail Application创建的应用程序在iPad和iPhone上都能运行,虽然模板解决了大部分问题,但还是有一些Apple遗留问题需要解决.使用该模板创建项目时,需要将下拉 ...
- Linux下burg引导
用得比较久了,比grub顺手: 安装: sudo add-apt-repository ppa:n-muench/burg; sudo apt-get update; sudo apt-get ins ...
- CodeForces - 1016D Vasya And The Matrix
题面在这里! 很明显二进制每一位都是无关的,所以可以先把原问题简化:给矩阵中的每个位置填入0/1,使得特定行/列有奇数个1,其他行/列有偶数个1. 一个比较好想的方法是对行和列 列出 n+m 个异或方 ...
- Problem E: 深入浅出学算法006-求不定方程的所有解
Description 现有一方程ax+by=c,其中系数a.b.c均为整数,求符合条件的所有正整数解,要求按x由小到大排列,其中a b c 均为不大于1000的正整数 Input 多组测试数据,第一 ...
- CDOJ 1294 天行廖的游戏 dp 容斥
天行廖的游戏 题目连接: http://acm.uestc.edu.cn/#/problem/show/1294 Description 天行健,君子以自强不息.地势坤,廖爷以厚德载物 一日在喵哈哈村 ...
- poj 3468 A Simple Problem with Integers 线段树区间加,区间查询和
A Simple Problem with Integers Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://poj.org/problem?i ...
- PAT甲级1045. Favorite Color Stripe
PAT甲级1045. Favorite Color Stripe 题意: 伊娃正在试图让自己的颜色条纹从一个给定的.她希望通过剪掉那些不必要的部分,将其余的部分缝合在一起,形成她最喜欢的颜色条纹,以保 ...
- 浅谈JVM-类加载器结构与双亲委派机制
一.类加载器结构 1.引导类加载器(bootstrap class loader) 它用来加载Java的核心库(JAVA_HOME/jre/lib/rt.jar),是用原声代码来实现的,并不继承自ja ...
- MySQL时间戳与日期互转
1.UNIX时间戳转换为日期用函数: FROM_UNIXTIME() ); 输出:2006-08-22 12:11:10 2.日期转换为UNIX时间戳用函数: UNIX_TIMESTAMP() sel ...