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

📄 herosprite.java

📁 一个征途的rpg小游戏
💻 JAVA
字号:
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.Random;

import javax.microedition.lcdui.*;
import javax.microedition.rms.RecordStore;
/*
 * 创建日期 2005-9-5
 *
 * TODO 要更改此生成的文件的模板,请转至
 * 窗口 - 首选项 - Java - 代码样式 - 代码模板
 */

/**
 * @author 莫紫东
 * Download by http://www.codefans.net
 * TODO 要更改此生成的类型注释的模板,请转至
 * 窗口 - 首选项 - Java - 代码样式 - 代码模板
 */
public class HeroSprite extends ASprite{

	/**
	 * 
	 */
	public final int LISTENER_LEFT=4;
	public final int LISTENER_RIGHT=32;
	public final int LISTENER_UP=2;
	public final int LISTENER_DOWN=64;
	public final int LISTENER_FIRE=256;
	
	public int dir,hp,maxhp,lv,exp,nextexp,prevexp,itemlv,gold,at,df,mapdir=0;
	public String MyItem;	
	public boolean isAlive,isAttach,isStop,isBattle,iisBattle,iiisBattle,isStopb,isPause=false;//是否生存以及是否攻击两个判定量
	//Sprite HSprite=new Sprite(HeroImage,60,61);
	
	public int x,y,luX,luY,ruX,ruY,ldX,ldY,rdX,rdY,stopTime=5,time=0;
	public Random random=new Random();
	public int numEmpty=0;
	
	//代表各个方向的常量
	public final int DIR_LEFT=2;
	public final int DIR_DOWN=1;
	public final int DIR_RIGHT=4;
	public final int DIR_UP=3;
	public final int DIR_LU=5;
	public final int DIR_RU=6;
	public final int DIR_LD=7;
	public final int DIR_RD=8;	
	public String DataName;
	public char itemcode[]={'0','0','0','0','0','0','0','0','0','0','0','0','0'};
	
	
	//各个方向的图象序列数组
	private int up_seq[]={1,2,3,4,5,6,7,8};
	private int lu_seq[]={14,15,16,17,18,19,20,21};
	private int ru_seq[]={40,41,42,43,44,45,46,47};
	private int ld_seq[]={66,67,68,69,70,71,72,73};
	private int rd_seq[]={79,80,81,82,83,84,85,86};
	private int left_seq[]={92,93,94,95,96,97,98,99};
	private int down_seq[]={53,54,55,56,57,58,59,60};
	private int right_seq[]={27,28,29,30,31,32,33,34};
	public int itemat[]={0,30,70,120,200};
	public int itemdf[]={0,20,60,110,190};
	
	private int up[]={0};
	private int lu[]={13};
	private int ru[]={39};
	private int ld[]={65};
	private int rd[]={78};
	private int left[]={91};
	private int down[]={52};
	private int right[]={26};
	//打斗时候的图象序列数组
	public int downb_seq[]={9,10,11,12};
	public int upb_seq[]={35,36,37,38};
	public int leftb_seq[]={48,49,50,51};
	public int rightb_seq[]={61,62,63,64};
	private int lub_seq[]={87,88,89,90};
	private int rub_seq[]={74,75,76,77};
	private int ldb_seq[]={22,23,24,25};
	private int rdb_seq[]={100,101,102,103};	
	public boolean[][] isWalkable;
	
	//构造函数
	public HeroSprite(Image hImage,int height,int width){
		super(hImage,height,width);			
		x=180;
		y=180;
		luX=(int)(x/16)+1;
		luY=(int)(y/16);
		lv=1;
	  	maxhp=160+(lv-1)*40;
	  	itemlv=0;
	  	gold=0;
	  	MyItem="000000000000";
		/*for(int i=0;i<12;i++){
			itemcode[i]='0';
		}*/
		//itemcode={'0','0','0','0','0','0','0','0','0','0','0','0','0'};
	  	exp=210;
		hp=maxhp;
		at=30;
		df=20;
		prevexp=lv*lv*60-(lv-1)*(lv-1)*60+150;
		nextexp=prevexp+(lv-1)*(lv-1)*60-(lv-2)*(lv-2)*60+150;
		System.out.print("已装载英雄类");
		this.setFrameSequence(down);
		isAlive=true;
		System.out.print("英雄类装载完毕");
	}
	
	public byte[] chgTorms(boolean isFirst) throws IOException{
		ByteArrayOutputStream baos=new ByteArrayOutputStream();
		DataOutputStream dos=new DataOutputStream(baos);
		if(itemcode!=null){
			MyItem=String.valueOf(itemcode);
		}
		dos.writeUTF(String.valueOf(lv));//将具体数据写入流
		dos.writeUTF(String.valueOf(itemlv));
		dos.writeUTF(String.valueOf(gold));
		dos.writeUTF(String.valueOf(MyItem));
		dos.writeUTF(String.valueOf(exp));
		if(isFirst==false){//如果不是第一次读入数据则计算攻防
			at=itemat[itemlv]+(lv-1)*8+30;
			df=itemdf[itemlv]+(lv-1)*10+20;
		}
		baos.close();
		dos.close();
		numEmpty=0;
		if(isFirst==false){
			for(int i=0;i<itemcode.length;i++){//如果不是第一次读入数据则计算空格数
				if(itemcode[i]=='0'){
					numEmpty++;
				}
			}
		}
		return baos.toByteArray();
	}
	
	public void doMonster(int myhp,int deadlv,RecordStore rs,int recordid){
		this.hp=myhp;
		if(lv<=6){
			prevexp=lv*lv*60-(lv-1)*(lv-1)*60+150;//经验值公式
			nextexp=prevexp+(lv-1)*(lv-1)*60-(lv-2)*(lv-2)*60+150;
		}else{
			prevexp=lv*(lv-5)*(lv-5)-40*(lv-4)*(lv-4)+150;
			nextexp=prevexp+50*(lv+1)*(lv-4)*(lv-4)-40*(lv-3)*(lv-3)+150;
		}
		if(deadlv!=0){
			exp=exp+deadlv*15+random.nextInt()%5;//怪物死亡时候等级和经验值的换算公式,nextexp下一等级需要的经验,deadlv被杀死怪物的等级
			if(exp>=nextexp){//目前设定的最高等级为11级
				if(lv<12){
					lv++;
				}
				at=itemat[itemlv]+(lv-1)*8+30;
				df=itemdf[itemlv]+(lv-1)*10+20;
				maxhp=160+(lv-1)*40;
				hp=maxhp;
			}
			try{
				rs.setRecord(recordid,chgTorms(false),0,chgTorms(false).length);
			}catch(Exception e){System.out.println(e);}
			isBattle=false;
		}
	}
	
	private void getNowHanglie(){//获得主角的行列数值
		luX=(int)(x/16)+1;
		luY=(int)(y/16);
		ruX=(int)((x+40)/16)+1;
		ruY=luY;
		ldX=luX;
		ldY=(int)((y+40)/16);
		rdX=ldX;
		rdY=ldY;
	}
	
	public void chgMapbool(boolean[][] newbool){		
		this.isWalkable=newbool;
	}
	
