📄 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;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 + -