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

📄 map.java

📁 恶魔城-晓月圆舞曲 JAVA手機遊戲
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
import java.util.Enumeration;

import javax.microedition.lcdui.*;

public class Map {
	byte mapState;
	static final byte MAPBORN = 1;
	static final byte MAP_1 = 2;
	static final byte MAP_2 = 3;
	private Image[] drawImg = new Image[2];
	short[][] DrawPos;
	short[][][] objItem;
	int[][] mapData;
	short[] mapItem;
	private byte imgLT;
	private short screenW,screenH;
	private byte cellW,cellH;
	private static short posX,posY;//偏移X 0~地图宽度-屏幕宽度 Y 0~地图高度-屏幕高度
	private static short bx,by;
	private long flashTime;
	private boolean isFlash;
	/*****构造函数*********************************************/
	public Map()
	{
		imgLT = Graphics.LEFT|Graphics.TOP;
		screenW = 176;
		screenH = 224;
		posX=0;
		posY=42*16-220;
	
	}
	public short getAllWidth()
	{
		return (short)(mapData[0].length*cellW);
	}
	public byte getCeelW()
	{
		return cellW;
	}
	public byte getCeelH()
	{
		return cellH;
	}
	public short getPosX()
	{
		return posX;
	}
	public short getPosY()
	{
		return posY;
	}
	public void setPosX(int offx)
	{
		posX += offx;
		short col = (short)(mapData[0].length*cellW-screenW);
		if(posX<=0)
			posX = 0;
		else if(posX>=col)
			posX = col;
	}
	public void setPosY(int offy)
	{
		posY += offy;
	}
	public void setPosRX(short p)
	{
		posX = p;
	}
	public void setPosRY(short p)
	{
		posY = p;
	}
	private void initEnemy()
	{	
		switch(mapState)
		{
		case MAPBORN:
			CastleCanvas.enemy.removeAllElements();
			break;
		case MAP_1:
			CastleCanvas.enemy.removeAllElements();
			Corpse c = new Corpse();
			CastleCanvas.enemy.addElement(c);
			Corpse c1 = new Corpse();
			CastleCanvas.enemy.addElement(c1);
			BrawnMan b = new BrawnMan();
			b.setRoleX((short)220);
			BrawnMan b1 = new BrawnMan();
			b1.setRoleX((short)339);
			BrawnMan b2 = new BrawnMan();
			b2.setRoleX((short)449);
			BrawnMan b3 = new BrawnMan();
			b3.setRoleX((short)499);
			CastleCanvas.enemy.addElement(b);
			CastleCanvas.enemy.addElement(b1);
			CastleCanvas.enemy.addElement(b2);
			CastleCanvas.enemy.addElement(b3);
			Bat bat = new Bat();
			bat.setRoleX((short)120);
			Bat bat1 = new Bat();
			bat1.setRoleX((short)239);
			Bat bat2 = new Bat();
			bat2.setRoleX((short)319);
			Bat bat3 = new Bat();
			bat3.setRoleX((short)399);
			CastleCanvas.enemy.addElement(bat);
			CastleCanvas.enemy.addElement(bat1);
			CastleCanvas.enemy.addElement(bat2);
			CastleCanvas.enemy.addElement(bat3);
			break;
		case MAP_2:
			CastleCanvas.enemy.removeAllElements();
			break;
		}	
	}
	public void paint(Graphics g)//绘制地图
	{
		
		switch(mapState)
		{
		case MAPBORN:
			bx = posX;
			by = posY;
			drawBackGround(g);
			drawMapCell(g);
			drawBulding(g);
			if(CastleCanvas.soma.roleX>=(32*16-9))
			{
				setPosRY((short)0);
				setPosRX((short)0);
				CastleCanvas.soma.setRoleY((short)144);
				CastleCanvas.soma.setRoleX((short)0);
				setMap(Map.MAP_1);
			}
			break;
		case MAP_1:
			bx = (short)(posX/2);
			by = (short)(posY/2);
			drawBackGround(g);
			drawMapCell(g);
			drawBulding(g);
			byte size = 0;
			Enumeration v = CastleCanvas.enemy.elements();
			while(v.hasMoreElements())
			{
				Enemy e = (Enemy)v.nextElement();
				if(e instanceof Corpse)
				{
					size++;	
				}
			}
			if(size<2)
			{
				if(!isFlash)
				{
					flashTime = System.currentTimeMillis();
					isFlash = true;
				}
				if(System.currentTimeMillis()-flashTime>=1500)
				{
					Corpse c = new Corpse();
					CastleCanvas.enemy.addElement(c);
					isFlash = false;
				}
			}
			if(CastleCanvas.soma.roleX<=0-9)
			{
				setPosRX((short)(32*16-176));
				setPosRY((short)(42*16-220));
				CastleCanvas.soma.setRoleY((short)590);
				CastleCanvas.soma.setRoleX((short)(32*16-18));
				setMap(Map.MAPBORN);
			}
			else if(CastleCanvas.soma.roleX>=(52*16-9))
			{
				setPosRY((short)0);
				setPosRX((short)0);
				CastleCanvas.soma.setRoleY((short)144);
				CastleCanvas.soma.setRoleX((short)0);
				setMap(Map.MAP_2);
			}
			break;
		case MAP_2:
			bx = (short)(posX/2);
			by = (short)(posY/2);
			drawBackGround(g);
			drawMapCell(g);
			drawBulding(g);
			if(CastleCanvas.soma.roleX<=0-9)
			{
				setMap(Map.MAP_1);
				setPosRY((short)0);
				setPosRX((short)(52*16-176));
				CastleCanvas.soma.setRoleY((short)144);
				CastleCanvas.soma.setRoleX((short)(52*16-18));
			}
			break;
		}
	}
	private void drawMapCell(Graphics g)
	{
		byte col = (byte)mapData[0].length;//总列数
		byte row = (byte)mapData.length;//总行数
		byte allW = (byte)(screenW/cellW+1);//绘制屏幕的行数
		byte allH = (byte)(screenH/cellH+1);//绘制屏幕的列数
		byte startCol = (byte)(bx/cellW);//开始列
		startCol = startCol>0?startCol:0;//开始不能小于0
		byte endCol = (byte)((startCol+allW)<col?(startCol+allW):col);//结束列==开始列+屏幕列 && 不能 > 总列
		allW = allW>endCol?endCol:allW;
		startCol = (byte)(endCol-allW);//通过结束列再次修正开始列
		byte startRow = (byte)(by/cellH);//同上
		startRow = startRow>0?startRow:0;//同上
		byte endRow = (byte)((startRow+allH)<row?(startRow+allH):row);//同上
		allH = allH>endRow?endRow:allH;
		startRow = (byte)(endRow-allH);//同上
		for(int j=startRow;j<endRow && j<row;j++)
		{
			for(int k=startCol;k<endCol && k<col;k++)
			{
				short subPos = (short)(mapData[j][k] & 255);
				if(subPos>0)
				{
					short mapid = mapItem[(subPos-1)*2];
					byte index = (byte)DrawPos[mapid][0];
					short offx = DrawPos[mapid][1];
					short offy = DrawPos[mapid][2];
					short width = DrawPos[mapid][3];
					short height = DrawPos[mapid][4];
					short clipX = (short)(k*width-bx);
					short clipY = (short)(j*height-by);
					short offMapX = (short)(clipX-offx);//-offx+clipX
					short offMapY = (short)(clipY-offy);//-offy+clipY
					g.setClip(clipX,clipY,width,height);
					g.drawImage(drawImg[index],offMapX,offMapY,imgLT);
				}

			}
		}
	}
	private void drawBulding(Graphics g)
	{
		byte col = (byte)mapData[0].length;//总列数
		byte row = (byte)mapData.length;//总行数
		byte allW = (byte)(screenW/cellW+1);//绘制屏幕的行数
		byte allH = (byte)(screenH/cellH+1);//绘制屏幕的列数
		byte startCol = (byte)(posX/cellW);//开始列
		startCol = startCol>0?startCol:0;//开始不能小于0
		byte endCol = (byte)((startCol+allW)<col?(startCol+allW):col);//结束列==开始列+屏幕列 && 不能 > 总列
		allW = allW>endCol?endCol:allW;
		startCol = (byte)(endCol-allW);//通过结束列再次修正开始列
		byte startRow = (byte)(posY/cellH);//同上
		startRow = startRow>0?startRow:0;//同上
		byte endRow = (byte)((startRow+allH)<row?(startRow+allH):row);//同上
		allH = allH>endRow?endRow:allH;
		startRow = (byte)(endRow-allH);//同上
		for(int j=startRow;j<endRow && j<row;j++)
		{
			for(int k=startCol;k<endCol && k<col;k++)
			{
				short subPos = (short)(mapData[j][k] >> 8 & 255);
				if(subPos>0)
				{
					short mapid = objItem[subPos-1][0][0];
					byte index = (byte)DrawPos[mapid][0];
					short offx = DrawPos[mapid][1];
					short offy = DrawPos[mapid][2];
					short width = DrawPos[mapid][3];
					short height = DrawPos[mapid][4];
					short clipX = (short)(k*width-posX);
					short clipY = (short)(j*height-posY);;
					short offMapX = (short)(clipX-offx);//-offx+clipX
					short offMapY = (short)(clipY-offy);//-offy+clipY
					g.setClip(clipX,clipY,width,height);
					g.drawImage(drawImg[index],offMapX,offMapY,imgLT);
				}

			}
		}
	}
	private void drawBackGround(Graphics g)
	{
		g.setClip(0,0,CastleCanvas.screenWidth,CastleCanvas.screenHeight);
		g.drawImage(drawImg[1],0,0,CastleCanvas.imgLT);
	}
	public void setMap(int code)
	{
		mapState = (byte)code;
		initEnemy();
		switch(code)
		{
		case MAPBORN:
//			使用到的图片表
			drawImg[0] = CastleCanvas.createImage("tiles_born");//被使用222次
			drawImg[1] = CastleCanvas.createImage("back_born_moon");
//			子图片索引表:{图片,左,上,宽,高,[旋转及镜象]}
			short nDrawPos[][]={
			{0,0,0,16,16},      //索引:[0]
			{0,16,0,16,16},     //索引:[1]
			{0,32,0,16,16},     //索引:[2]
			{0,48,0,16,16},     //索引:[3]
			{0,64,0,16,16},     //索引:[4]
			{0,80,0,16,16},     //索引:[5]
			{0,96,0,16,16},     //索引:[6]
			{0,112,0,16,16},    //索引:[7]
			{0,128,0,16,16},    //索引:[8]
			{0,144,0,16,16},    //索引:[9]
			{0,160,0,16,16},    //索引:[10]
			{0,176,0,16,16},    //索引:[11]
			{0,192,0,16,16},    //索引:[12]
			{0,208,0,16,16},    //索引:[13]
			{0,0,16,16,16},     //索引:[14]
			{0,16,16,16,16},    //索引:[15]
			{0,32,16,16,16},    //索引:[16]
			{0,48,16,16,16},    //索引:[17]
			{0,64,16,16,16},    //索引:[18]
			{0,80,16,16,16},    //索引:[19]
			{0,96,16,16,16},    //索引:[20]
			{0,112,16,16,16},   //索引:[21]
			{0,128,16,16,16},   //索引:[22]
			{0,144,16,16,16},   //索引:[23]
			{0,160,16,16,16},   //索引:[24]
			{0,176,16,16,16},   //索引:[25]
			{0,192,16,16,16},   //索引:[26]
			{0,208,16,16,16},   //索引:[27]

⌨️ 快捷键说明

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