原本是闲得慌无聊才去尝试做这个项目的,因为小时候玩小霸王的游戏机,那个时候经常玩这个游戏吧,特别是喜欢那种自定义地图的模式,觉得*度非常不错。总之关于这个游戏,想说的一大堆。鉴于能有个空闲的时间,打算好好整理下这段时间的思路,也算是一个分享吧,想到什么就说什么。
最开始的时候,来想既然你要做一个简易的坦克小游戏,那么肯定不容易的啊,你要做这个项目的分析,整个游戏流程的分析,就比如说,坦克游戏,你要能操控坦克啊,能击毁敌人坦克啊,然后再加个分数显示什么的等等,那么最基本的内容大概也就是这么多了,其实到项目中期的时候,你可能会发现自己当初想的功能实现不了,所以你要设定,就像是计划一样,还有可能你做做做,中期的时候,你会很失败的发现自己写的代码冗余太高了,很多细节处理,其实都有技巧的,但你是不会啊,你不知道,然后你就啪啪啪,一大堆的重复代码就这样敲上去了,后面你就灰常痛苦,然后越来越没兴趣,没有感觉了,恶性循环就开始了,当然我也不是说这样不好,其实这也是一个慢慢提高的过程,你错误处理的多了,你会积累大量的经验,随之技巧也就慢慢上去了。所以啊,你自己要去思考,去选择一种适合你的方式来做。
来讲下整个项目流程我的一些想法吧,自己总结的,中文水平不行,求轻喷!!!
你看啊,如果你要实现这个游戏,你要用到哪些知识点,就这个坦克游戏,我当初的想法比较单纯,首先,你自己作为一个游戏参与者,你要操控自己的坦克游戏吧,那么肯定要用到各种监控,想到这里,我多说一句,你要开发一个项目,首先你要分解这个项目,就是用面向对象的方法来分解,你要保证项目分析里面对项目的理解可以确保后期对代码的重整理较容易,大概也就是这个意思吧。反正我觉得这个非常重要,好,那么刚刚我们说到操纵这个功能,你用的是监控,你要监控比如上下左右,发射子弹这些操作,这个是最基础的功能,不详细讲,然后你要懂得绘图,多线程这两个核心的部分,这两个核心知识点贯穿整个游戏,绘图是什么,绘图就是你去不断更新这个界面,那么这个时候你要去想怎么更新呢,要更新的数据从何而来,而且在你项目中期,很多因素会对你绘图产生影响,反正当初我写的时候,特别头痛这个。多线程是什么,如果你要实现人机交互,你必然要电脑按照你给定的思路去做,这个时候,你要把这个任务交给线程去解决,就比如ai设置,其中你可以设定很多算法,来改变ai的智商(不知道这样叫妥不妥,其实ai很聪明的)。当你大体上懂得了这些后,你还需要懂界面布局这个环节,这里面也是有很多技巧的,不多说了。
下面来讲下整个游戏代码思路吧,一个坦克的游戏,你要分成几个类来处理,首先,tank应该是一个最基础的类,你可以在这个tank类上派生出自己的坦克和敌人的坦克,那么这个tank类需要哪些属性呢?坦克的坐标值,坦克的类型,坦克的生命值,坦克的速度,坦克的方向,当然你也可以加上坦克的颜色,图片等属性,这个是后期的工作,不说。好了,既然有tank类,你肯定要有一个子弹类zidan(原谅我英语渣),zidan类应该有方向,坐标值,生命,速度等属性,当时我另外加了一个半径属性,后面发现多此一举。现在你已经有两个这样的类了,你可以先进行简单的测试,你要在一个JFrame上画出整个背景图,当然你要另建一个类了,你可以给定一个坐标值,在当前位置画出一辆坦克,坦克可以用图片代替,除非你手绘技术和我一样渣,在画出后,你可以添加监控来控制坦克移动,其实这个实现很简单,你可以派生出JPanel类,然后用重绘这个功能实现,当你完成这个功能后,你可以尝试去修改坦克的各种属性,来确保后面不会因为小错误而纠结的不要不要的。好了,既然你可以实现*控制坦克,那接下来你要去实现射击这个功能,射击功能就是要让坦克发射子弹,所以你要在自己的坦克类里面设定一个子弹的容器,我之前想过用arraylist来存放,后来考虑到操作上可能有些麻烦,所以用vector向量来进行存放,既然你要用到vector向量的话,你要在一个操作类里面,也就是在绘图的那个类里面,利用vector自带的get,remove,size等方法,来实时对界面上的子弹内容进行重绘,同理,如果你想实现坦克被打爆的爆炸画面,同样也要用到vector向量(中期实现这块功能的时候,特别烦躁,而且特别容易出现不定时的错误),当然你也必须要对碰撞事件进行处理,坦克之间不能相互碰撞,而且子弹你要考虑对不同事物的碰撞反应,其实你可以把坦克爆炸这种状态封装为一个类,爆炸这属于一种状态,这样可以更方便你处理。最后在多线程这一块,多线程怎么进行体现,敌人可以作为一个线程,同时子弹你也可以作为一个线程,在响应你点击事件后,你要做出射击这个动作,这个时候子弹是作为一个对象进行处理的,他的坐标你要随时更新,然后不断进行重绘,值得注意的是当你的这个子弹处于死亡状态的时候,你要及时结束这个线程,当然这也是细节之处,那么敌人坦克呢?敌人坦克也是作为一个线程,当你处理到这个地方的时候,敌人坦克是一个ai,你要想怎么控制电脑去操控,那么按正常思路,首选是设置随机数,随机数你要在哪里设置呢?自然是坦克属性里面的方向,这个地方你必须得考虑thread睡眠这个数值怎样设置(反正这个地方我调试了好久),而且,最最重要的是在你绘图的那个类里面,你肯定也要设置一个线程,这个线程是非常重要的,而且你要考虑,你射击敌人这个动作和敌人射击你这个动作要放在哪里进行处理,最后当你做完这些基本内容的时候,你要对你的代码进行修边处理,而且你可以设置一个分数面板,这个非常容易,相信你能很快做出来。其实,后期除了一些bug修复,数值参数的修改,界面的美化,一些简易实用的功能添加,你可以考虑添加网络功能,保存功能,这两大块很烦,保存这一块主要涉及到文件导入导出,你可以把游戏中的实时数据,比如说坦克的坐标值,你很容易得到,子弹的坐标值自然不成问题,还有其他的一些数值,这个时候你要把这些数据存放起来,当你下次启动时,你要在代码里做相应处理,这个时候构造函数方面自然需要改变。网络功能还未涉及,要考虑的地方有很多。
其实做一个项目,你可以学到很多,你要分析一个项目,他的整体流程,抽象到他的每一个功能你要用什么样的方式去实现,具体到代码的实现过程,不管是一个大项目还是一个小项目,你要做的是分解它,对一个个非常小功能的实现意味着离成功越来越近,每当你实现一个小功能的时候,你对代码的纠错能力和语法的巩固会越来越扎实,到最后,上千甚至上万行的代码你也可以轻易完成。
好了!我要说的就是这么多了,灰常感谢你能看完,总之学无止境,学海无涯!——by Windy