线程弹球

          线程弹球就是利用多线程机制实现的多个小球在界面中移动、碰撞的小项目。相似的效果可以参照Windows屏幕保护中的“气泡”效果。不同的小球独立进行着自己的运动,但当有小球发生碰撞时,又会相互影响,产生碰撞的效果。
           那么怎么去利用多线程机制来实现这样的效果呢?
           根据本人实现的经验,其实可以分成三步来实现这样的效果。
首先就是实现UI和画出小球的方法。在这一步中需要自定义一个继承了JFrame或者JPanel的类(如果需要添加其他的组件,一般建议继承JPanel,在添加到JFrame对象中)。首先需要定义一个ArrayList 对象,用于存放添加的小球(小球一般需要包括位置,大小,颜色等属性。小球类的具体实现放在第二步中具体说明)。其次需要复写paint方法,用于在小球的绘画。在paint方法中,可以先画出背景,在遍历整个ArrayList ,取出所有小球对象,根据小球的属性(位置,大小,颜色)画出小球。
           第二步就是实现可以独立运行的小球。相对于仅仅用于记录小球的相关信息,实现可以独立运行的小球类就需要用到线程的相关内容。在小球的对象在构造时就应该开启一个线程,用来控制小球的速度,并改变小球的位置。实现的方法较为多样,比较简单的方法就是直接让小球类继承Thread类、TimerTask类或者实现Runnable接口。在小球的类中复写run()方法。
           既然要记录小球的信息,那么小球类就必须拥有相关的成员变量(坐标X、Y,速度speedX、speedY、大小R、颜色Color等)。
           要控制小球的移动,那么就必须不断改变小球的坐标(一般就是通过X+speedX 的方式),在改变后调用Panel的paint方法,来实现小球不断移动的效果(出于这个因数的考量,在定义小球类是可以将Panel对象传入,以方便paint方法的调用)。
           第三步就是实现小球的碰撞了。在完成上面两步后,界面中随着小球的添加,小球将会在指定的方向上移动(移动速度的快慢可以通过线程循环的频率和小球的速度来控制。建议高频率、低速度,这样小球的移动效果更加真实)。但有两个问题,一个是小球会在碰到边界后直接飞出界面,而不是返弹回去。第二个是当小球相遇时只会相互覆盖,而不是产生碰撞。
           对于这两个问题,需要进行单独的处理。这种处理可以放到小球的移动过程中(在run()方法中加入判断是否发生这两中情况,并作相应处理),但考虑到计算效率的问题,可以将所有小球的碰撞放到一个新的线程中并行处理。在这个线程中,周期性的判断小球是否发生碰撞或者飞出边界,然后做出相应的处理。具体方法如下:
            对于飞出边界的处理,首先要通过坐标(x,y)来判断是否到达边界。若果到达边界,则将速度反向。如果是左右边界,则将横向速度—speedX的正负转变,如果是上下边界,则将speedY改变。
对于小球碰撞的处理则较为复杂。首先需要遍历其他的小球,判断是否发生了碰撞。如果发生了碰撞,就通过物理中的相关定理对两个小球的速度进行修改,具体公式请参考百度。这一方面最为困难的就是对速度的计算,在物理模型转化成程序代码时,一定要注意到数据类型的转化,来保证速度的准确性。
            上面三步完成后,界面中的小球便能够实现自由移动和碰撞。对于添加一些按钮(如:删除、暂停等)则较为简单,处理好监听就行了。

猜你喜欢

转载自729660130.iteye.com/blog/2216780