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

📄 battlecanvas.java

📁 《神州》RPG游戏引擎
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
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 + -