⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 metalmaxcanvas.java

📁 此为一款基于J2ME的手机游戏
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
/**********************************************************

 File name:MetalMaxCanvas.java

 Author:夏文涛

 Version:Beta1.0

 Data:2007/10/16

 Description:

    游戏显示画面的处理,游戏逻辑处理.

 Function List:


 *********************************************************/

package com.Izual.MetalMax;

import java.io.IOException;
import java.util.Random;
import java.util.Vector;

import javax.microedition.lcdui.Font;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.lcdui.game.LayerManager;
import javax.microedition.lcdui.game.TiledLayer;

public class MetalMaxCanvas extends GameCanvas implements Runnable, IData {

	private HeroSprite mHero;  /*英雄精灵*/

	private TankSprite mTank;  /*坦克精灵*/

	private MapManager mapMan; /*地图信息*/

	private NpcSprite[] mNpc = new NpcSprite[5];      /*NPC精灵*/

	private MonsterSprite mMonster;                    /*怪物精灵*/

	private EventSprite[] mEvent = new EventSprite[7]; /*事件精灵*/

	private ItemManager[] shopHeroItem;   /*人类工具店的库存信息*/

	private ItemManager[] item;           /*人类工具*/

	private EquItemManager[] equItem;     /*人类装备*/

	private EquItemManager[] shopEquItem; /*人类武器店的库存信息*/

	private TankItemManager[] tankItem;       /*坦克工具*/

	private TankEquItemManager[] tankEquItem; /*坦克装备*/

	private LayerManager mLm;     /*地图层次管理*/

	private TiledLayer mBoxLayer; /*地图前景层*/

	private TiledLayer mBackLayer;/*地图背景层*/

//	int mCounter = 0; /*计数*/
	
	int isOpen = -1;
	
	private long startTime;        /*游戏开始时间*/

	private long gameDuration = 0; /*游戏运行时间*/

	private long time = 0;         /*游戏时间*/

	private volatile Thread animationThread = null; /*活动的进程*/

	private long start; /*开始*/

	private final MetalMax midlet; /*midlet信息*/

	public boolean isGameOver = false; /*是否游戏结束*/

	private Image img = null;     /*地图图片*/

	private Image heroImg = null; /*英雄的图片*/

	private Image battler_tank = null;    /*战斗系统-坦克图片*/

	private Image battler_hero = null;    /*战斗系统-英雄图片*/

	private Image battlebackImg01 = null; /*战斗系统-背景图1:绿地*/

	private Image battlebackImg02 = null; /*战斗系统-背景图2:沙地*/

	private Image tankbattleImg = null;   /*战斗系统-坦克战斗时菜单图片*/

	private Image herobattleImg = null;   /*战斗系统-英雄战斗时菜单图片*/

	private Image attack_main01 = null;   /*主炮攻击动画图片1*/

	private Image attack_main02 = null;   /*主炮攻击动画图片2*/

	private Image attack_vice01 = null;   /*副炮攻击动画图片1*/

	private Image attack_vice02 = null;   /*副炮攻击动画图片2*/

	private Image attack_se01 = null;     /*SE攻击动画图片1*/

	private Image attack_se02 = null;     /*SE攻击动画图片2*/

	private Image cursorImg = null;   /*指针图片*/

	private Image menuImg = null;     /*菜单图片(非战斗菜单)*/

	private Image strImg = null;      /*英雄强度图片*/

	private Image tankImg = null;     /*坦克1的强度显示图片*/

	private Image tankStrImg = null; /*坦克强度图片*/

	private Image npcImg01 = null; /*NPC1的图片*/

	private Image npcImg02 = null; /*NPC2的图片*/

	private Image npcImg03 = null; /*NPC3的图片*/

	private Image npcImg04 = null; /*NPC4的图片*/

	private Image npcImg05 = null; /*NPC5的图片*/

	private Image npcImg06 = null; /*NPC6的图片*/

	private Image npcImg07 = null; /*NPC7的图片*/

	private Image npcImg08 = null; /*NPC8的图片*/

	private Image eventImg = null; /*事件精灵的图片,为透明图片*/

	private Image shopImg = null;  /*商店菜单图片*/
	
