www.pudn.com > 20063622273380188.rar > Game.java


import javax.microedition.lcdui.Canvas; 
import javax.microedition.lcdui.Font; 
import javax.microedition.lcdui.Graphics; 
import javax.microedition.lcdui.Image; 
 
class Game extends Canvas implements Runnable 
{ 
	private Map map; 
	private StartApp s; 
	private Creature me; 
	private ItemManager iMgr; 
	private Menu menu; 
	private Battle battle; 
	private Image buffer,affairImg,face; 
	private Graphics gb,ga;  
	private Font sf,bf; 
	private int width=getWidth(),height=getHeight(),state,enemyCount; 
	private final int MAP=0,MENU=1,BATTLE=2,AFFAIR=3,LOAD=4; 
	private boolean gameOver; 
	 
	Game(StartApp s,Map map,Creature me,ItemManager iMgr,Restore restore) 
	{ 
		this.s=s; 
		this.map=map; 
		this.me=me; 
		this.iMgr=iMgr; 
		bf=Font.getFont(Font.FACE_MONOSPACE,Font.STYLE_BOLD,Font.SIZE_LARGE); 
		sf=Font.getFont(Font.FACE_MONOSPACE,Font.STYLE_ITALIC|Font.STYLE_BOLD,Font.SIZE_SMALL); 
		menu=new Menu(restore); 
		battle=new Battle(me,iMgr); 
		face=(Resourse.readImage(Resourse.FACE)); 
		buffer=Image.createImage(160,160); 
		affairImg=Image.createImage(152,64); 
		gb=buffer.getGraphics(); 
		ga=affairImg.getGraphics(); 
		state=MAP; 
		drawMap(); 
	} 
	 
	protected void showNotify() 
	{ 
		(new Thread(this)).start(); 
	} 
 
	protected void paint(Graphics g)  
	{ 
		g.setColor(0x00000000); 
		g.fillRect(0,0,width,height); 
		g.drawImage(buffer,0,0,0); 
		if(state==AFFAIR) 
			g.drawImage(affairImg,4,92,0); 
	} 
	 
	protected void keyPressed(int keyCode) 
	{ 
		switch(getGameAction(keyCode)) 
		{ 
			case UP: 
				if(state==MAP) 
					map.getMe().up(); 
				else if(state==MENU) 
					menu.up(); 
				else if(state==BATTLE) 
					battle.up(); 
				break; 
			case DOWN: 
				if(state==MAP) 
					map.getMe().down(); 
				else if(state==MENU) 
					menu.down(); 
				else if(state==BATTLE) 
					battle.down(); 
				break; 
			case LEFT: 
				if(state==MAP) 
					map.getMe().left(); 
				else if(state==MENU) 
					menu.left(); 
				else if(state==BATTLE) 
					battle.left(); 
				break; 
			case RIGHT: 
				if(state==MAP) 
					map.getMe().right(); 
				else if(state==MENU) 
					menu.right(); 
				else if(state==BATTLE) 
					battle.down(); 
				break; 
			case FIRE: 
				if(state==MAP) 
				{ 
					state=MENU; 
					menu.drawMenu(gb); 
				} 
				else if(state==MENU) 
					menu.select(); 
				else if(state==BATTLE) 
					battle.select(); 
				break; 
			default: 
				if(state==MENU) 
				{ 
					if(menu.back()) 
					{ 
						state=MAP; 
						drawMap(); 
					} 
					else 
						menu.drawMenu(gb); 
				} 
				if(state==BATTLE) 
				{ 
					battle.back(); 
				} 
				break; 
		} 
	} 
	 
	protected void keyReleased(int keyCode) 
	{ 
		switch(getGameAction(keyCode)) 
		{ 
			case UP: 
				if(state==MAP) 
					map.getMe().stop(); 
				break; 
			case DOWN: 
				if(state==MAP) 
					map.getMe().stop(); 
				break; 
			case LEFT: 
				if(state==MAP) 
					map.getMe().stop(); 
				break; 
			case RIGHT: 
				if(state==MAP) 
					map.getMe().stop(); 
				break; 
			default: 
				break; 
		} 
	} 
	 
