📄 metalmaxcanvas.java
字号:
/**********************************************************
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 + -