	public void doMove(int keyState){
		//System.out.println(ldX+","+ldY);		
		if(hp<=0){
			this.isAlive=false;
		}
		if(this.isAlive){
		   getNowHanglie();
		   if(isPause==false){
			switch(keyState){
				case LISTENER_UP:
					if(dir!=DIR_UP){//如果按下UP键时之前的状态不是朝UP的话,则改变状态
						dir=DIR_UP;
						this.setFrameSequence(up_seq);
					}
					if(isWalkable[ldX][ldY-1] && isWalkable[rdX][rdY-1]){//对下一步的判断
						if(isBattle==true){//按下UP键时候如果是打斗状态则转化为UP奔跑帧
							this.setFrameSequence(up_seq);
							isBattle=false;
						}
						if(isStop==true){//如果是停止状态也转化为UP奔跑帧
							this.setFrameSequence(up_seq);
							isStop=false;
						}
						y=y-5;//坐标变化
						this.nextFrame();//帧变化
					}						
					break;
				case LISTENER_DOWN:
					if(dir!=DIR_DOWN){
						dir=DIR_DOWN;
						this.setFrameSequence(down_seq);
					}
					if(isBattle==true){
						this.setFrameSequence(down_seq);
						isBattle=false;
					}
					if(isStop==true){
						this.setFrameSequence(down_seq);
						isStop=false;
					}
					if(isWalkable[ldX][ldY+1] && isWalkable[rdX][rdY+1]){
						y=y+5;
						this.nextFrame();
					}
					break;
				case LISTENER_LEFT:
					if(dir!=DIR_LEFT){
						dir=DIR_LEFT;
						this.setFrameSequence(left_seq);
					}
					if(isBattle==true){
						this.setFrameSequence(left_seq);
						isBattle=false;
					}
					if(isStop==true){
						this.setFrameSequence(left_seq);
						isStop=false;
					}
					if(isWalkable[ldX-1][ldY]){
						x=x-5;
						this.nextFrame();
					}
					break;
				case LISTENER_RIGHT:
					if(dir!=DIR_RIGHT){
						dir=DIR_RIGHT;
						this.setFrameSequence(right_seq);
					}
					if(isBattle==true){
						this.setFrameSequence(right_seq);
						isBattle=false;
					}
					if(isStop==true){
						this.setFrameSequence(right_seq);
						isStop=false;
					}
					if(isWalkable[rdX+1][rdY]){
						x=x+5;
						this.nextFrame();
					}
					break;
				case LISTENER_LEFT+LISTENER_UP:
					if(dir!=DIR_LU){
						dir=DIR_LU;
						this.setFrameSequence(lu_seq);
					}
					if(isBattle==true){
						this.setFrameSequence(lu_seq);
						isBattle=false;
					}
					if(isStop==true){
						this.setFrameSequence(lu_seq);
						isStop=false;
					}
					if(isWalkable[ldX-1][ldY] && isWalkable[ldX][ldY-1] && isWalkable[rdX][rdY-1]){	
						x=x-3;
						y=y-3;
						this.nextFrame();
					}
					break;
				case LISTENER_RIGHT+LISTENER_UP:
					if(dir!=DIR_RU){
						dir=DIR_RU;
						this.setFrameSequence(ru_seq);
					}
					if(isBattle==true){
						this.setFrameSequence(ru_seq);
						isBattle=false;
					}
					if(isStop==true){
						this.setFrameSequence(ru_seq);
						isStop=false;
					}
					if(isWalkable[ldX][ldY-1] && isWalkable[rdX][rdY-1] && isWalkable[rdX+1][rdY]){	
						x=x+3;
						y=y-3;
						this.nextFrame();
					}						
					break;
				case LISTENER_LEFT+LISTENER_DOWN:
					if(dir!=DIR_LD){
						dir=DIR_LD;
						this.setFrameSequence(ld_seq);
					}
					if(isBattle==true){
						this.setFrameSequence(ld_seq);
						isBattle=false;
					}
					if(isStop==true){
						this.setFrameSequence(ld_seq);
						isStop=false;
					}
					if(isWalkable[ldX-1][ldY] && isWalkable[ldX][ldY+1] && isWalkable[rdX][rdY+1]){
						x=x-3;
						y=y+3;						
						this.nextFrame();
					}
					break;
				case LISTENER_RIGHT+LISTENER_DOWN:
					if(dir!=DIR_RD){
						dir=DIR_RD;
						this.setFrameSequence(rd_seq);
					}
					if(isBattle==true){
						this.setFrameSequence(rd_seq);
						isBattle=false;
					}
					if(isStop==true){
						this.setFrameSequence(rd_seq);
						isStop=false;
					}
					if(isWalkable[rdX+1][rdY] && isWalkable[ldX][ldY+1] && isWalkable[rdX][rdY+1]){
						x=x+3;
						y=y+3;
						this.nextFrame();
					}
					break;
				case 0:
					if(isBattle==false){
						isStop=true;
						switch(dir){
							case DIR_DOWN:						
								this.setFrameSequence(down);
								break;
							case DIR_LEFT:	
								this.setFrameSequence(left);
								break;
							case DIR_UP:	
								this.setFrameSequence(up);
								break;
							case DIR_RIGHT:	
								this.setFrameSequence(right);
								break;	
							case DIR_LU:
								this.setFrameSequence(lu);												
								break;
							case DIR_RU:
								this.setFrameSequence(ru);												
								break;
							case DIR_RD:
								this.setFrameSequence(rd);												
								break; 
							case DIR_LD:							
								this.setFrameSequence(ld);										
								break;	
						}
					}
					break;
				case LISTENER_FIRE:
					if(mapdir==1){
					switch(dir){
					case 1:	
						if(isBattle==false){
							this.setFrameSequence(downb_seq);	
						}													
						break;
					case 2:
						if(isBattle==false){
							this.setFrameSequence(leftb_seq);
						}							
						break;
					case 3:
						if(isBattle==false){
							this.setFrameSequence(upb_seq);
						}							
						break;
					case 4:
						if(isBattle==false){
							this.setFrameSequence(rightb_seq);								
						}							
						break;
					case DIR_LU:
						if(isBattle==false){
							this.setFrameSequence(lub_seq);						
						}					
						break;
					case DIR_LD:
						if(isBattle==false){
							this.setFrameSequence(ldb_seq);						
						}					
						break;				
					case DIR_RU:
						if(isBattle==false){
							this.setFrameSequence(rub_seq);
						}					
						break;
					case DIR_RD:
						if(isBattle==false){
							this.setFrameSequence(rdb_seq);
						}					
						break;				
					}						
					isBattle=true;
					break;
					}
				}
			if(isBattle==true){	//如果是打斗状态
				if(this.getFrame()==2){//如果是打斗状态的第二帧
					iiisBattle=true;//打中状态置于真
				}else{
					iiisBattle=false;
				}				
				this.nextFrame();				
			}
			if(iiisBattle && isBattle){
				iisBattle=true;
			}else{
				iisBattle=false;
			}
			dx=x;
			dy=y;			
		   }
		}else{
			if(this.exp>150){
				this.exp=this.exp-150;
			}else this.exp=0;
		}
	}	
}

⌨️ 快捷键说明

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