	private Image doorImg = null;  /*门的图片*/

	private int mapID = WORLD_MAP; /*地图编号*/

	Random battleRandom = new Random(); /*随机数产生器*/

	private int isbattle;        /*是否在战斗*/

	public static int way = -1; /*英雄朝向*/

	private short gameState;    /*游戏状态*/

	private short fightState;   /*战斗状态*/

	private short menuState;    /*菜单状态*/

	private short shopState;    /*商店状态*/

	private boolean isFight = true; /*战斗是否进行*/

	private int count = 1;        /*计数器*/

	private int cursorheight = 0; /*指针高度*/

	private int cursorwidth = 0;  /*指针宽度*/

	private int backNum = 0;      /*背景元素编号*/

	private boolean isMenu_Tool = false; /*菜单-是否在显示工具*/

	private boolean isMenu_Equ = false;  /*菜单-是否在显示装备*/

	private boolean isMenu_Str = false;  /*菜单-是否在显示强度*/

	private boolean isDrive = false;     /*是否在坦克上*/

	private boolean isMenu_ToolList = false;     /*菜单-是否显示人类工具*/

	private boolean isMenu_TankToolList = false; /*菜单-是否显示坦克工具*/

	private boolean isMenu_EquList = false;      /*菜单-是否在显示人类装备*/

	private boolean isMenu_TankEquList = false;  /*菜单-是否在显示坦克装备*/

	private boolean isBattle_Tool = false;       /*人类战斗系统-是否在显示人类工具*/

	private boolean isBattle_Equ = false;        /*人类战斗系统-是否在显示人类装备*/

	private boolean isBattle_TankTool = false;   /*坦克战斗系统-是否在显示坦克工具*/

	private boolean isTalk = false;          /*是否在谈话*/

	private boolean isShop_ItemList = false; /*商店菜单-是否在显示人类工具*/

	private boolean isShop_EquList = false;  /*商店菜单-是否在显示人类装备*/

	private boolean isShop_Sell = false;     /*商店菜单-是否在显示出售物品*/

	private int npcNum = 0;     /*NPC编号*/

	private int itemList[];     /*英雄拥有的人类工具*/

	private int itemEquList[];  /*英雄拥有的人类装备*/

	private int itemHeroEqu[];  /*英雄已经装备的物品*/

	private int tankItemList[]; /*坦克拥有的坦克工具*/

	private int tankEquList[];  /*坦克拥有的坦克装备*/

	private int itemTankEqu[];  /*坦克已经装备的物品*/

	private int eventID;        /*事件编号*/

	private int driveMap;       /*坦克停放的地图*/

	private short shopItemList[] = null; /*商店的库存物品*/

	private byte shopType = -1;          /*商店类型*/

	private byte shopPage = 0;           /*商店物品显示的页数*/

	private int listH = 20; /*商店菜单-指针纵向移动一次所移动的象素数*/

	private int listW = 48; /*商店菜单-指针横向移动一次所移动的象素数*/

	private int menuW = 30; /*普通菜单-阵阵横向移动一次所移动的象素数*/
	
	/*构造函数,载入初始地图信息*/
	protected MetalMaxCanvas(MetalMax medlet) {

		super(true);
		this.midlet = medlet;
		load(mapID);

	}
	
	public int getWidth(){
		
		return 176;
	}
	
	public int getHeight(){
		
		return 180;
	}