	private void drawLoad() 
	{ 
		gb.setFont(bf); 
		gb.setColor(0x00000000); 
		gb.fillRect(0,0,width,height); 
		gb.setColor(0x000000FF); 
		gb.drawString("请稍候 . . .",47,57,0); 
		gb.setColor(0x006666FF); 
		gb.drawString("请稍候 . . .",48,58,0); 
		gb.setColor(0x00BBBBFF); 
		gb.drawString("请稍候 . . .",49,59,0); 
		gb.setColor(0x00FFFFFF); 
		gb.drawString("请稍候 . . .",50,60,0);	 
		gb.setFont(null); 
	} 
	 
	private void drawMap() 
	{ 
		map.getLayer(Map.REACHABLE).paint(gb); 
		map.getLayer(Map.UNREACHABLE).paint(gb); 
		map.getMe().paint(gb); 
		gb.drawImage(face,2,5,0);   //18*20 
		gb.setFont(sf); 
		gb.setColor(0x00000000); 
		gb.drawString("HP",23,-1,0); 
		gb.drawString("MP",23,11,0); 
		gb.drawString(me.hp+"/"+me.maxhp,43,-1,0); 
		gb.drawString(me.mp+"/"+me.maxmp,43,12,0); 
		gb.setColor(0x00DDDDDD); 
		gb.drawRect(22,10,41,4); 
		gb.drawRect(22,20,41,4); 
		gb.drawString("HP",22,-2,0); 
		gb.drawString("MP",22,12,0); 
		gb.drawString(me.hp+"/"+me.maxhp,42,-2,0); 
		gb.drawString(me.mp+"/"+me.maxmp,42,11,0); 
		gb.setFont(null); 
		gb.setColor(0x00000000); 
		gb.drawString(map.getMapName(),109,-1,0); 
		gb.drawString(map.getMapName(),111,1,0); 
		gb.setColor(0x00FFFFFF); 
		gb.drawString(map.getMapName(),110,0,0); 
		gb.setColor(0x00FF2222); 
		gb.fillRect(23,11,me.hp*40/me.maxhp,3); 
		gb.setColor(0x002222FF); 
		gb.fillRect(23,21,me.mp*40/me.maxmp,3); 
	} 
	 
	void drawAffair(String s,boolean dialogue) 
	{ 
		for(int i=0;i<16;i++) 
		{ 
			ga.setColor(0x00000000+i*16); 
			ga.fillRect(0,i*4,152,4); 
		} 
		ga.setColor(0x00FFFFFF); 
		ga.drawRect(0,0,151,63); 
		if(dialogue) 
		{ 
			ga.drawString(s,5,4,0); 
		} 
		else 
			ga.drawString(s,5,4,0); 
	} 
	 
