首页>代码>java swing写的坦克大战>/tank/src/game/tank/MapManager.java
package game.tank;

import game.tank.entity.Tank;
import game.tank.listener.FireMouseListener;
import game.tank.thread.BlinkThread;
import game.tank.ui.TankPanel;
import game.tank.util.Maps;
import game.tank.util.TankType;
import game.tank.util.Utils;

import java.awt.Color;
import java.awt.Font;
import java.awt.Image;
import java.awt.Rectangle;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.swing.ImageIcon;
import javax.swing.JLabel;

public class MapManager {
	
	private static MapManager instance;
	
	private Map<Integer,Scene> scenes = new HashMap<Integer,Scene>();
	/** 结果,胜利或失败 */
	private int gameResult;
	
	private TankPanel panel;
	/** 当前是第几关 */
	private int currentRound = 1;
	
	private FireMouseListener fireListener;
	
	private int[][][] allMaps;
	
	private MapManager(){
	
	}
	
	public static MapManager getInstance(){
		if(instance == null){
			instance = new MapManager();
			return instance;
		}
		return instance;
	}
	
	/**
	 * 初始化各个关卡/场景
	 */
	public void initScenes(){
		allMaps = new int[][][]{Maps.map1,Maps.map2,Maps.ending};
		// 设置第一关,这里是完全自己定制,可以控制到细节
		Scene sce = new Scene(1);
		scenes.put(1, sce);
		Tank main = TankFactory.buildTank(TankType.MAIN_TANK,160,464,1,false);
		main.setDirection(1);
		Tank enemy2 = TankFactory.buildTank(TankType.LIGHT_TANK,32,16,4,true);
		Tank enemy3 = TankFactory.buildTank(TankType.HEAVY_TANK,416,16,4,true);
		sce.addTank(main);
		sce.addTank(enemy2);
		sce.addTank(enemy3);
		List<Tank> tanks = Utils.buildDefaultTankList(TankType.LIGHT_TANK, 2);
		sce.addWaitedTankList(tanks);
		
		// 设置第二关,利用了Utils类,简化了场景构造,但降低了控制权。
		// 如果还是觉得累赘,可以用Utils.buildSecne 的另一个overload方法,更加简便
		Scene sce2 = Utils.buildScene(2);
		tanks = Utils.buildDefaultTankList(TankType.HEAVY_TANK, 2);
		sce2.addWaitedTankList(tanks);
		scenes.put(2, sce2);	
		
		
		// 如果要自定义关卡,在这里可以加上。注意同时需要在本类中allMaps变量中,加上新地图的二维数组
		// 这里是例子
		// Scene sce3 = Utils.buildScene(3, TankType.LIGHT_TANK, 1);
		// scenes.put(3, sce3);	
		
		/** ending 画面 */
		int last = allMaps.length;
		Scene ending = new Scene(last);
		scenes.put(last, ending);	
	}
	
	public void start(){
		initScenes();
		initCurrentScene();
	}
	


	public void endGame(int gameResult) {
		this.gameResult = gameResult;
		JLabel label = panel.getLabel();
		new ShowGameResult(label).start();
	}
	
	public void resumeGame(){
		currentRound = 1;
		start();
		reset();
	}
	
	
	
	class ShowGameResult extends Thread {
		
		JLabel label;
		public ShowGameResult(JLabel label){
			this.label = label;
		}
		
		public void run(){
			int x = label.getLocation().x;
			int y = label.getLocation().y;
			label.setVisible(true);
			Font font = new Font("Dialog",1,25);
			label.setFont(font);
			label.setForeground(Color.orange);
			if(gameResult == -1){
				label.setText("Game Over");
			}else if(gameResult == 1){
				label.setText("Victory");
			}
			
			for(int i=0; i<panel.HEIGHT/2 - 105;i++){
				try{
					y--;
					label.setLocation(x,y);
					Thread.sleep(17);
				}catch(Exception e){
					e.printStackTrace();
				}
			}
			try{
				Thread.sleep(2000);
			}catch(Exception e){
				e.printStackTrace();
			}
			if(gameResult == 1 && currentRound < scenes.size()-1) {			
				nextRound();		
			}else if(gameResult == -1 || currentRound == scenes.size()-1){
				showEnding();
			}
		}
	}
	
	private void initCurrentScene(){
		gameResult = 0;
		//activate
		final Scene sce = scenes.get(currentRound);
		List<Tank> tanks = sce.getTankList();
		for(Tank t:tanks){
			t.go();
		}
		
		new Thread(){
			public void run(){
				while(sce.getWaitedTanks().size()>0){
					
					BlinkThread bt = new BlinkThread(scenes.get(currentRound));
					bt.start();
					try {
						Thread.sleep(15000);
					}catch(Exception e){
						e.printStackTrace();
					}
				}
			}
		}.start();
		panel.setScene(scenes.get(currentRound));
	}

	
	public void nextRound(){	
		currentRound++;
		if(currentRound > scenes.size()){
			return;
		}
		reset();
		initCurrentScene();
	}
	
	private void reset(){
		JLabel label = panel.getLabel();
		label.setBounds(new Rectangle(200,400,150,50));
		label.setVisible(false);
		Tank mt = scenes.get(currentRound).getMainTank();
		TankPanel.setRemainLives(mt.getHp());
		JLabel hplabel = TankPanel.getHpIcon();
		hplabel.setText(String.valueOf(mt.getHp()));
		JLabel roundLabel = panel.getRoundtext();
		roundLabel.setText(String.valueOf(currentRound));
		FireMouseListener.setTank(mt);
	}
	
	private void showEnding(){	
		int last = scenes.size();
		panel.setScene(scenes.get(last));
		panel.hideComponent();
		panel.getText().setVisible(true);
		panel.getBtn().setVisible(true);
		panel.getTankIcon().setVisible(true);
	}
	
	
	public void addScene(int round,Scene s){
		scenes.put(round, s);
	}
	
	public Scene getScene(int round){
		if(round > 0)
			return scenes.get(round);
		else
			return null;
	}

	public int getGameResult() {
		return gameResult;
	}
	
	public void setPanel(TankPanel panel) {
		this.panel = panel;
	}

	public int getCurrentRound() {
		return currentRound;
	}

	public void setCurrentRound(int currentRound) {
		this.currentRound = currentRound;
	}

	public FireMouseListener getFireListener() {
		return fireListener;
	}

	public void setFireListener(FireMouseListener fireListener) {
		this.fireListener = fireListener;
	}

	public int[][][] getAllMaps() {
		return allMaps;
	}

}
最近下载更多
12345685  LV2 1月7日
dengge123  LV13 1月5日
微信网友_6778365748318208  LV1 2023年12月14日
法拉利  LV1 2023年12月12日
liangge2115  LV27 2023年12月3日
moonlx  LV1 2023年10月19日
lwl1207  LV4 2023年8月29日
ns827yu  LV1 2023年6月19日
gzryue  LV6 2023年4月23日
huangzy  LV12 2023年4月6日
最近浏览更多
dengge123  LV13 1月5日
12345685  LV2 1月2日
求学的熊猫  LV6 2023年12月27日
微信网友_6778365748318208  LV1 2023年12月14日
法拉利  LV1 2023年12月11日
liangge2115  LV27 2023年12月3日
moonlx  LV1 2023年10月19日
tyiyiyuiyuihui  LV3 2023年10月11日
lwl1207  LV4 2023年8月29日
hougui  LV1 2023年6月20日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友