要做一个FlappyBird,最核心的功能是创建几个区块,如果发生碰撞则游戏结束(小鸟撞到管子上,或者小鸟到地上),至于随机生成一些管子,小鸟如何跳跃,最后如何统计分数,都不难想通要怎么做。
?
首先是知道如何在窗体上绘制你要的东西,C#为我们提供了GDI+的功能,你可以定义一个Graphic对象,然后调用它的Draw方法,可以发现能绘制的东西很多,矩形,椭圆,多边形,曲线等等(绘制的是多边形,用的是pen的实例,填充的也是多边形,用的是solidbrush实例,当然除了pen和solidbrush还有别的工具,你可以绘制虚线,箭头等等)
?
绘制的时候注意是靠的是Paint方法,这个方法并不会主动执行,而是只在需要的时候执行(比如窗体改变大小,窗体被移动之类的),所以我在拖动滚动条之后,要人为地触发窗体的Refresh方法来更新绘图(我做了一个label来检测真正Paint方法的执行次数,这也是比较重要的调试技巧,想要测试一个东西是否执行,光MessageBox输出来对于复杂的情况还是不够的)
?
有了这么两个区域之后(一个固定,一个X,Y,Width,Height都由四个滚动条决定),我们就可以测试碰撞了。貌似C#并没有为我们提供两个区域的碰撞检测方法。比较容易想到的是遍历每个窗口的点,如果这个点存在于A区域,也存在于B区域,则认为AB区域重叠了,也就是碰撞了。我们屏幕的像素点很多(至少800*600几十万个点),如果真的要一个一个点遍历过来会耗费很多资源。所以为了提高效率,可以等间距采样就行了。下图我随便测试了一下比较粗略的情况,我手动让黄色方块运动到产生一个叠加点,确实可以检测到碰撞了(当然其实左边的情况也碰撞了)
?
不难想到,我把精度提高一倍,就能检测到初始化的时候碰撞的情况了(其实那些密密麻麻的小黑点没必要画出来,浪费系统资源,现在为了做测试还是要把草稿打出来的)
?
?
更多教学视频和资料下载,欢迎关注以下信息:
我的优酷空间:
http://i.youku.com/acetaohai123
?
我的在线论坛:
http://csrobot.gz01.bdysite.com/
?
问题交流:
QQ:910358960
邮箱:[email protected]