下面说说对于子弹处理方面我的总结。
-
首先说线程的问题
我做的射击游戏目前只有一个线程,可以达到移动枪支,目标,和射击子弹的效果。
这唯一的线程就是主框架的Paint的方法(我没加面板,直接在JFrame上画的,会闪,需要做双缓冲),做的线程就是一直让它repaint(sleep(50)),就像咱们的屏幕在一直刷新。里面分别调用了不同对象的paint方法(只需传画笔g),所以如果不加判断条件,所有的物体一开始都在不停的画。加了条件之后,我们想让他动起来,则只需不断改变他们的坐标即可(所谓的物体移动速度speed,就是指每次坐标改变的大小)。
-
每颗子弹不一定都是线程,但一定都是一个对象。
它有自己的图片,大小,坐标,轨迹。
每按一下键,建立一个子弹对象。
建议用Arrylist做一个子弹容器,把每一个子弹对象都放进去,再主Paint方法里遍历容器中的每一个子弹,分别画出来(for循环),所以容器里有多少颗子弹,就会瞬间画多少颗,碰到边界时可以直接移除。虽然每颗子弹对象都属于同一类,但每建一个新的对象它的初始数据都是全新的,不互相干扰,主要的一点就是开火时的坐标,这里就要注意静态变量和非静态变量的问题了。
-
静态变量和非静态变量的问题
由于我的枪支可以移动,所以每发子弹的初始坐标也不相同,所以每颗子弹对象在刚创建的时候都要坐标赋予不同的
初始坐标,我的方法时在枪类里定义一个变量x_gun,让时时变化更新的枪对象的坐标x不停赋给x_gun,当子弹创建的时候
让子弹的初始坐标等于x_gun就行了。这个思路是正确的,但必须要注意静态变量和非静态变量的问题。
由于时时变化的调用枪坐标x和x_gun是在方法里,如果让x_gun=x,x_gun是没有被赋值的,。解决方法就是把x_gun定义为静态的,可以让方法里的代码去改变它。