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 ...
随机推荐
- JAVAEE学习——hibernate03:多表操作详解、级联、关系维护和练习:添加联系人
一.一对多|多对一 1.关系表达 表中的表达 实体中的表达 orm元数据中表达 一对多 <!-- 集合,一对多关系,在配置文件中配置 --> <!-- name属性:集合属性名 co ...
- MYSQL注入天书之前言
写在前面的一些内容 请允许我叨叨一顿: 最初看到sqli-labs也是好几年之前了,那时候玩了前面的几个关卡,就没有继续下去了.最近因某个需求想起了sqli-labs,所以翻出来玩了下.从每一关卡的娱 ...
- 在学习HTML——form表单中的label标签时的一点小体会
在我啃了一遍书本之后,开始了在慕课看视频的过程,从最开始的HTML+CSS的基础课程看起,在第5-9小节讲到了form表单的label标签, 首先看一下慕课的讲解: label 标签不会向用户呈现任 ...
- HDU3853 LOOPS 期望DP 简单
http://acm.hdu.edu.cn/showproblem.php?pid=3853 有一点坑的地方是如果一个地方停在原地的概率为1,那么该地的期望为0,就相当于这个地方也是一个出口... ...
- 2017-2018-1 JAVA实验站 冲刺 day07
2017-2018-1 JAVA实验站 冲刺 day07 各个成员今日完成的任务 小组成员 今日工作 完成进度 张韵琪 写博客.进行工作总结 100% 齐力锋 部分按钮图片.对按钮图片进行ps 100 ...
- 1 Spring4 之环境搭建和HelloWorld
1 Spring 是什么? 具体描述 Spring: 轻量级:Spring 是非侵入性的- 基于 Spring 开发的应用中的对象可以不依赖于 Spring 的 API 依赖注入(DI --- dep ...
- Codeforces Beta Round #5 A. Chat Server's Outgoing Traffic 水题
A. Chat Server's Outgoing Traffic 题目连接: http://www.codeforces.com/contest/5/problem/A Description Po ...
- SqlServer项目经验:介质集有2个介质簇,但只提供了1个。必须提供所有成员
在对数据库备份与还原的过程中,我遇到一个问题“介质集有2个介质簇,但只提供了1个.必须提供所有成员”,下面详细的介绍一下遇到问题的经过与问题解决的方法! 一.备份与还原遇到的问题描述与解决方法: 前两 ...
- Ubuntu 16.04安装Wine版的微信(deepin-wechat)
说明: 1.使用的Wine版本是深度出品(Deepin),已经精简了很多没用的配置,使启动能非常快,占用资源小. 2.关于没有.wine文件夹的解决方法:在命令行上运行winecfg: 3.有可能在今 ...
- [置顶] ubuntu server sudo出现sudo:must be setuid root 完美解决办法。
1.开机按shift或esc先进行recovery模式 2.选择root命令行模式 3.先执行 #mount -o remount,rw / 这个很重要,网上找的很多资料都不全没有这步造成无法恢复成功 ...