📄 battlecanvas.java
字号:
import java.util.*;
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;
public class BattleCanvas extends GameCanvas implements Runnable{
private Display disp;
private Displayable last;
public Graphics g;
boolean isPlay;
int delay;
int width;
int height;
boolean isDrawing;
public static int groundWidth;
public static int groundHeight;
LayerManager backLayer,frontLayer;
RoleLayer roleLayer;
Vector battleRoleVC;
Vector enemyVC; //给battleHand使用
BattleHand battleHand;
int windowX,windowY; //可见视窗左上角坐标
private static Font numFont=Font.getFont(Font.FACE_SYSTEM,Font.STYLE_BOLD,Font.SIZE_LARGE);
public int status; //战斗状态
public int choosedCommand; //选择的战斗指令
//战斗状态集
public static final int STATUS_COMMAND=100; //选择指令状态
public static final int STATUS_COMMAND_ATTACK=110; //选择攻击目标
public static final int STATUS_COMMAND_ITEM=120; //选择物品
public static final int STATUS_COMMAND_ITEM_COMMAND=121; //选择物品的使用取消
public static final int STATUS_COMMAND_SKILL=130; //选择技能
public static final int STATUS_COMMAND_SKILL_ATTACK=131; //选择技能目标
public static final int STATUS_BATTLE=200;
public static final int STATUS_END=300;
//战斗指令集
public static final int COMMAND_ATTACK=1;
public static final int COMMAND_DEFENCE=2;
public static final int COMMAND_SKILL=3;
public static final int COMMAND_ITEM=4;
public static final int COMMAND_AUTO=5;
public static final int COMMAND_ESC=6;
public BattleSprite battleMainRole;
//private BattleSprite[] enemys;
private Timer timer;
private TimerTask timerTask;
private int attackTurn=-1;
Image hp; //血槽
private int enemyType; //0表示暗雷,1表示明雷
public BattleCommand battleCommand;
public BattleController battleController;
private Vector ashesVC; //用来记录尸体,防止重复调用清除尸体线程
private int successExp; //胜利经验
private int finalExp; //最终胜利经验
private int successMoney; //胜利钱
private int finalMoney; //最终胜利钱
private Mat[] defeatMats; //胜利物品
public MatTab matTab;
public Mat useMat;
public SkillTab skillTab;
public Skill useSkill;
MyAlert myAlert;
//Image screenImg;
//private BattleSprite[] battleSprites;
public int getEnemyType() {
return enemyType;
}
public void setEnemyType(int enemyType) {
this.enemyType = enemyType;
}
//private PointCreator pointCreator;
public BattleCanvas(String title,Display disp,Displayable last) {
super(false);
this.disp=disp;
this.last=last;
this.setFullScreenMode(true);
}
public void init()
{
this.g=getGraphics();
delay=1000/60; //1秒25祯
width=super.getWidth();
height=super.getHeight();
if(width>=176)
{
if(height<208)
{
height=208;
}
}
//screenImg=Image.createImage(width,height);
//this.g=screenImg.getGraphics();
battleController=new BattleController(this);
battleHand=new BattleHand();
battleCommand=new BattleCommand(this);
battleCommand.setCommand(new String[]{BattleCommand.COMMAND_ATTACK,BattleCommand.COMMAND_DEFENCE,BattleCommand.COMMAND_SKILL,BattleCommand.COMMAND_ITEM,BattleCommand.COMMAND_AUTO,BattleCommand.COMMAND_ESC});
battleCommand.setPosition(this.width-battleCommand.getWidth()-10,10);
loadScene(); //载入场景
}
LoadBar loadBar;
public void loadScene()
{
//显示进度条
loadBar=new LoadBar(disp,this);
loadBar.start();
disp.setCurrent(loadBar);
//disp.setCurrent(this);
Loader loader=new Loader();
loader.start();
}
public void doLoadScene()
{
System.out.println("载入场景");
for(int i=0;backLayer!=null && i<backLayer.getSize();i++)
{
backLayer.remove(backLayer.getLayerAt(i));
}
for(int i=0;roleLayer!=null && i<roleLayer.getSize();i++)
{
roleLayer.remove(roleLayer.getLayerAt(i));
}
backLayer=null;
roleLayer=null;
//System.gc();
int battleSceneIndex=SceneLib.scenes[SceneLib.currentSceneIndex].getBattleScene();
groundWidth=BattleSceneLib.scenes[battleSceneIndex].getGroundWidth();
groundHeight=BattleSceneLib.scenes[battleSceneIndex].getGroundHeight();
windowX=0;
windowY=0;
BattleSceneCreator sceneCreator=new BattleSceneCreator();
backLayer=sceneCreator.getBackLayer(); //取得背景层
if(loadBar!=null)loadBar.percent=10;
//创建用来显示的角色层roleLayer(将置入主角、NPC、敌人)
roleLayer=new RoleLayer();
//存储战斗角色对象(不用来显示,内部处理)
battleRoleVC=new Vector();
//给战斗hand使用
enemyVC=new Vector();
//加入
battleMainRole=new BattleSprite(BattleRoleLib.battleRole[0],Tools.getImage(BattleRoleLib.battleRole[0].getRoleImgUrl()));
battleMainRole.setOrgPosition(height-110,height-65);
battleMainRole.setPower(GameMIDlet.mainRole.getTotalPower());
battleMainRole.setDefence(GameMIDlet.mainRole.getTotalDefence());
battleMainRole.setLife(GameMIDlet.mainRole.getLife());
battleMainRole.setMaxLife(GameMIDlet.mainRole.getMaxLife());
battleMainRole.setMagic(GameMIDlet.mainRole.getMagic());
battleMainRole.setMaxMagic(GameMIDlet.mainRole.getMaxMagic());
battleMainRole.setActSpeed(GameMIDlet.mainRole.getTotalActSpeed());
battleMainRole.setName("主角");
roleLayer.addSprite(battleMainRole);
battleRoleVC.addElement(battleMainRole);
if(loadBar!=null)loadBar.percent=20;
int enemyIndex=0;
int[] enemyIndexArr=null;
if(enemyType==0) //暗雷
{
System.out.println("暗雷");
int enemyAmount=SceneLib.scenes[SceneLib.currentSceneIndex].getMineEnemyIndex().length;
/*
Random ran=new Random();
int scale=Integer.MAX_VALUE/enemyAmount;
int nextInt=Math.abs(ran.nextInt());
int ranEnemyIndex=nextInt/scale;
enemyIndex=SceneLib.scenes[SceneLib.currentSceneIndex].getMineEnemyIndex()[ranEnemyIndex];
enemyIndexArr=new int[]{enemyIndex};
*/
enemyIndexArr=new int[enemyAmount];
for(int i=0;i<enemyAmount;i++)
{
enemyIndexArr[i]=SceneLib.scenes[SceneLib.currentSceneIndex].getMineEnemyIndex()[i];
}
}if(enemyType==1) //明雷
{
System.out.println("明雷");
int enemyAmount=SceneLib.scenes[SceneLib.currentSceneIndex].getEnemyIndex().length;
/*
Random ran=new Random();
int scale=Integer.MAX_VALUE/enemyAmount;
int nextInt=Math.abs(ran.nextInt());
int sceneEnemyIndex=nextInt/scale;
enemyIndex=SceneLib.scenes[SceneLib.currentSceneIndex].getEnemyIndex()[sceneEnemyIndex];
*/
enemyIndexArr=new int[enemyAmount];
for(int i=0;i<enemyAmount;i++)
{
enemyIndexArr[i]=SceneLib.scenes[SceneLib.currentSceneIndex].getEnemyIndex()[i];
}
}
if(loadBar!=null)loadBar.percent=30;
//System.out.println("enemyIndex="+enemyIndex);
//enemys=new BattleSprite[enemyIndexArr.length];
//生成敌人对象
for(int i=0;enemyIndexArr!=null && i<enemyIndexArr.length;i++)
{
BattleRole battleRole=BattleRoleLib.getBattleRole(enemyIndexArr[i]);
BattleSprite enemy=new BattleSprite(battleRole,Tools.getImage(battleRole.getRoleImgUrl()));
enemy.setTarget(battleMainRole);
enemy.setTargetRole(GameMIDlet.mainRole);
enemy.setName(BattleRoleLib.battleRole[enemyIndexArr[i]].getName());
enemy.setLife(BattleRoleLib.battleRole[enemyIndexArr[i]].getLife());
enemy.setMagic(BattleRoleLib.battleRole[enemyIndexArr[i]].getMagic());
enemy.setPower(BattleRoleLib.battleRole[enemyIndexArr[i]].getPower());
enemy.setDefence(BattleRoleLib.battleRole[enemyIndexArr[i]].getDefence());
enemy.setActSpeed(BattleRoleLib.battleRole[enemyIndexArr[i]].getActSpeed());
enemy.setLv(BattleRoleLib.battleRole[enemyIndexArr[i]].getLv());
enemy.setDefeatExp(BattleRoleLib.battleRole[enemyIndexArr[i]].getDefeatExp());
enemy.setDefeatMoney(BattleRoleLib.battleRole[enemyIndexArr[i]].getDefeatMoney());
enemy.setDefeatMat(BattleRoleLib.battleRole[enemyIndexArr[i]].getDefeatMat());
enemy.changeStatus(BattleSprite.STATUS_ATTACK1);
enemy.setEnemy(true);
enemyVC.addElement(enemy);
}
if(loadBar!=null)loadBar.percent=40;
//设置敌人位置
if(enemyVC.size()==1)
{
((BattleSprite)enemyVC.elementAt(0)).setOrgPosition(23,52);
}else
if(enemyVC.size()==2)
{
((BattleSprite)enemyVC.elementAt(0)).setOrgPosition(1,65);
((BattleSprite)enemyVC.elementAt(1)).setOrgPosition(45,40);
}else
if(enemyVC.size()==3)
{
((BattleSprite)enemyVC.elementAt(0)).setOrgPosition(1,65);
((BattleSprite)enemyVC.elementAt(1)).setOrgPosition(45,40);
((BattleSprite)enemyVC.elementAt(2)).setOrgPosition(15,95);
}else
if(enemyVC.size()==4)
{
((BattleSprite)enemyVC.elementAt(0)).setOrgPosition(1,65);
((BattleSprite)enemyVC.elementAt(1)).setOrgPosition(45,40);
((BattleSprite)enemyVC.elementAt(2)).setOrgPosition(15,95);
((BattleSprite)enemyVC.elementAt(3)).setOrgPosition(59,70);
}
if(loadBar!=null)loadBar.percent=50;
//设置经验值
for(int i=0;enemyVC!=null && i<enemyVC.size();i++)
{
successExp+=((BattleSprite)enemyVC.elementAt(i)).getDefeatExp();
}
if(loadBar!=null)loadBar.percent=60;
//经验按级数递减
finalExp=successExp-successExp*GameMIDlet.mainRole.getLv()/100;
MyRandom myRandom=new MyRandom();
myRandom.setMinInt(-5);
myRandom.setMaxInt(15);
finalExp+=myRandom.nextInt();
if(finalExp<=0)finalExp=1;
//设置金钱
for(int i=0;enemyVC!=null && i<enemyVC.size();i++)
{
successMoney+=((BattleSprite)enemyVC.elementAt(i)).getDefeatMoney();
}
//金钱随机范围
myRandom=new MyRandom();
myRandom.setMinInt(0);
myRandom.setMaxInt(10);
finalMoney=successMoney+myRandom.nextInt();
if(finalMoney<0)finalMoney=0;
if(loadBar!=null)loadBar.percent=70;
//胜利物品
defeatMats=new Mat[enemyVC.size()];
for(int i=0;enemyVC!=null && i<enemyVC.size();i++)
{
defeatMats[i]=((BattleSprite)enemyVC.elementAt(i)).getDefeatMat();
defeatMats[i].setPrice(defeatMats[i].getPrice()*7/10); //价值打7折
}
//把敌人加到集合里
for(int i=0;enemyVC!=null && i<enemyVC.size();i++)
{
roleLayer.addSprite((BattleSprite)enemyVC.elementAt(i));
battleRoleVC.addElement(enemyVC.elementAt(i));
//enemyVC.addElement(enemys[i]);
}
if(loadBar!=null)loadBar.percent=80;
//加到手里
battleHand.setEnemyVC(enemyVC);
for(int i=0;enemyVC!=null && i<enemyVC.size();i++)
{
System.out.println("敌人名:"+((BattleSprite)enemyVC.elementAt(i)).getName());
System.out.println("敌人血:"+((BattleSprite)enemyVC.elementAt(i)).getLife());
System.out.println("敌人魔:"+((BattleSprite)enemyVC.elementAt(i)).getMagic());
System.out.println("敌人攻:"+((BattleSprite)enemyVC.elementAt(i)).getTotalPower());
System.out.println("敌人防:"+((BattleSprite)enemyVC.elementAt(i)).getTotalDefence());
System.out.println("敌人速:"+((BattleSprite)enemyVC.elementAt(i)).getTotalActSpeed());
System.out.println("打倒经验:"+((BattleSprite)enemyVC.elementAt(i)).getDefeatExp());
System.out.println("打倒金钱:"+((BattleSprite)enemyVC.elementAt(i)).getDefeatMoney());
System.out.println();
}
System.out.println("主角血:"+battleMainRole.getLife());
System.out.println("主角魔:"+battleMainRole.getTotalMagic());
System.out.println("主角攻:"+battleMainRole.getTotalPower());
System.out.println("主角防:"+battleMainRole.getTotalDefence());
System.out.println("主角速:"+battleMainRole.getTotalActSpeed());
if(loadBar!=null)loadBar.percent=90;
battleMainRole.changeStatus(BattleSprite.STATUS_ATTACK1);
hp=Tools.getImage("/pic/hp.png");
status=STATUS_COMMAND;
GameMIDlet.midlet.stopSound();
GameMIDlet.midlet.playBattleSound(0,true,0);
sortBySpeed(); //按攻击速度排序
System.out.println("战斗场景初始化完成");
//System.gc();
if(loadBar!=null)loadBar.percent=100;
}
//把死去的从battleRoleVC中去除
public void clearDeathSprite()
{
if(ashesVC==null)return;
for(int i=battleRoleVC.size()-1;battleRoleVC!=null && i>=0;i--)
{
if(ashesVC.contains(battleRoleVC.elementAt(i)))
{
enemyVC.removeElement(battleRoleVC.elementAt(i));
battleRoleVC.removeElementAt(i);
}
}
}
public void sortBySpeed()
{
//按行动速度排序
MySorter mySorter=new MySorter();
for(int i=0;battleRoleVC!=null && i<battleRoleVC.size();i++)
{
mySorter.addObject((BattleSprite)battleRoleVC.elementAt(i));
}
mySorter.sort(new Comparator(){
public int compare(Object o1, Object o2)
{
if(o1==null || o2==null)return 0;
if(((BattleSprite)o1).getActSpeed()<((BattleSprite)o2).getActSpeed())
{
return -1;
}else
if(((BattleSprite)o1).getActSpeed()==((BattleSprite)o2).getActSpeed())
{
return 0;
}else
{
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -