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

📄 rolebase.java

📁 恶魔城-晓月圆舞曲 JAVA手機遊戲
💻 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 + -