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

📄 mygamecanvas.java

📁 自己写的JAVA飞机飞行游戏
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
package FightChess;
//Download by http://www.codefans.net
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;
import java.io.InputStream;
import java.util.Date;
import java.util.Random;
import java.util.Vector;
public class MyGameCanvas extends GameCanvas implements Runnable
{
	public static final int CHECKWIDTH = 24;
	public static final int CHECKHEIGHT = 24;
	public static final int DIALOGHEIGHT = 40;
	public static final int DIALOGMAXLINE = 2;
	public static final int STATUS_FIGHT_WAIT = 0;
	public static final int STATUS_FIGHT_MOVE = 1;
	public static final int STATUS_FIGHT_FIGHT = 2;
	public static final int STATUS_MENU = 3;
	public static final int STATUS_MOVE = 4;
	public static final int STATUS_VILLAGE = 5;
	public static final int STATUS_DIALOG = 6;
	public static final int DIALOG_FIGHTEND = 1;
	private LayerManager lm;
	private Graphics g;
	private int rate = 100;
	private boolean conti = false;
	private TiledLayer fightLayer;
	private TiledLayer mapLayer;
	private TiledLayer mapbrLayer;
	private TiledLayer villLayer;
	private TiledLayer villbrLayer;
	private int viewX = 0;
	private int viewY = 0;
	private int mapWidth;
	private int mapHeight;
	private int maxRow;
	private int maxCol;
	private int [][] checkMsg;
	private Soldier hero[];
	private Soldier enemy[];
	private Soldier curSoldier;
	private People myhero;
	private Villager villager[];
	private int heroP=0;
	private int enemyP=0;
	private int status=STATUS_MOVE;
	private int statusOld;
	private int[][] battlefield;
	private int[][] villagefield;
	private int[][] villdoorfield;
	private int[] saveTemp;
	private Image imgSword;
	private String dialog[];
	private int dialogIdx=0;
	private int dlgFromFlg=0;
	private String ftDlgStart[];//dialogStart
	private String ftDlgEnd[];//dialogEnd
	private Random r=new Random(new Date().getTime());
	private Menu menu;
	private EnemyAction enemyAction;
	private String eventKey ="";
	public MyGameCanvas()
	{
		super(false);
		//setFullScreenMode(true);
		g=getGraphics();
		lm=new LayerManager();
		menu = new Menu(g);
		enemyAction = new EnemyAction();
	}
	public void start()
	{
		if(conti==true)return;
		Image imgSource = loadImage("/FightChess/hero1.png");
		Image imgMyHero = Image.createImage(imgSource,0,0,CHECKWIDTH*2,imgSource.getHeight(),Sprite.TRANS_NONE);
		myhero = createPeople(imgMyHero);
		hero = new Soldier[4];
		hero[0] = createSoldier(imgMyHero,true,0,0);
		hero[0].setFightPower(11);
		hero[0].setDefencePwoer(6);
		saveTemp = new int[4];//0mapWidth,1mapHeight,2myheroX,3myheroY
		readMap("map0");
		conti = true;
		Thread t = new Thread(this);
		t.start();
	}
	public void exit()
	{
	}
	private String readFile(String fileName,int fileSize,String tag)
	{
		String strReturn="";
		try{
			InputStream is = this.getClass().getResourceAsStream(fileName);
			byte word_uni[]=new byte[fileSize];
			is.read(word_uni);
			is.close();
			strReturn = new String(word_uni,"UTF-8");
			strReturn = readString(strReturn,tag);
			maxRow = Integer.parseInt(readString(strReturn,"maxRow"));
			maxCol = Integer.parseInt(readString(strReturn,"maxCol"));
			mapWidth = CHECKWIDTH * maxCol;
	        mapHeight= CHECKHEIGHT * maxRow;
		}catch(Exception e){e.printStackTrace();}
		return strReturn;
	}
	/**
	 * @param flg :"map":bigmap ,"vil":villagemap
	 * @param data
	 * @param back
	 * @param imgMap
	 */
	private void setBackLayer(String flg, int[]data,int[]back,Image imgMap)
	{
		int[] backgroundMap = new int[data.length];
		int[] barrierMap = new int[data.length];
		for(int i=0;i<data.length;i++)
		{
			boolean isBack = false;
			for(int j=0;j<back.length;j++)
			{
				if(data[i]==back[j])
				{
					isBack=true;
					break;
				}
			}
			if(isBack)
			{
				backgroundMap[i] = data[i];
				barrierMap[i] = 0;
			}
			else
			{
				backgroundMap[i] = 0;
				barrierMap[i] = data[i];
			}
		}
		if(flg.equals("map"))
		{
			mapLayer = new TiledLayer(maxCol, maxRow, imgMap, CHECKWIDTH, CHECKHEIGHT);
	        mapbrLayer = new TiledLayer(maxCol, maxRow, imgMap, CHECKWIDTH, CHECKHEIGHT);
		}
		else if(flg.equals("vil"))
		{
			villLayer = new TiledLayer(maxCol, maxRow, imgMap, CHECKWIDTH, CHECKHEIGHT);
	        villbrLayer = new TiledLayer(maxCol, maxRow, imgMap, CHECKWIDTH, CHECKHEIGHT);
		}
        for (int i = 0; i < backgroundMap.length; i++) 
        {
	        int column = i % maxCol;
	        int row = (i - column) / maxRow;
	        if(flg.equals("map"))
	        	mapLayer.setCell(column, row, backgroundMap[i]);
	        else if(flg.equals("vil"))
	        	villLayer.setCell(column, row, backgroundMap[i]);
	    }
        for (int i = 0; i < barrierMap.length; i++) 
        {
	        int column = i % maxCol;
	        int row = (i - column) / maxRow;
	        if(flg.equals("map"))
	        	mapbrLayer.setCell(column, row, barrierMap[i]);
	        else if(flg.equals("vil"))
	        	villbrLayer.setCell(column, row, barrierMap[i]);
        }
	}
	private void readMap(String mapTag)
	{
		try{
			String strReturn=readFile("/FightChess/map.txt",1024*3,mapTag);
			int back[] = splitStringA(readString(strReturn,"back"),',');
			int data[] = splitStringA(readString(strReturn,"data"),',');
			Image imgMap = loadImage(readString(strReturn,"picMap"));
			setBackLayer("map",data,back,imgMap);
	        /*read battlefield*/
	        int battlefieldNum = Integer.parseInt(readString(strReturn,"battlefieldNum"));
	        battlefield = new int[battlefieldNum][6];
	        for(int i=0;i<battlefieldNum;i++)
	        {
	        	battlefield[i]=splitStringA(readString(strReturn,"battlefield"+i),',');
	        }
	        /*read villagefield*/
	        int villageFieldNum = Integer.parseInt(readString(strReturn,"villageFieldNum"));
	        villagefield = new int[villageFieldNum][5];
	        for(int i=0;i<villageFieldNum;i++)
	        {
	        	villagefield[i] = splitStringA(readString(strReturn,"villageField"+i),',');
	        }
	        int [] heroRC = splitStringA(readString(strReturn,"heroRC"),',');
	        myhero.setBarrierLayer(mapbrLayer);
	        myhero.setPosition(heroRC[1]*CHECKWIDTH,heroRC[0]*CHECKHEIGHT);
	        layer_MOVE();
	        setView(myhero);
		}catch(Exception e){e.printStackTrace();}
	}
	private void readVillageMap(String mapTag)
	{
		String strReturn=readFile("/FightChess/villageMap.txt",1024*2,mapTag);
		int back[] = splitStringA(readString(strReturn,"back"),',');
		int data[] = splitStringA(readString(strReturn,"data"),',');
		Image imgMap = loadImage(readString(strReturn,"picMap"));
		setBackLayer("vil",data,back,imgMap);
		for(int i=0;i<hero.length;i++)
		{
			if(hero[i]==null)break;
			hero[i].setHp(100);
		}
		/*read picture*/
	    Image imgSource = loadImage(readString(strReturn,"picName"));
	    /*read dialog*/
	    int dialogNum = Integer.parseInt(readString(strReturn,"dialogNum"));
	    String [] peodialog = new String[dialogNum];
	    for(int i=0;i<dialogNum;i++)
	    {
	    	peodialog[i] = readString(strReturn,"dialog"+i);
	    }
	    /*read people*/
        int peopleNum = Integer.parseInt(readString(strReturn,"peopleNum"));
	    villager=new Villager[peopleNum];
	    Image imgPeople = null;
	    for(int i=0;i<peopleNum;i++)
	    {
	    	int peopleMsg[]=splitStringA(readString(strReturn,"people"+i),',');
	    	int startX = peopleMsg[1]*CHECKWIDTH;
	    	int startY = peopleMsg[0]*CHECKHEIGHT;
	    	int endX = peopleMsg[3]*CHECKWIDTH;
	    	int endY = peopleMsg[2]*CHECKHEIGHT;
	    	imgPeople = Image.createImage(imgSource,peopleMsg[4]*CHECKWIDTH*2,0,CHECKWIDTH*2,imgSource.getHeight(),Sprite.TRANS_NONE);
	    	villager[i] = createVillager(imgPeople,splitStringB(peodialog[peopleMsg[5]],'/'),
	    			startX,startY,endX,endY);
	    	villager[i].setBarrierLayer(villbrLayer);
			lm.append(villager[i]);
	    }
	    /*read villdoorfield*/
        int doorNum = Integer.parseInt(readString(strReturn,"doorNum"));
        villdoorfield = new int[doorNum][6];
        for(int i=0;i<doorNum;i++)
        {
        	villdoorfield[i] = splitStringA(readString(strReturn,"door"+i),',');
        }
		int posRC[]=splitStringA(readString(strReturn,"myHeroRC"),',');
        myhero.setPosition(posRC[1]*CHECKWIDTH,posRC[0]*CHECKHEIGHT);
        myhero.setBarrierLayer(villbrLayer);
        lm.remove(mapLayer);
		lm.remove(mapbrLayer);
        lm.append(villLayer);
        lm.append(villbrLayer);
        setView(myhero);
        status = STATUS_VILLAGE;
	}
	private void readFightMap(String mapTag)
	{
		try{
			imgSword = loadImage("/FightChess/fight.png");
			String strReturn=readFile("/FightChess/fightMap.txt",1024*4,mapTag);
			int back[] = splitStringA(readString(strReturn,"back"),',');
			int data[] = splitStringA(readString(strReturn,"data"),',');
			checkMsg = new int[maxRow][maxCol];
			for(int i=0;i<data.length;i++)
			{
				int col = i % maxCol;
		        int row = (i - col) / maxRow;
				boolean isBack = false;
				for(int j=0;j<back.length;j++)
				{
					if(data[i]==back[j])
					{
						isBack=true;
						break;
					}
				}
				if(isBack)checkMsg[row][col]=-1;
				else checkMsg[row][col]=-2;
			}
			Image imgMap = loadImage(readString(strReturn,"picMap"));
			fightLayer = new TiledLayer(maxCol, maxRow, imgMap, CHECKWIDTH, CHECKHEIGHT);
	        for (int i = 0; i < data.length; i++) 
	        {
		        int column = i % maxCol;
		        int row = (i - column) / maxRow;
		        fightLayer.setCell(column, row, data[i]);
		    }
	        String heroPos[]=splitStringB(readString(strReturn,"heroPosRC"),'/');
	        for(int i=0;i<hero.length;i++)
	        {
	        	if(hero[i]==null)break;
	        	int posRC[]=splitStringA(heroPos[i],',');
	        	hero[i].setPosRowCol(posRC[0],posRC[1]);
	        	checkMsg[posRC[0]][posRC[1]]=i;
	        	hero[i].setShowHpCount(0);
	        }
		    /*read picture*/
		    Image imgSource = loadImage(readString(strReturn,"picName"));
		    /*read enemy*/
	        int enemyNum = Integer.parseInt(readString(strReturn,"enemyNum"));
		    enemy=new Soldier[enemyNum];
		    Image imgEnemy = null;
		    int direction = Integer.parseInt(readString(strReturn,"direction"));
		    for(int i=0;i<enemyNum;i++)
		    {
		    	int enemyMsg[]=splitStringA(readString(strReturn,"enemy"+i),',');
		    	if(enemyMsg[1]>=0)
		    	{
			    	imgEnemy = Image.createImage(imgSource,enemyMsg[1]*CHECKWIDTH,0,CHECKWIDTH,imgSource.getHeight(),Sprite.TRANS_NONE);
					enemy[i] = createSoldier(imgEnemy,false,enemyMsg[2],i+100);
		    	}
		    	else
		    	{
		    		enemy[i] = createSoldier(imgSource,false,enemyMsg[2],i+100);
		    	}
				enemy[i].setGrade(enemyMsg[0]);
				enemy[i].setFightPower(enemyMsg[3]);
				enemy[i].setDefencePwoer(enemyMsg[4]);
				enemy[i].setPosRowCol(enemyMsg[5],enemyMsg[6]);
				checkMsg[enemyMsg[5]][enemyMsg[6]]=i+100;
				enemy[i].setDirection(direction);
		    }
		    curSoldier=enemy[0];
	        curSoldier.setCheckMsg(checkMsg);
	        status=STATUS_FIGHT_WAIT;
	        /*read endEvent*/
	        eventKey = readString(strReturn,"endEvent");
		    /*read dialog*/
		    ftDlgStart = splitStringB(readString(strReturn,"dialogStart"),'/');
		    ftDlgEnd = splitStringB(readString(strReturn,"dialogEnd"),'/');
		    layer_FIGHT();
		    setView(curSoldier);
		    if(ftDlgStart!=null)
		    {
		    	statusOld = status;
				status = STATUS_DIALOG;
				dialog = ftDlgStart;
				dialogIdx = 0;
		    }
		}catch(Exception e){e.printStackTrace();}
	}
	private void setView(Sprite my)
	{
		viewX = my.getX()-(this.getWidth()/2);
		viewY = my.getY()-(this.getHeight()/2);
		if(viewX<0)viewX=0;
		if(viewX+getWidth()>=mapWidth)
			viewX = mapWidth - getWidth();
		if(viewY<0)viewY = 0;
		if(viewY+getHeight()>=mapHeight)
			viewY = mapHeight - getHeight();
		lm.setViewWindow(viewX,viewY,getWidth(),getHeight());
		lm.paint(g,0,0);
	}
	private People createPeople(Image img)
	{
		int [][]move={{0,1},{4,5},{6,7},{2,3}};
		People my = new People(img,CHECKWIDTH,CHECKHEIGHT,move);
		return my;
	}
	private Villager createVillager(Image img,String dialog[],int startX,int startY,int endX,int endY)
	{
		int [][]move={{0,1},{4,5},{6,7},{2,3}};
		Villager my = new Villager(img,CHECKWIDTH,CHECKHEIGHT,move,dialog,
				startX,startY,endX,endY);
		return my;
	}
	private Soldier createSoldier(Image img,boolean isHero,int fighttype,int index)
	{
		int [][]move;
		int n = img.getWidth()/CHECKWIDTH;
		if(n==2)
			move = new int[][]{{0,1},{4,5},{6,7},{2,3}};
		else
			move = new int[][]{{0},{2},{3},{1}};
		Soldier soldier = new Soldier(img,CHECKWIDTH,CHECKHEIGHT,move,isHero,fighttype,index);
		return soldier;
	}
	public void run()
	{
		long st=0;
		long et=0;
		while(conti)
		{
			st=System.currentTimeMillis();
			g.setColor(255,255,255);
			g.fillRect(0,0,getWidth(),getHeight());
			lm.setViewWindow(viewX,viewY,getWidth(),getHeight());
			lm.paint(g,0,0);
			if(status==STATUS_MOVE)
			{
				input();
				moveView(myhero);
				isInBattleField();
				isInVillageField();
			}
			if(status==STATUS_VILLAGE)
			{
				input();
				villagerAction();
				moveView(myhero);
				isInVilldoorField();
			}
			if(status==STATUS_DIALOG)drawDialog();
			if(status==STATUS_FIGHT_WAIT)waitDo();
			if(status==STATUS_FIGHT_MOVE)
			{
				if(!curSoldier.getIsHero())status = enemyAction.move();
				curSoldier.runAction();
				curSoldier.drawMoveCheck(g,viewX,viewY);
				moveView(curSoldier);
			}
			if(status==STATUS_FIGHT_FIGHT)
			{
				if(!curSoldier.getIsHero())
				{
					status = enemyAction.fight(hero,lm,imgSword);
					layer_FIGHT();
				}
				curSoldier.drawFightCheck(g,viewX,viewY);
			}
			if(status==STATUS_MENU)
			{
				menu.drawMenu();
			}
			if(status==STATUS_FIGHT_WAIT||status==STATUS_FIGHT_MOVE
					||status==STATUS_FIGHT_FIGHT||status==STATUS_MENU)
				drawBloodHp();
			flushGraphics();
			et=System.currentTimeMillis();
			if(et-st<rate)
			{
				try
				{
					Thread.sleep(rate-(et-st));
				}
				catch(Exception exp)
				{
				}
			}
		}
	}
	private void villagerAction()
	{
		for(int i=0;i<villager.length;i++)
		{
			if(villager[i].action(myhero))
			{
				statusOld = status;
				status = STATUS_DIALOG;
				dialog = villager[i].getDialog();
				dialogIdx = 0;
			}
		}
	}
	private void drawDialog()
	{
		g.setColor(255,255,255);
	    g.fillRect(1,getHeight()-DIALOGHEIGHT-1,getWidth()-2,DIALOGHEIGHT);
	    g.setColor(0,136,222);
	    g.drawRect(1,getHeight()-DIALOGHEIGHT-1,getWidth()-2,DIALOGHEIGHT);
	    for(int i=dialogIdx,j=0;i<dialogIdx+DIALOGMAXLINE;i++,j++)
	    {
	    	if(i>=dialog.length)break;
	    	g.drawString(dialog[i],10,getHeight()-DIALOGHEIGHT+j*15,Graphics.TOP|Graphics.LEFT);
	    }
	}
	private boolean isInField(int[]field)
	{
		int x = myhero.getX(),y=myhero.getY(),w=myhero.getWidth(),h=myhero.getHeight();
		if(x>=field[1]*CHECKWIDTH&&x+w<=field[3]*CHECKWIDTH+CHECKWIDTH
		   &&y>=field[0]*CHECKHEIGHT&&y+h<=field[2]*CHECKHEIGHT+CHECKHEIGHT)

⌨️ 快捷键说明

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