	/*载入游戏所需的资源文件,进行游戏的初始化设置*/
	public void load(int mapID) {

		/*载入图片资源文件*/
		try {

			img = Image.createImage("/mm_map.png");
			heroImg = Image.createImage("/hero.png");
			battler_tank = Image.createImage("/battler_tank.png");
			battlebackImg01 = Image.createImage("/battleback.png");
			battlebackImg02 = Image.createImage("/battleback2.png");
			tankbattleImg = Image.createImage("/tankbattleImg.png");
			attack_main01 = Image.createImage("/attack_main01.png");
			attack_main02 = Image.createImage("/attack_main02.png");
			attack_vice01 = Image.createImage("/attack_vice01.png");
			attack_vice02 = Image.createImage("/attack_vice02.png");
			attack_se01 = Image.createImage("/attack_se01.png");
			attack_se02 = Image.createImage("/attack_se02.png");
			cursorImg = Image.createImage("/cursor.png");
			menuImg = Image.createImage("/menu.png");
			strImg = Image.createImage("/strImg.png");
			tankImg = Image.createImage("/herotank.png");
			tankStrImg = Image.createImage("/tankStrImg.png");
			herobattleImg = Image.createImage("/herobattleImg.png");
			battler_hero = Image.createImage("/battler_hero.png");
			npcImg01 = Image.createImage("/npcImg01.png");
			npcImg02 = Image.createImage("/npcImg02.png");
			npcImg03 = Image.createImage("/npcImg03.png");
			npcImg04 = Image.createImage("/npcImg04.png");
			npcImg05 = Image.createImage("/npcImg05.png");
			npcImg06 = Image.createImage("/npcImg06.png");
			npcImg07 = Image.createImage("/npcImg07.png");
			npcImg08 = Image.createImage("/npcImg08.png");
			eventImg = Image.createImage("/eventImg.png");
			shopImg = Image.createImage("/shop.png");
			doorImg = Image.createImage("/door.png");

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		/*初始化地图管理器*/
		mapMan = new MapManager();

		/*初始化游戏前景图层*/
		mBoxLayer = mapMan.createTiledLayerByForeground(img, mapID);

		/*初始化游戏背景图层*/
		mBackLayer = mapMan.createTiledLayerByBackground(img, mapID);

		/*初始化英雄精灵*/
		mHero = new HeroSprite(heroImg, 16, 16);

		/*初始化坦克精灵*/
		mTank = new TankSprite(tankImg, 16, 16);

		/*初始化NPC信息,开场地图只需要2个NPC*/
		mNpc[0] = new NpcSprite(npcImg03, 16, 16, mapID, 0);
		mNpc[1] = new NpcSprite(npcImg04, 16, 16, mapID, 1);

		/*初始化英雄物品,坦克物品,包括工具和装备*/
		itemList = mHero.getHeroItem();

		itemEquList = mHero.getHeroEquItem();

		itemHeroEqu = mHero.getHeroEqu();

		tankItemList = mTank.getTankItem();

		tankEquList = mTank.getTankEquItem();

		itemTankEqu = mTank.getTankEqu();

		item = new ItemManager[itemList.length];

		for(int i = 0; i < itemList.length; i ++){

			item[i] = new ItemManager(itemList[i]);
		}

		equItem = new EquItemManager[itemEquList.length];

		for(int i = 0; i < itemEquList.length; i++){

			equItem[i] = new EquItemManager(itemEquList[i]);
		}

		tankItem = new TankItemManager[tankItemList.length];		

		for(int i = 0; i < tankItemList.length; i++){

			tankItem[i] = new TankItemManager(tankItemList[i]);
		}

		tankEquItem = new TankEquItemManager[tankEquList.length];

		for(int i = 0; i < tankEquList.length; i++){

			tankEquItem[i] = new TankEquItemManager(tankEquList[i]);
		}

		System.out.println("图片装载完毕");
	}

	/*地图切换方法*/
	private void gotoMap(int mapID) {

		/*地图切换开始*/
		HeroSprite.mapChanged = false;

		/*释放与不需要的资源的连接,等待系统垃圾回收*/
		mBoxLayer = null;
		mBackLayer = null;
		mLm = null;

		/*初始化地图的前景层和背景层*/
		mBoxLayer = mapMan.createTiledLayerByForeground(img, mapID);
		mBackLayer = mapMan.createTiledLayerByBackground(img, mapID);

		/*初始化英雄的坐标*/
		mHero.setXY(MapManager.heroPx, MapManager.heroPy);
		mHero.setPosition(MapManager.heroPx, MapManager.heroPy);

		/*游戏事件初始化*/
		mEvent[0] = new EventSprite(eventImg, 16, 16, mapID, 0);
		mEvent[1] = new EventSprite(eventImg, 16, 16, mapID, 1);
		mEvent[2] = new EventSprite(eventImg, 16, 16, mapID, 2);
		mEvent[3] = new EventSprite(eventImg, 16, 16, mapID, 3);
		mEvent[4] = new EventSprite(eventImg, 16, 16, mapID, 4);

		if(mapID == ZHUJUE_2F_MAP || mapID == LADUO_SHANGJIN_MAP
		  ||mapID == LADUO_INN_MAP || mapID == LADUO_MINGQI_MAP){
			
			if(mapID == ZHUJUE_2F_MAP){
				
				mEvent[5] = new EventSprite(doorImg, 16, 24, mapID, 5);
				mEvent[6] = new EventSprite(doorImg, 16, 24, mapID, 6);
			}
			if(mapID == LADUO_SHANGJIN_MAP){
				
				mEvent[6] = new EventSprite(doorImg, 16, 24, mapID, 6);
			}
			if(mapID == LADUO_INN_MAP){
				
				mEvent[5] = new EventSprite(doorImg, 16, 24, mapID, 5);
				mEvent[6] = new EventSprite(doorImg, 16, 24, mapID, 6);
			}
			if(mapID == LADUO_MINGQI_MAP){
				
				mEvent[6] = new EventSprite(doorImg, 16, 24, mapID, 6);
			}
			
		}else{
			
			mEvent[5] = new EventSprite(eventImg, 16, 16, mapID, 5);
			mEvent[6] = new EventSprite(eventImg, 16, 16, mapID, 6);
		}
		
		/*根据地图编号创建不同的NPC*/
		switch(mapID){

		case WORLD_MAP:

			break;

		case LADUO_MAP:

			mNpc[0] = new NpcSprite(npcImg02, 16, 16, mapID, 0);
			mNpc[1] = new NpcSprite(npcImg02, 16, 16, mapID, 1);
			mNpc[2] = new NpcSprite(npcImg01, 16, 16, mapID, 2);
			mNpc[3] = new NpcSprite(npcImg02, 16, 16, mapID, 3);
			mNpc[4] = new NpcSprite(npcImg07, 16, 16, mapID, 4);

			break;

		case ZHUJUE_1F_MAP:

			mNpc[0] = new NpcSprite(npcImg03, 16, 16, mapID, 0);
			mNpc[1] = new NpcSprite(npcImg05, 16, 16, mapID, 1);
			mNpc[2] = new NpcSprite(npcImg08, 16, 16, mapID, 2);
			mNpc[3] = new NpcSprite(npcImg08, 16, 16, mapID, 3);
			mNpc[4] = new NpcSprite(npcImg05, 16, 16, mapID, 4);

			break;

		case ZHUJUE_2F_MAP:

			mNpc[0] = new NpcSprite(npcImg04, 16, 16, mapID, 0);

			break;

		case LADUO_SHANGJIN_MAP:

			mNpc[0] = new NpcSprite(npcImg07, 16, 16, mapID, 0);
			mNpc[1] = new NpcSprite(npcImg06, 16, 16, mapID, 1);
			mNpc[2] = new NpcSprite(npcImg06, 16, 16, mapID, 2);
			mNpc[3] = new NpcSprite(npcImg01, 16, 16, mapID, 3);
			mNpc[4] = new NpcSprite(npcImg06, 16, 16, mapID, 4);

			break;

		case LADUO_HEROITEM_MAP:

			mNpc[0] = new NpcSprite(npcImg02, 16, 16, mapID, 0);
			mNpc[1] = new NpcSprite(npcImg01, 16, 16, mapID, 1);
			mNpc[2] = new NpcSprite(npcImg08, 16, 16, mapID, 2);
			mNpc[3] = new NpcSprite(npcImg08, 16, 16, mapID, 3);


			break;

		case LADUO_BAR_MAP:

			mNpc[0] = new NpcSprite(npcImg01, 16, 16, mapID, 0);
			mNpc[1] = new NpcSprite(npcImg02, 16, 16, mapID, 1);
			mNpc[2] = new NpcSprite(npcImg07, 16, 16, mapID, 2);
			mNpc[3] = new NpcSprite(npcImg01, 16, 16, mapID, 3);
			mNpc[4] = new NpcSprite(npcImg01, 16, 16, mapID, 4);

			break;

		case LADUO_INN_MAP:

			mNpc[0] = new NpcSprite(npcImg01, 16, 16, mapID, 0);
			mNpc[1] = new NpcSprite(npcImg07, 16, 16, mapID, 1);
			mNpc[2] = new NpcSprite(npcImg04, 16, 16, mapID, 2);
			mNpc[3] = new NpcSprite(npcImg04, 16, 16, mapID, 3);

			break;

		case LADUO_CHUANSONG_MAP:

			mNpc[0] = new NpcSprite(npcImg01, 16, 16, mapID, 0);

			break;

		case LADUO_MINGQI_MAP:

			mNpc[0] = new NpcSprite(npcImg03, 16, 16, mapID, 0);
			mNpc[1] = new NpcSprite(npcImg01, 16, 16, mapID, 1);
			mNpc[2] = new NpcSprite(npcImg01, 16, 16, mapID, 2);

			break;

		case TANK1_1F_MAP:

			break;


		case TANK1_2F_MAP:

			break;


		case TANK1_3F_MAP:

			break;

		default:

			break;

		}		

		/*如果是乘车状态,初始化坦克坐标*/
		if (isDrive) {

			mTank.setXY(MapManager.heroPx, MapManager.heroPy);

			mTank.setPosition(MapManager.heroPx, MapManager.heroPy);
		}

		System.out.println("装载完毕");
	}

	/**检测键盘输入,并作出相应的逻辑处理*/
	public void handleKey() throws IOException {

		/*获取键盘输入*/
		int key = getKeyStates();

		Graphics g = getGraphics();

		/*如果按了上键*/
		if ((key & UP_PRESSED) != 0) {

			/*更新英雄的方向*/
			MetalMaxCanvas.way = UP_PRESSED;
		
			if(isOpen != -1){
				
				mEvent[isOpen].setFrame(0);
			}

			/*随即遇敌准备,获取一个小于50的随机数值,通过更改摩数,可以更改遇敌频率*/
			isbattle = Math.abs(battleRandom.nextInt()) % 50;

			/*如果英雄处在世界地图,且随机数值为0,1的情况下,战斗开始*/
			if (isbattle <= 1 && mapID == WORLD_MAP) {

				/*获取背景元素编号,根据地形不同设置不同的战斗背景*/
				backNum = mapMan.getBackg(mHero.pX / 16, mHero.pY / 16);

				/*如果随机数为0,遇敌为音速车,进行怪物类初始化*/
				if (isbattle == 0) {

					System.out.println("音速车");
					mMonster = new MonsterSprite(音速车);
				}
				/*如果随机数为1,遇敌为沙漠车,进行怪物类初始化*/
				if (isbattle == 1) {

					System.out.println("沙漠车");
					mMonster = new MonsterSprite(沙漠车);
				}

				/*更改游戏状态为战斗状态*/
				gameState = GAME_FIGHT;

				/*开始播放战斗音乐*/
				SoundEffects.getInstance().startBattleSound();

			} else

				/*英雄每次移动16个象素*/
				for (int i = 0; i < 8; i++) {

					/*确认可以移动*/
					mHero.moveUp(true);

					/*遍历游戏事件,检测是否触发事件*/
					for (int k = 0; k < mEvent.length; k++) {

						/*如果有坦克精灵或英雄精灵跟事件精灵碰撞的情况*/
						if (mTank.collidesWith(mEvent[k], false)
								|| mHero.collidesWith(mEvent[k], false)) {

							/*检测是否为无用事件精灵,如果不是则触发地图切换事件*/
							if (mEvent[k].getEvent() != 0 && mEvent[k].getEvent() < 100) {

								eventID = mEvent[k].getEvent();

								HeroSprite.mapChanged = true;
								
								break;
							}
							if (mEvent[k].getEvent() == 110){
								
								mEvent[k].setFrame(1);
								
								isOpen = k;
								
								break;
							}

						}
					}
					
					/*如果是乘车状态*/
					if (isDrive) {

						/*移动坦克精灵*/
						mTank.moveUp(true);

						/*遍历游戏事件,检测是否触发事件*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -