前面一小节我们实现了简单的碰撞检测,但是实际上游戏的对象并不是一个标准的矩形(小鸟是一个不规则的物体,其实碰撞的管道也是不规则物体),所以如果真的要做的比较完美,我们自己要写一个方法,能够导入一个图像,然后自己照着图像描绘一个不规则的轮廓,然后把这个轮廓提取出来点,以后判断的时候只要判断所有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

邮箱:acetaohai123@163.com

 

 

C#基础视频教程7.2 如何编写简单游戏的更多相关文章

  1. C#基础视频教程7.5 如何编写简单游戏

    有一些BUG需要处理,比如小鸟太高或者太低都应该报错(不然直接掉到窗口下面去了),这个方法跟前面的HitTest应该独立开来,而不是掺和在一起   测试确实可以检测是否超过边界(如果要非常精确,那么就 ...

  2. C#基础视频教程7.3 如何编写简单游戏

    前面我们大致实现了鸟的一圈轨迹(其实如果你不做这个,就用两个矩形块的碰撞检测代替也可以),跟所有前面的教程一样,草稿打完了就要设计封装成一个类.至少到目前为止我们已经知道了鸟的属性和方法,先不要管方法 ...

  3. C#基础视频教程7.4 如何编写简单游戏

    接下来我们实现整个的游戏流程,当点击开始游戏,则需要三个事情开始运行 1 小鸟初始化并往下掉(当然还是可以用按钮让他飞一下) 2 每隔一定时间从左侧产生一个管子(宽度和高度随机,产生周期2000ms左 ...

  4. C#基础视频教程7.1 如何编写简单游戏

    要做一个FlappyBird,最核心的功能是创建几个区块,如果发生碰撞则游戏结束(小鸟撞到管子上,或者小鸟到地上),至于随机生成一些管子,小鸟如何跳跃,最后如何统计分数,都不难想通要怎么做.   首先 ...

  5. C#基础视频教程5.1 如何编写简单的超级热键

    我们上一节介绍了编写简单计算器,实际上也是出于实用角度(这个计算器只要你肯改,肯定能做的比微软自带的计算器好用).这一节介绍做简单的超级热键(所谓的超级热键是指自定义快捷键的功能) 超级热键的最关键一 ...

  6. C#基础视频教程5.3 如何编写简单的超级热键

    跟前面一章讲解计算器一样,到最后一小节,我们总是要把代码规整好,让整个程序显得非常简洁,先做个文件夹把我们自定义的类库都放进去   然后我们开始整理Form1里面的代码,为了实现超级热键的功能,我们应 ...

  7. C#基础视频教程5.2 如何编写简单的超级热键

    我们前面已经理解了如何使用官方的代码实现鼠标键盘的监控,其实还差一点,因为他的代码只能捕捉单个的按键,而其实我们要的是组合键.什么是组合键呢?比如我想定义同时按下WIN+C是去执行屏幕截图.这只要理解 ...

  8. C#基础视频教程4.3 如何编写简单的计算器

    我们接着往下改,为了让这个计算器更加实用,我们要像官方的计算器一样可以接着计算(你算出来一笔数据之后,可以接着累加累减,我们暂时不考虑加括号,优先级之类的,因为绝大部分情况下我们打开计算器就是为了进行 ...

  9. C#基础视频教程4.2 如何编写简单的计算器

    用过VB6或者早期代码的人都应该能感觉到,C#目前也没看出来有什么特别之处,所谓的面向对象也没有什么体现.所以我们需要在原有基础上重写一份代码,然后比较两种做法的优缺点.我们在项目上右击添加一个Fun ...

随机推荐

  1. Linux下c++常用调试

    进程调试 自己写的代码,直接gdb r/bt就可以了. 正在运行的进程,先ps ax找到进程id.然后gdb进入之后attach 进程id.stop/continue暂停和继续进程. core了,有c ...

  2. [HNOI2018]道路 --- 树形DP

    [HNOI2018]道路 题目描述: W 国的交通呈一棵树的形状.W 国一共有 \(n-1\) 个城市和 \(n\) 个乡村, 其中城市从 \(1\) 到 \(n-1\) 编号,乡村从 \(1\) 到 ...

  3. ZOJ 3687 The Review Plan I 容斥原理

    一道纯粹的容斥原理题!!不过有一个trick,就是会出现重复的,害我WA了几次!! 代码: #include<iostream> #include<cstdio> #inclu ...

  4. hdu 3435 图回路分割

    将一个无向图分成许多回路,回路点交集为空,点幷集为V.幷最小化回路边权和. #include <cstdio> #include <cstring> #include < ...

  5. hdu 3046 最小割

    每个栅栏其实就是一条边,修一些栅栏,使得狼不能抓到羊,其实就是求一个割,使得羊全在S中,狼全在T中. #include <cstdio> #include <cstring> ...

  6. bzoj 2194: 快速傅立叶之二 -- FFT

    2194: 快速傅立叶之二 Time Limit: 10 Sec  Memory Limit: 259 MB Description 请计算C[k]=sigma(a[i]*b[i-k]) 其中 k & ...

  7. ACM -- 算法小结(九)DP之Humble numbers

         DP -- Humble numbers  //一开始理解错题意了,题意是是说一些只有唯一一个质因数(质因数只包括2,3,5,7)组成的数组,请找出第n个数是多少 //无疑,先打表,否则果断 ...

  8. 【原】Eclipse部署Maven web项目到tomcat服务器时,没有将lib下的jar复制过去的解决办法

    我们在做web开发是,经常都要在eclipse中搭建web服务器,并将开发中的web项目部署到web服务器进行调试,在此,我选择的是tomcat服务器.之前部署web项目到tomcat进行启动调试都很 ...

  9. ExtJS 表单 submit时错误处理

    这里不提success,提提Extjs 表单提交的failure方法. 在表单的提交中,当发生异常行为时通常分为三种情况 1. 无法连接到服务器 2. 表单验证错误 3. 业务逻辑错误 对应下面的代码 ...

  10. 再见了,DM

        在DM奋斗了20个月之后,我终于有机会DM说再见.这我不是我第一次和DM说再见,因此我也不确定这次的再见是再也不见,还是再次见面.但有一点可以确定的是,在接下来相当长的一段时间内,我是没有机会 ...