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

📄 game.java

📁 一个RPG游戏的DEMO.用到了脚本技术。图片也有封装过。
💻 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;i<map.entrance.length;i++)
		{	
			if(map.entrance[i][0]==(map.getMe().getX()+8)/16&&map.entrance[i][1]==(map.getMe().getY()+16)/16)
			{
				drawLoad();
				repaint();
				state=LOAD;
				map=map.toMap(map.entrance[i][2],me.mapState[map.entrance[i][2]],map.entrance[i][3]*16,map.entrance[i][4]*16);
				drawMap();
				state=MAP;
			}
		}
	}

	
	public void run() 
	{
		while(!gameOver)
		{
			try{
				switch(state)
				{
					case MAP:
						if(map.hasEnemy())
							enemyCount+=1;
						map.getMe().go();
						in();
						drawMap();
						if(enemyCount==100)
						{
							map.getMe().stop();
							state=BATTLE;
							enemyCount=0;
							battle.init(map.getMapId());
						}
						Thread.sleep(50);
						break;
					case LOAD:
						Thread.sleep(1500);
						break;
					case MENU:
						drawMap();
						menu.drawMenu(gb);
						Thread.sleep(100);
						break;
					case AFFAIR:
						drawMap();
						drawAffair(menu.getAffair(),menu.isDialogue());
						repaint();
						Thread.sleep(2000);
						state=MAP;
						drawMap();
						break;
					case BATTLE:
						battle.drawBattle(gb);
						repaint();
						if(battle.isEnd())
						{
							if(battle.isFail())
							{
								drawLoad();
								repaint();
								gameOver=true;
								Thread.sleep(1000);
								Title title=new Title(s);
								System.gc();
								s.display.setCurrent(title);
							}
							else
								state=MAP;	
						}
						Thread.sleep(50);
						break;
					default:
						break;
				}
			}catch (InterruptedException e) {
				e.printStackTrace();
			}
			repaint();
		}	
	}
	
	class Menu
	{
		private Restore restore;
		private final String selection[]={"状态","技能","道具","调查","对话","保存","退出"},station[]={"装备","使用","丢弃"};
		private final int MAIN=0,STATE=1,ABILITY=2,ITEMS=3;
		private int select,onMenu,iSelect,iScoll,iUse,aSelect;
		private String affair;
		private boolean isDialogue,changed,iSelected;
		private Image itemBox;
		private Graphics gi;
		
		Menu(Restore restore)
		{
			this.restore=restore;
			select=0;
			onMenu=0;
			itemBox=Image.createImage(148,128);
			gi=itemBox.getGraphics();
		}
		
		void drawMenu(Graphics g)
		{
			if(onMenu==MAIN)
			{
				for(int i=0;i<selection.length;i++)
				{
					g.setColor(0x00000000);
					g.fillRect((map.getMe().getX()>72?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;i<me.ability.length;i++)
					g.drawString(me.ability[i],35,15+i*15,0);
				g.drawRect(30,15+aSelect*15,100,15);
				if(me.abilityLevel>aSelect)
					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;i<others.length;i++)
			{
				if(x==others[i].getX()&&y==others[i].getY())
				{
					if(others[i].getKind()==Other.Bed)
					{
						affair="休息,休息一下.";
						me.hp=me.maxhp;
						me.mp=me.maxmp;
					}
					else if(others[i].getKind()==Other.Box)
					{
						if(others[i].getItem().getID()==0)
							affair="kuso,空的.";
						else
						{
							if(others[i].getItem().getID()>100)
								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;
			}
		}
	}
}

⌨️ 快捷键说明

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