基于Java坦克大战小游戏设计 (2)

接下来继续完善element下物体类,以及添加有关整体游戏进程、配置、绘画相关的类。

game包:GameRunThread线程用来开始并处理游戏运行中出现的各种事件,继承thread类。

public void run() {
		// TODO Auto-generated method stub
		while(true) {
			try {
				Thread.sleep(GameStartUtil.FrameSleep);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			if(MyJFrame.FLAG)
			{
				tankMove();
				enemyTankAttack();
				bulletListMove();
				elementCollide();
				outOfBound();
				elementRemove();
				checkGame();
			}
			
		}
	}

整个游戏的过程可描述为:英雄坦克移动、敌方坦克攻击、打出的子弹的移动、物体碰撞处理、出界处理、移除非法物体、检查游戏状态。
MyJFrame:游戏主窗体
MyJPanel:游戏画板
TankFightStart:游戏主类,初始化MyJFrame并给窗体添加监听器即可。

gameUtil包:
createElementThread:游戏中创建所有物体的线程,也相当于一个“工厂”,游戏中所有需要的元素,以及配置文件的加载都可以通过它来创建。
gamestartutil:配置游戏的一些固定的东西,包括窗体宽高、线程休眠时间等
.pro文件:游戏的配置文件。物体的图片,物体的坐标等等都应该直接写进配置文件里,再让”工厂“通过读这些文件来创建物体。

manager包:
elementmanager:单例模式。游戏中的所有元素如所有坦克,所有子弹,墙,家等物体、线程等等都归这个类管理。因此要通过构造方法私有化以及用synchronized上锁,让这个类始终只有一个实例。想要什么元素都可以通过这个类来获取到。


接下来,首先让英雄坦克(我方坦克)动起来,并且能发射子弹。
坦克动起来:
整个过程分为如下步骤:
1. 通过createElementThread类 读取hero.pro得到坦克的配置信息(一组图片,坐标等等);
2. 创建坦克:调用createElementThread类中的createHeroTank方法,具体则是通过管理类elementmanager.getElementManager()的setHeroTank方法来创建坦克,注意同时初始化方向和生命值。
3. 画出坦克:在MyJPanel类的paint中加入heroshow方法,该方法则是通过调用tank类中的draw方法来画出坦克。
4. 坦克的逻辑处理:即键盘按下方向键后,坦克要怎么移动的处理。这部分很明显应该写在gamerunthread的run中的tankmove方法中。该方法应该包含英雄坦克还有敌方坦克的移动。
英雄坦克的移动时根据监听键盘按键后得到的状态来进行对应的处理。
监听器应该写在窗体类MyJFrame中,然后根据按键设置坦克状态。
gamerunthread的run中的tankmove方法则根据tank状态来设置坦克的方向,然后调用tank类中的move方法即可。


发射子弹:
整个过程步骤跟上面大同小异:
1. 通过createElementThread类 读取bullet.pro得到子弹的配置信息(一组图片);
2. 创建子弹:调用createElementThread类中addHeroBulletToList方法,添加一颗子弹到elementmanager类中的英雄子弹集合heroTankBullet中。子弹的坐标应该是坦克的大炮的坐标。
   这里与创建坦克不同,不需要在run方法中调用创建子弹的方法,而是在监听到按下开火键(F)时再调用它。
3. 画出子弹:同坦克的绘画是一样的道理。
4. 子弹的逻辑处理:即键盘按下开火键之后,子弹的移动。同样应该在gamerunthread中的bulletListMove方法中处理,具体逻辑很简单,只需要遍历elementmanager类中的英雄子弹集合heroTankBullet,如果isExist,那么调用bullet的move方法。
   同样的,监听器在窗体类MyJFrame中,监听到F键按下时,调用elementmanager.getElementManager().getceThread()来得到createElementThread的实例,并让它调用addHeroBulletToList方法来创建子弹。


从上面两个物体的创建可以得到所有物体创建的一般步骤:
首先读取该物品的配置文件,获取它的配置信息;
接下来让“工厂”createElementThread来创建这个物体;
然后在MyJPanel中画出来;
在gamerunthread类中加入对这个物体的逻辑处理。
同时在整个过程中,ElementManager类起到很重要的作用,可以通过它来拿到任何东西(如坦克,子弹),还可以通过它来通知“工厂”createElementThread生产东西。

这也是体现java中的“分工”的思想,各个类有各自的工作要做,不多做,不少做。

猜你喜欢

转载自blog.csdn.net/qq_41508508/article/details/81206183