📄 map.java
字号:
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 + -