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