	void in() 
	{ 
		for(int i=0;i72?15:125),20+15*i,22,15); 
					g.setColor(0x00999999); 
					g.drawRect((map.getMe().getX()>72?15:125),20+15*i,22,15); 
					g.drawString(selection[i],(map.getMe().getX()>72?15:125),20+15*i,0); 
				} 
				g.setColor(0x00FFFFFF); 
				g.drawRect((map.getMe().getX()>72?15:125),20+15*select,22,15); 
				g.drawString(selection[select],(map.getMe().getX()>72?15:125),20+15*select,0); 
			} 
			else if(onMenu==STATE) 
			{ 
				g.setColor(0x00000000); 
				g.fillRoundRect(40,20,80,120,8,8); 
				g.setColor(0x00FFFFFF); 
				g.drawRoundRect(40,20,80,120,8,8); 
				g.drawString("名字 "+me.name,45,25,0); 
				g.drawString("等级 "+me.level,45,40,0); 
				g.drawString("经验 "+me.exp,45,55,0); 
				g.drawString("HP "+me.hp+"/"+me.maxhp,45,70,0); 
				g.drawString("MP "+me.mp+"/"+me.maxmp,45,85,0); 
				g.drawString("力量 "+me.str,45,100,0); 
				g.drawString("敏捷 "+me.dex,85,100,0); 
				g.drawString("速度 "+me.spd,45,115,0); 
				g.drawString("魔力 "+me.mag,85,115,0);	 
			} 
			else if(onMenu==ABILITY) 
			{ 
				for(int i=0;i<14;i++) 
				{ 
					g.setColor(0x00000020+i*12); 
					g.fillRect(20,10+i*10,120,10); 
				} 
				g.setColor(0x00FFFFFF); 
				g.drawRect(20,10,120,120); 
				g.drawRect(20,130,120,20); 
				for(int i=0;iaSelect) 
					g.drawString(me.abilityDes[aSelect],25,132,0); 
			} 
			else if(onMenu==ITEMS) 
			{ 
				g.setColor(0x00000000); 
				g.fillRect(5,10,25,25); 
				g.fillRect(36,5,119,50); 
				g.fillRect(5,60,150,80); 
				g.fillRect(5,145,60,14); 
				g.fillRect(68,145,87,14); 
				g.drawImage(iMgr.getItem(iSelect+iScoll*2).getImage(),5,10,0); 
				g.setColor(0x00FFFFFF); 
				g.drawRect(5,10,25,25); 
				g.drawRect(36,5,119,50); 
				g.drawRect(5,60,150,80); 
				g.drawRect(5,145,60,14); 
				g.drawRect(68,145,87,14); 
				g.setClip(5,61,150,78); 
				g.drawImage(itemBox,6,61-iScoll*15,0); 
				g.setClip(0,0,160,160); 
				g.drawString("攻击  "+me.attack,40,5,0); 
				g.drawString("防御  "+me.defence,40,17,0); 
				g.drawString("命中  "+me.miss,40,29,0); 
				g.drawString("速度  "+me.speed,40,41,0); 
				g.drawString("武器 "+me.items[0].getName(),95,5,0); 
				g.drawString("防具 "+me.items[1].getName(),95,17,0); 
				g.drawString("鞋子 "+me.items[2].getName(),95,29,0); 
				g.drawString("佩饰 "+me.items[3].getName(),95,41,0); 
				g.drawString("金钱 "+iMgr.getMoney()+"元",8,145,0); 
				g.drawString(iMgr.getItem(iSelect+iScoll*2).getDescription(),70,145,0); 
				if(iSelected) 
				{ 
					for(int i=0;i<3;i++) 
					{ 
						g.setColor(0x00000000); 
						g.fillRect(65,50+15*i,30,15); 
						g.setColor(0x00999999); 
						g.drawRect(65,50+15*i,30,15); 
						g.drawString(station[i],70,50+15*i,0); 
					} 
					g.setColor(0x00FFFFFF); 
					g.drawRect(65,50+15*iUse,30,15); 
					g.drawString(station[iUse],70,50+15*iUse,0); 
				} 
				else 
					g.drawRect(8+iSelect%2*72,67+iSelect/2*15,65,13); 
			} 
			 
		} 
		 
		void drawBox() 
		{ 
			gi.setColor(0x00000000); 
			gi.fillRect(0,0,150,130); 
			gi.setColor(0x00FFFFFF); 
			for(int i=0;i<8;i++) 
			{ 
				for(int j=0;j<2;j++) 
				{ 
					gi.drawImage(iMgr.getItem(i*2+j).getKImg(),5+j*75,5+i*15,0); 
					gi.drawString(iMgr.getItem(i*2+j).getName(),20+j*75,5+i*15,0); 
				} 
			} 
		} 
		 
		boolean isDialogue() 
		{ 
			return isDialogue; 
		} 
		 
		void up() 
		{ 
			if(onMenu==MAIN) 
				select=(select==0?0:select-1); 
			else if(onMenu==ITEMS) 
			{ 
				if(iSelected) 
					iUse=(iUse==0?0:iUse-1); 
				else 
				{ 
					iSelect=(iSelect>1?(iSelect-2):iSelect); 
					if(iSelect<2) 
					{ 
						if(iScoll==0) 
							iScoll=0; 
						else 
							iScoll-=1; 
					} 
				} 
			} 
			else if(onMenu==ABILITY) 
				aSelect=(aSelect==0?0:aSelect-1); 
		} 
		 
		void down() 
		{ 
			if(onMenu==MAIN) 
				select=(select==6?6:select+1); 
			else if(onMenu==ITEMS) 
			{ 
				if(iSelected) 
					iUse=(iUse==2?2:iUse+1); 
				else 
				{ 
					iSelect=(iSelect<8?(iSelect+2):iSelect); 
					if(iSelect>7) 
					{ 
						if(iScoll==3) 
							iScoll=3; 
						else 
							iScoll+=1; 
					} 
				} 
			} 
			else if(onMenu==ABILITY) 
				aSelect=(aSelect==me.ability.length-1?me.ability.length-1:aSelect+1); 
		} 
		 
		void left() 
		{ 
			if(onMenu==ITEMS) 
			{ 
				if(!iSelected) 
					iSelect=(iSelect==0?iSelect:iSelect-1); 
			} 
		} 
		 
		void right() 
		{ 
			if(onMenu==ITEMS) 
			{ 
				if(!iSelected) 
					iSelect=(iSelect==9?iSelect:iSelect+1); 
			} 
		} 
		 
		void select() 
		{ 
			if(onMenu==MAIN) 
			{ 
				switch(select) 
				{ 
					case 0: 
						onMenu=STATE; 
						break; 
					case 1: 
						onMenu=ABILITY; 
						break; 
					case 2: 
						onMenu=ITEMS; 
						drawBox(); 
						break; 
					case 3: 
						pick(); 
						isDialogue=false; 
						state=AFFAIR; 
						break; 
					case 4: 
						dialogue(); 
						isDialogue=true; 
						state=AFFAIR; 
						break; 
					case 5: 
						restore.save(me,map,iMgr); 
						break; 
					case 6: 
						drawLoad(); 
						repaint(); 
						state=LOAD; 
						Title title=new Title(s); 
						System.gc(); 
						s.display.setCurrent(title); 
						break; 
					default: 
						break; 
				} 
			} 
			else if(onMenu==ITEMS) 
			{ 
				if(iSelected) 
				{ 
					if(iUse==0) 
						iMgr.equip(iSelect+iScoll,me); 
					else if(iUse==1) 
						iMgr.use(iSelect+iScoll,me); 
					else if(iUse==2) 
						iMgr.del(iSelect+iScoll); 
					me.refresh(); 
					back(); 
					drawBox(); 
				} 
				else 
					iSelected=true; 
			} 
			else if(onMenu==ABILITY) 
			{ 
				me.useAbility(aSelect); 
			} 
			else 
			{ 
				back(); 
			} 
		} 
		 
		void pick() 
		{ 
			int x=-1,y=-1; 
			Other others[]=map.getOthers(); 
			if(map.getMe().getFace()==0) 
			{ 
				x=(map.getMe().getX()+8)/16; 
				y=(map.getMe().getY()+25+3)/16; 
			} 
			else if(map.getMe().getFace()==2) 
			{ 
				x=(map.getMe().getX()+8)/16; 
				y=(map.getMe().getY()+16-3)/16; 
			} 
			else if(map.getMe().getFace()==1) 
			{ 
				x=(map.getMe().getX()+16+3)/16; 
				y=(map.getMe().getY()+25)/16; 
			} 
			else if(map.getMe().getFace()==3) 
			{ 
				x=(map.getMe().getX()-3)/16; 
				y=(map.getMe().getY()+25)/16; 
			} 
			affair="什么也没有."; 
			for(int i=0;i100) 
								affair="耶,发现了"+others[i].getItem().getPow()+"元."; 
							else 
								affair="发了,发了,找到了"+others[i].getItem().getName()+"."; 
							iMgr.add(others[i].getItem()); 
							map.getLayer(Map.UNREACHABLE).setCell(others[i].getX(),others[i].getY(),11); 
							me.mapState[map.getMapId()]+=1; 
						} 
					} 
					else if(others[i].getKind()==Other.Notice) 
					{ 
						affair=others[i].getNotice(); 
					} 
					i=others.length; 
				} 
			} 
		} 
		 
		void dialogue() 
		{ 
			isDialogue=true; 
			affair="前面连鬼也没一个."; 
		} 
		 
		String getAffair() 
		{ 
			return affair; 
		} 
		 
		boolean back() 
		{ 
			if(onMenu==MAIN) 
				return true; 
			else  
			{ 
				if(iSelected) 
				{ 
					iSelected=false; 
					onMenu=ITEMS; 
				} 
				else 
					onMenu=MAIN; 
				return false; 
			} 
		} 
	} 
}