C#消灭小星星

来源:互联网 发布:s7300模拟量编程实例 编辑:程序博客网 时间:2024/04/30 06:57


因为要得找工作了,不得不写些文章让HR更多的了解到我,同时能帮到别的同学也是好的。因为接触Unity时间不是特别久,所以这里先帖出早期开发的C#游戏,然后再帖Unity游戏。

另外提醒,我的所有作品都是自己开发的,绝无抄袭(程序代码和编程思想绝没超抄过别人的),最多也就是高仿别人的游戏(贪吃蛇算吗?俄罗斯方块算吗?炸弹超人算吗?五子棋算吗?)。

转载请标明出处!!Power by 辣椒皮儿塞牙了╮


游戏说明:

1.本身想写炸弹超人的。。素材的原因,我觉得改名为消灭小星星更合适。。。

2.人物只能在空白区域活动,橙黄色部分是墙壁

3.玩家控制人物移动,那三个小星星是创建了3个子线程专门自控的

4.人物和星星都可以释放炸弹,炸弹只对一定距离内的,以炸弹为中心的横轴和纵轴有伤害效果。程序随机在某个空白位置产生不同的Property,吃了之后有相应的效果。比如:a)量:增加一次性可释放Bomb炸弹数量

b)长:增加Bomb伤害范围

c)蟹:大量增加横向移动速度,大量减少纵向移动速度(好吧我承认这一条是借鉴QQ堂里的)

d)魔:大量减少敌方移动速度

e)药瓶:恢复正常状态

f)鞋:增加移动速度

g)蓝色星星:这是个道具,只有黄色小星星可以吃,玩家吃不了,效果是复活一个小星星。。。(我还是挺有才华的吧)

5.点击右上角那个绿色图标,全部重置


开发思想:

1.FrmMain类,界面控制,玩家输入处理。Bomber类,玩家角色和“黄色小星星”,包含线程自动控制的AutoCtrl方法。Bomb类,释放炸弹时实例化一个Bomb类。Bullet,Bomb被实例化2秒后,生成4个方向的4个火焰条,玩家碰到火焰条变死亡。(Bullet是子弹的意思,换个别的单词也许好理解)

2.这里要先讲一下碰撞检测,存储玩家的坐标是一个Point点,顺带的可以有个玩家的width和height,这样玩家就有了一片矩形区域。当然直接用Rect类一样。假如向左走时,判断一下点(Point.x-distance , Point.y)以及(Point.x-distance , Point.y+height)是否与墙重叠了。又来了一个新的问题,墙怎么表示。。针对我的这张地图,完全可以用数组来存储,只用存储墙左上角的点坐标,因为墙的width和height是固定的。只要拿那两个点判断下是不是在这么多面墙的矩形范围内部即可。但是考虑到游戏的扩充,用链表比较好一点,这样地图可以设计的比较随意,链表结点用Rect,甚至以后都很容易做可以把墙炸掉的功能。相应的,其他三个方向自己改一改Point的加减条件即可。好了,这只是判断会不会撞到墙。。还要判断有没有撞到那三个邪恶的小黄星,有没有撞到炸弹,有没有撞到炸弹爆炸时的火焰条,有没有撞到量长蟹魔这些加效果的吃的。。。(现在真心感觉C#的WinForm不是做游戏的,想做游戏还是老老实实用游戏引擎吧,一个碰撞检测就轻松烦死你)

3.玩家的移动,Bomber中存储一个Point表示坐标,distance每次移动的间距,interval每次移动是时间间隔。甚至可以细分横向和纵向的间距、间隔。但是有一个很严重很严重的问题,比如玩家在(0,0),(10,0)处有面墙,如果每次走的距离是4,那么走了两步后到(8,0),这时候还想像右走是走不了,但是明显人物和墙之间有间距,按照我这种地图,像下走也走不了,经常会出现两个方向都被卡住的情况。怎么办?一个还算比较好的办法就是,如果向右走会撞到墙,那以现在的位置像右加1的距离,会撞到么?不会的话继续加,直到再加就撞到墙为止,这样就可以贴着墙走了,还意外的获得了一个减速的效果。。

4.投放炸弹,好的办法是按下投放键后,实例化出来一张picturebox显示炸弹。麻烦的是那三个小黄星是子线程控制的,实例化出来后Add不到主界面上去,会报错,说什么子线程无法控制主线程创建的控件什么什么,解决办法是使用delegate委托,但是程序中我没这么用,好像是当时又出了别的问题,记不大清了。不过建议各位一定要把delegate学好,很有用的,而且面试时动不动就考你。无奈大学里根本就不会好好教你这些真正有用的,MD大四了还在讲什么是常量,我凑!!不好意思,没控制住愤怒的小情趣。。好了,继续,我的解决办法就是主线程中直接把可能会用到的所有控件一次全部实例化出来,比如每个Bomber最多同时下3个Bomb,4个Bomber,我就实例化3*4个PictureBox显示Bomb,3*4*4个PictureBox显示火焰条,用的时候显示到合适的位置,不用的时候hide掉。。。这个办法很挫,但是管用。。。吕氏方法。。

4.火焰条碰撞检测,具体怎么碰撞在第2点谈过了,提醒下火焰条是从短逐渐变长,然后消失,新开线程也可以,用Timer也可以,该写变量的地方写变量,效果实现就OK。

5.吃效果,这个比较容易,碰到了什么,把相应的自身的属性值改一改就好

6.小黄星的AI,即AutoCtrl,我不知道别人怎么写的,因为我基本没看过别人的代码,我很善于思考和分析,我总可以想出解决问题的办法,自给自足。而且往往看别人的代码发现写的还不如我呢,所以这里建议各位看看我的开发思想就好了,能自己写尽量自己写,完整的写上几个程序后,你就不再是你了,你的实力都猛爆了。自动控制,我用的Random随机0-100,出0-2时放炸弹,3-5时改变移动方向,6-100全是继续当前的移动方向,所以这里要设定个值保存Bomber的方向,不然你会发现他在一个点附近跟疯了一样瞎闪。。当然,撞到墙时也要调用一下改变方向,不然你又发现他怎么老在面壁。。。

7.还有一种比较简单一点的方法,整体换掉,只用一个主线程,小黄星的控制用若干个Timer,这样就比较容易了。但会增加线程压力,需要处理的数据量大时会卡的,亲测4个Bomber完全没压力,10个有时候都可以的。


完整项目包下载链接:http://download.csdn.net/detail/q594076608/8051503

0 0
原创粉丝点击