📄 rolebase.java
字号:
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.Sprite;
public abstract class RoleBase {
byte roleState; //当前状态
byte lastState;//判断上次状态状态
protected short x,y; //角色在屏幕中的位置
protected short roleX,roleY;//角色在map上的位置
protected short mapX,mapY; //地图坐标
protected boolean dir; //控制方向 TRUE为右 FALSE为左
protected byte speed; //移动速度
short offx,offy;//子图偏移
short imgW,imgH; //图片宽 和 高
byte ox,oy; //人物在地图中的偏移
byte mirx,miry;//人物在镜象中的偏移
protected byte frame;
protected byte maxFrame;
protected byte stateSpeed;
protected byte maxSpeed;
protected byte[] actionFrame;
private boolean rebool;
byte vY;//跳起的速度
byte curY;//跳跃的偏移s
// protected Hashtable angleValue;//用HASH来模拟COS SIN
// public void loadAngleValue()
// {
// angleValue = new Hashtable();
// angleValue.put(String.valueOf(0),new Integer(0));
// angleValue.put(String.valueOf(15),new Integer(25881));
// angleValue.put(String.valueOf(30),new Integer(50000));
// angleValue.put(String.valueOf(45),new Integer(70710));
// angleValue.put(String.valueOf(60),new Integer(86603));
// angleValue.put(String.valueOf(75),new Integer(96592));
// angleValue.put(String.valueOf(90),new Integer(100000));
// }
public void move()
{
if(dir)//控制方向 TRUE为右 FALSE为左
{
roleX += speed;
mapX = CastleCanvas.map.getPosX();
x = (short)(roleX-mapX);
if(x>=CastleCanvas.screenWidth)
x=CastleCanvas.screenWidth;
if(isTouchBack())
roleX -= speed;
scrollLeft();
}
else
{
roleX -= speed;
mapX = CastleCanvas.map.getPosX();
x = (short)(roleX-mapX);
if(x<=-25)
x=-25;
if(isTouchBack())
roleX += speed;
scrollRight();
}
}
protected void scrollLeft()
{//改改改。。。。
if(x>=(CastleCanvas.screenWidth/2) &&
(CastleCanvas.map.getPosX()+
CastleCanvas.screenWidth)<CastleCanvas.map.getAllWidth())
{
CastleCanvas.map.setPosX(speed);
x=CastleCanvas.screenWidth/2;
}
}
protected void scrollRight()
{
if(x<=(CastleCanvas.screenWidth/2) && roleX>(CastleCanvas.screenWidth/2))
{
CastleCanvas.map.setPosX(-speed);
x=CastleCanvas.screenWidth/2;
}
}
public boolean originJump()
{
curY = (byte)(18-vY);
vY += 2;
for(byte i=0;i<curY;i++)
{
if(isTouchTop())
{
curY = 0;
return true;
}
roleY--;
}
y = (short)(roleY-CastleCanvas.map.getPosY());
if(curY<=0)
{
curY = 0;
return true;
}
return false;
}
public boolean drop()
{
for(byte i=0;i<speed+2;i++)
{
if(isTouchGroud())
{
return true;
}
roleY ++;
mapY = CastleCanvas.map.getPosY();
y = (short)(roleY-mapY);
}
return false;
}
public boolean attack()
{
if(dir)//控制方向 TRUE为右 FALSE为左
{
}
else
{
}
return false;
}
public boolean isTouchBack()
{
byte mapW = CastleCanvas.map.getCeelW();
byte mapH = CastleCanvas.map.getCeelH();
byte startCol = (byte)((roleX-16)/mapW)>0?(byte)((roleX-16)/mapW):0;//检测范围
byte endCol = (byte)((roleX+48)/mapW); //
byte startRow = (byte)((roleY+3)/mapH)>0? (byte)((roleY+3)/mapH):0; //
byte endRow = (byte)((roleY+31)/mapH); //
byte col = (byte)CastleCanvas.map.mapData[0].length;//总列数
byte row = (byte)CastleCanvas.map.mapData.length;//总行数
mapX = CastleCanvas.map.getPosX();
mapY = CastleCanvas.map.getPosY();
for(byte i=startRow;i<=endRow && i<row;i++)
{
for(byte j=startCol;j<endCol && j<col;j++)
{
// g.setCole(0x000000);
// short clipX = (short)(j*mapW-mapX);
// short clipY = (short)(i*mapH-mapY);
// g.setClip(clipX,clipY,16,16);
// g.fillRect(clipX,clipY,16,16);
short subPos = (short)(CastleCanvas.map.mapData[i][j] >> 8 & 255);
if(subPos>0 && !skipID(subPos))
{
short mapid = CastleCanvas.map.objItem[subPos-1][0][0];
byte width = (byte)CastleCanvas.map.DrawPos[mapid][3];
byte height = (byte)CastleCanvas.map.DrawPos[mapid][4];
short cX = (short)(j*mapW-mapX);
short cY = (short)(i*mapH-mapY);
if(hit(cX,cY,width,height))
return true;
}
}
}
return false;
}
public boolean isTouchGroud()
{
byte mapW = CastleCanvas.map.getCeelW();
byte mapH = CastleCanvas.map.getCeelH();
byte startCol = (byte)((roleX-16)/mapW)>0?(byte)((roleX-16)/mapW):0;//检测范围
byte endCol = (byte)((roleX+28)/mapW); //
byte startRow = (byte)((roleY-16)/mapH)>0?(byte)((roleY-16)/mapH):0; //
byte endRow = (byte)((roleY+51)/mapH); //
byte col = (byte)CastleCanvas.map.mapData[0].length;//总列数
byte row = (byte)CastleCanvas.map.mapData.length;//总行数
mapX = CastleCanvas.map.getPosX();
mapY = CastleCanvas.map.getPosY();
for(byte i=startRow;i<=endRow && i<row;i++)
{
for(byte j=startCol;j<endCol && j<col;j++)
{
// g.setColor(0xFF000);
// short clipX = (short)(j*mapW-mapX);
// short clipY = (short)(i*mapH-mapY);
// g.setClip(clipX,clipY,16,16);
// g.fillRect(clipX,clipY,16,16);
short subPos = (short)(CastleCanvas.map.mapData[i][j] >> 8 & 255);
if(subPos>0 && !skipID(subPos))
{
short mapid = CastleCanvas.map.objItem[subPos-1][0][0];
byte width = (byte)CastleCanvas.map.DrawPos[mapid][3];
byte height = (byte)CastleCanvas.map.DrawPos[mapid][4];
short cX = (short)(j*mapW-mapX);
short cY = (short)(i*mapH-mapY);
if(hitGroup(cX,cY,width,height))
return true;
}
}
}
return false;
}
public boolean isTouchTop()
{
byte mapW = CastleCanvas.map.getCeelW();
byte mapH = CastleCanvas.map.getCeelH();
byte startCol = (byte)((roleX-16)/mapW)>0?(byte)((roleX-16)/mapW):0;//检测范围
byte endCol = (byte)((roleX+28)/mapW); //
byte startRow = (byte)((roleY-16)/mapH)>0?(byte)((roleY-16)/mapH):0; //
byte endRow = (byte)((roleY+51)/mapH); //
byte col = (byte)CastleCanvas.map.mapData[0].length;//总列数
byte row = (byte)CastleCanvas.map.mapData.length;//总行数
mapX = CastleCanvas.map.getPosX();
mapY = CastleCanvas.map.getPosY();
for(byte i=startRow;i<=endRow && i<row;i++)
{
for(byte j=startCol;j<endCol && j<col;j++)
{
// g.setColor(0xFF000);
// short clipX = (short)(j*mapW-mapX);
// short clipY = (short)(i*mapH-mapY);
// g.setClip(clipX,clipY,16,16);
// g.fillRect(clipX,clipY,16,16);
short subPos = (short)(CastleCanvas.map.mapData[i][j] >> 8 & 255);
if(subPos>0 && !skipJumpID(subPos))
{
short mapid = CastleCanvas.map.objItem[subPos-1][0][0];
byte width = (byte)CastleCanvas.map.DrawPos[mapid][3];
byte height = (byte)CastleCanvas.map.DrawPos[mapid][4];
short cX = (short)(j*mapW-mapX);
short cY = (short)(i*mapH-mapY);
if(hitTop(cX,cY,width,height))
return true;
}
}
}
return false;
}
private boolean skipID(short pos)
{
byte id1[] = new byte[]{
9,10,19,20,21,22,23,24,25,26,27,28,30,29,
};
switch(CastleCanvas.map.mapState)
{
case Map.MAPBORN:
return false;
case Map.MAP_1:
for(byte i=0;i<id1.length;i++)
{
if(pos==id1[i])
{
return false;
}
}
break;
case Map.MAP_2:
for(byte i=0;i<id1.length;i++)
{
if(pos==id1[i])
{
return false;
}
}
break;
}
return true;
}
private boolean skipJumpID(short pos)
{
byte id1[] = new byte[]{
9,10,19,20,21,22,23,24,25,26,27,28,30,29,
};
switch(CastleCanvas.map.mapState)
{
case Map.MAPBORN:
return false;
case Map.MAP_1:
for(byte i=0;i<id1.length;i++)
{
if(pos==id1[i])
{
return false;
}
}
break;
case Map.MAP_2:
for(byte i=0;i<id1.length;i++)
{
if(pos==id1[i])
{
return false;
}
}
break;
}
return true;
}
private boolean hit(short mx,short my,byte mw,byte mh) //碰撞
{
//实际碰撞范围 角色坐标+遍移动+人物高 宽
//人物实际高度35 取值30
if(dir)
{
if(x+ox+imgW-3>=mx && mx+mw>=x+ox-3 && y+oy+imgH-2>=my && my+mh>=y+oy)
return true;
return false;
}
else
{
if(x+mirx+imgW-3>=mx && mx+mw>=x+mirx-3 && y+miry+imgH-2>=my && my+mh>=y+miry)
return true;
return false;
}
}
private boolean hitGroup(short mx,short my,byte mw,byte mh)
{
// 实际碰撞范围 角色坐标+遍移动+人物高 宽
//人物实际高度35 取值脚部1
if(dir)
{
if(x+ox+imgW-2>=mx && mx+mw>=x+ox+2 && y+oy+imgH>=my && my+mh>=y+oy+imgH-1)
return true;
return false;
}
else
{
if(x+mirx+imgW-2>=mx && mx+mw>=x+mirx+2 && y+miry+imgH>=my && my+mh>=y+miry+imgH-1)
return true;
return false;
}
}
private boolean hitTop(short mx,short my,byte mw,byte mh)
{
// 实际碰撞范围 角色坐标+遍移动+人物高 宽
//人物实际高度35 取值头部4
if(dir)
{
if(x+ox+imgW-4>=mx && mx+mw>=x+ox+4 && y+oy+2>=my && my+mh>=y+oy-2)
return true;
return false;
}
else
{
if(x+mirx+imgW-4>=mx && mx+mw>=x+mirx+4 && y+miry+2>=my && my+mh>=y+miry-2)
return true;
return false;
}
}
public boolean hit(RoleBase r)
{
// g.setColor(0xFF2233);
// g.setClip(x,y,imgW,imgH);
// g.fillRect(0,0,176,220);
// g.setColor(0x11FF22);
// g.setClip(r.x,r.y,r.imgW,r.imgH);
// g.fillRect(0,0,176,220);
if(dir)
{
if(x+ox+imgW>=r.x+r.ox && r.x+17+r.ox>=x+ox && y+oy+imgH-4>=r.y+r.oy && r.y+r.imgH-4+r.oy>=y+oy)
return true;
return false;
}
else
{
if(x+mirx+imgW-10>=r.x+r.mirx && r.x+17+r.mirx>=x+mirx && y+miry+imgH-4>=r.y+r.miry && r.y+r.imgH-4+r.miry>=y+miry)
return true;
return false;
}
}
public void relaseMagic()
{
if(dir)//控制方向 TRUE为右 FALSE为左
{
}
else
{
}
}
public void setDir(boolean nDir)
{
dir = nDir;
}
public void setRoleX(short x)
{
this.roleX = x;
this.x = (short)(roleX-CastleCanvas.map.getPosX());
}
public void setRoleY(short y)
{
this.roleY = y;
this.y = (short)(roleY-CastleCanvas.map.getPosY());
}
protected void changState(byte state)
{
stateSpeed = 0;
frame = 0;
lastState = roleState;
roleState = state;
maxFrame = (byte)actionFrame[state];
}
protected void changWaitState(byte state)
{
if(isOneTimes())
{
stateSpeed = 0;
lastState = roleState;
roleState = state;
frame = 0;
maxFrame = (byte)actionFrame[state];
}
}
protected void changWaitState(byte state,byte f)
{
if(isOneTimes())
{
stateSpeed = 0;
lastState = roleState;
roleState = state;
frame = f;
maxFrame = (byte)actionFrame[state];
}
}
protected boolean isOneTimes()
{
if(rebool)
{
rebool = false;
return true;
}
rebool = (frame==(maxFrame-1) && stateSpeed==(maxSpeed-1));//控制能达到最后一帧,并正确返回BOOL值
return false;
}
/*******************定义基础模式,提高重用性*************************/
public void tickArgment(short[][] action,byte max) //设置修正的参数
{
maxSpeed = max;
offx = action[frame][0];
offy = action[frame][1];
imgW = (short)(action[frame][2]-offx);
imgH = (short)(action[frame][3]-offy);
ox = (byte)(action[frame][4]);
oy = (byte)(action[frame][5]);
stateSpeed++;
stateSpeed %= maxSpeed;
if(stateSpeed == 0)
{
frame++;
frame %= maxFrame;
}
}
public void tickArgment(short[][] action) //设置修正的参数
{
maxSpeed = 2;
offx = action[frame][0];
offy = action[frame][1];
imgW = (short)(action[frame][2]-offx);
imgH = (short)(action[frame][3]-offy);
ox = (byte)(action[frame][4]);
oy = (byte)(action[frame][5]);
stateSpeed++;
stateSpeed %= maxSpeed;
if(stateSpeed == 0)
{
frame++;
frame %= maxFrame;
}
}
public void tickArgmentMirror(short[][] action,byte max) //设置修正的参数
{
maxSpeed = max;
offx = action[frame][0];
offy = action[frame][1];
imgW = (short)(action[frame][2]-offx);
imgH = (short)(action[frame][3]-offy);
mirx = (byte)(action[frame][6]);
miry = (byte)(action[frame][7]);
stateSpeed++;
stateSpeed %= maxSpeed;
if(stateSpeed == 0)
{
frame++;
frame %= maxFrame;
}
}
public void tickArgmentMirror(short[][] action) //设置修正的参数
{
maxSpeed = 2;
offx = action[frame][0];
offy = action[frame][1];
imgW = (short)(action[frame][2]-offx);
imgH = (short)(action[frame][3]-offy);
mirx = (byte)(action[frame][6]);
miry = (byte)(action[frame][7]);
stateSpeed++;
stateSpeed %= maxSpeed;
if(stateSpeed == 0)
{
frame++;
frame %= maxFrame;
}
}
public void drawRightRole(Graphics g,Image img)
{
g.setClip(x+ox,y+oy,imgW,imgH);
g.drawImage(img,x-offx+ox,y-offy+oy,CastleCanvas.imgLT);
}
public void drawLeftRole(Graphics g,Image img)
{
g.setClip(x+mirx,y+miry,imgW,imgH);
g.drawRegion(img,offx,offy,imgW,imgH,Sprite.TRANS_MIRROR,x+mirx,y+miry,CastleCanvas.imgLT);
}
protected abstract void dead();
protected abstract boolean isDead();
/*******************上面定义基础模式,提高重用性*************************/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -