📄 e070f72a48cf001216b0addf11818cf9
字号:
/*游戏场景类
包括如下场景:
场景一:城郊
场景二:荒岛
场景三:女儿国
场景四:勇士国
场景五:真假蓬莱
场景六:军营*/
import java.io.InputStream;
import java.util.Random;
import java.util.Timer;
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
public class MGC extends Canvas implements CommandListener
{
/*角色变量*/
static int l,m,le,ex,sp,d,gold,x,y,lm,mm,dr;//l,m为当前的血和气,lm,mm为当前的血气的最大值,le为人物等级,ex为经验,sp为剩余技能点,d为基础物理攻击力,dr为人物的方向标志
int D;//角色的物理总攻击力,包括基础攻击力和加成攻击力
int[] s,tn;//s[]为技能等级,tn[]为任务物品的收集数量
int addMd,addPd;//武器附加的魔法攻击和物理攻击
int stealB;//偷血量
int addPdP;//基础攻击力提升比例
int curnpc;//当前对话的NPC序号
int speed=8;//行走的速度
int count;//通用变量,用于各种情况下的计数
int[] weapon;//武器
static int[] startx,starty;//初生地的坐标
int curweapon;//当前使用的武器
int curEl;//当前战斗中的怪物等级
boolean task,task2;//任务的触发标志,task为前四个任务,task2为最后一个任务
boolean boat;//判断是否已经购买过船
boolean t;//隐身标志
boolean tran;//附身标志
boolean walk;//是否持续移动
boolean[] dlg;//和NPC的对话标志
boolean win,die;//战斗胜利和阵亡的标志
String tip;//提示信息
String dlgm;
int dlgn;
static Image poc;//主角的图片
/*游戏控制变量*/
static int x0,y0,w,h,sl,i,j;//sl为场景号,i,j为菜单选项编号,i为一级菜单,j为二级菜单,x0,y0为屏幕左上角相对大场景的坐标
int killCount;//竞技场的竞技计数
static int[] W,H;//场景的长和宽(Tile为单位)
int[] sc;//地图索引数组
int[] spn;//精灵的数量
static int[] screenStart=new int[]{16,29,33,47,68,77,83};//场景图片编号的起点
int sx,sy;//技能图片的坐标
int sn;//对话的序号(兼战斗中获得的经验值)
SP[] spi;//战斗场景中的精灵对象
SP[] NPC;//非战斗场景中的精灵对象
int an;//攻击顺序
int nn;//当前与主角对话的NPC序号(兼战斗中获得的金钱)
boolean pm,am,tm;//属性菜单,战斗菜单和传送菜单的弹出标志
boolean atm;//战斗场景
boolean me;//对话控制开关
boolean change;//场景切换开关
boolean gameMenu;//游戏菜单开关
boolean playOn;
boolean showW;
static boolean running;
String[] dlgM;//对话的内容
static Image screenPic;//场景大图
static Image NPCPic;//精灵大图
InputStream is;//输入流
static Image[] p;
static Image[] screen;//场景图片
static Image[] spic;//技能图片
static Image atpic;//战斗场景中的图片
static Image spic0;
Image dlgpic;//对话的图片
static Graphics g1;
Random rd;
Timer ti;
TI mo,atw,atc,changeMap,playsound;//mo控制人物移动,atw控制技能效果,atc控制攻击顺序切换,changeMap控制场景切换
Command choose,gmenu,con;
public MGC()
{
running=true;
w=176;
h=182;
choose=new Command("",Command.OK,0);
gmenu=new Command("菜单",Command.SCREEN,0);
choose=new Command("选择",Command.OK,0);
con=new Command("继续",Command.OK,0);
//addCommand(choose);
//addCommand(gmenu);
setCommandListener(this);
}
/*初始化*/
void ge()
{
addCommand(gmenu);
i=0;
le=1;
ex=0;
sp=1;
d=7;
gold=100;
lm=71;
l=71;
m=40;
mm=40;
dr=6;
addMd=0;
addPd=0;
stealB=0;
addPdP=0;
curweapon=9;
D=d+addPd+addPdP*d/100;
weapon=new int[]{9,9,9,9,9,9};
s=new int[]{0,0,0,0,0,0,0,0,0,1,0};
spn=new int[]{60,28,153,76,16,2,0};
startx=new int[]{464,144,32,192,32,128,16};
starty=new int[]{448,432,224,320,144,176,112};
dlg=new boolean[]{false,false,false,false,false,false,false};
tn=new int[]{0,0,0,0,0};
W=new int[]{32,32,32,24,24,16,16};
H=new int[]{32,32,32,24,24,16,16};
if(sl==0)
{
if(dlg[0])
{
x=startx[0];
y=starty[0];
message(2);
}
else
{
x=384;
y=304;
}
}
else
{
x=startx[sl];
y=starty[sl];
}
if(x>=w/2)
{
if(x<=W[sl]*16-w/2)
x0=x-w/2;
else
x0=W[sl]*16-w;
}
else
x0=0;
if(y>=h/2)
{
if(y<=H[sl]*16-h/2)
y0=y-h/2;
else
y0=H[sl]*16-h;
}
else
y0=0;
task=false;
task2=false;
boat=false;
showW=false;
die=false;
win=false;
walk=false;
t=false;
tran=false;
playOn=true;
pm=false;
am=false;
atm=false;
change=false;
gameMenu=false;
me=false;
tip=null;
dlgm=null;
spi=new SP[8];
ti=new Timer();
rd=new Random(1000);
changeMap=null;
is=getClass().getResourceAsStream("/Screen"+ts(sl)+".txt");
rS(is);//读取指定的地图索引
if(spn[sl]!=0)
{
is=getClass().getResourceAsStream("/sp"+ts(sl)+".txt");
rSp(is);//读取精灵索引
}
if(sl==0&&!dlg[0])
message(2);
}
/*读取精灵索引*/
void rSp(InputStream s)
{
int i,c,temp;
i=0;
c=0;
temp=0;
NPC=null;
NPC=new SP[spn[sl]];
try
{
while((c=s.read())!=-1)
{
switch(c)
{
case '*':
NPC[i++]=new SP(
temp/10000,
temp%10000/100,
temp%100);
temp=0;
break;
default:
temp=10*temp+c-48;
break;
}
}
}
catch(java.io.IOException ioe)
{
}
is=null;
}
/*读取相应场景的地图*/
void rS(InputStream s)
{
int x,y,c,temp;
x=0;
y=0;
temp=0;
sc=null;
sc=new int[W[sl]*H[sl]];
try
{
while((c=s.read())!=-1)
{
switch(c)
{
case '\n':
y++;
x=0;
temp=0;
break;
case '*':
sc[y*W[sl]+x++]=temp;
temp=0;
break;
default:
temp=10*temp+c-48;
break;
}
}
}
catch(java.io.IOException ioe)
{
}
if(sl==3)//在勇士国随机生成两个宝箱所在地,和宝箱周围的怪物
{
x=rR(96)+72;
if(sc[x]/100==1)
{
sc[x]=sc[x]%100+9800;
{
if(sc[x+1]/100==1)
sc[x+1]=sc[x+1]%100+1800;
if(sc[x-1]/100==1)
sc[x-1]=sc[x-1]%100+1900;
if(sc[x-24]/100==1)
sc[x-24]=sc[x-24]%100+1600;
if(sc[x+24]/100==1)
sc[x+24]=sc[x+24]%100+1700;
}
}
x=rR(96)+264;
if(sc[x]/100==1)
{
sc[x]=sc[x]%100+9800;
{
if(sc[x+1]/100==1)
sc[x+1]=sc[x+1]%100+1800;
if(sc[x-1]/100==1)
sc[x-1]=sc[x-1]%100+1900;
if(sc[x-24]/100==1)
sc[x-24]=sc[x-24]%100+1600;
if(sc[x+24]/100==1)
sc[x+24]=sc[x+24]%100+1700;
}
}
}
else
if(sl==6)//在竞技场随机生成六到八级的怪物
{
for(int ii=0;ii<256;ii++)
{
if(sc[ii]/100==1)
sc[ii]=sc[ii]%100+(rR(100)<70?(rR(3)+16)*100:100);
}
}
is=null;
}
public void keyRepeated(int keyCode)
{
int act=getGameAction(keyCode);
if(act==Canvas.UP||act==Canvas.DOWN||act==Canvas.LEFT||act==Canvas.RIGHT)
keyPressed(keyCode);
}
public void keyPressed(int keyCode)
{
if(!change)
{
int act=getGameAction(keyCode);
switch(act)
{
case GAME_B://属性菜单弹出
if(!win&&!die&&!change&&!me&&!gameMenu&&mo==null)
{
pm=!pm;
if(pm)
removeCommand(gmenu);
else
if(!atm)
addCommand(gmenu);
i=0;
j=0;
if(!atm)
repaint(0,0,160,128);
else
repaint();
}
break;
case UP://上键
if(gameMenu)//对游戏菜单的操作
{
i=i-1>=0?i-1:0;
repaint();
}
else
if(!pm&&!tm&&!win&&!die&&!me&&tip==null&&!atm)//人物运动
{
if(mo==null)
{
if(dr/3!=2)
{
dr=6;
repaint();
}
else
stm();
}
}
else
if(pm)//对属性菜单的操作
{
j=0;
i=i-1>=0?i-1:3;
repaint(0,0,160,128);
}
else
if(tm)//对传送菜单的操作
{
if(dlg[2])
i=i-1>=0?i-1:5;
else
if(task)
i=i-1>=0?i-1:4;
else
i=i-1>=0?i-1:3;
repaint(0,0,128,128);
}
else
if(am)//对战斗菜单的操作
{
i=i-4>=0?i-4:i+8;
repaint();
}
else
if(me&&tip==null)//对对话菜单的操作
{
if(curnpc==6||curnpc==4||curnpc==5)
i=i-1>=0?i-1:0;
repaint();
}
break;
case DOWN://下键
if(gameMenu)
{
i=i+1<=4?i+1:4;
repaint();
}
else
if(!pm&&!atm&&!tm&&!win&&!die&&!me&&tip==null)
{
if(mo==null)
{
if(dr/3!=1)
{
dr=3;
repaint();
}
else
stm();
}
}
else
if(pm)
{
i=i+1<4?i+1:0;
j=0;
repaint(0,0,160,128);
}
else
if(tm)
{
if(dlg[2])
i=i+1<6?i+1:0;
else
if(task)
i=i+1<5?i+1:0;
else
i=i+1<4?i+1:0;
repaint();
}
else
if(am)
{
i=i+4<12?i+4:i-8;
repaint();
}
else
if(me&&tip==null)//对话时候的菜单选项
{
if(curnpc==6||curnpc==4)
i=i+1<=1?i+1:0;
else
if(curnpc==5)
{
switch(sn)
{
case 1:
i=i+1<=2?i+1:0;
break;
case 2:
i=i+1<=1?i+1:0;
break;
default:
break;
}
}
repaint();
}
break;
case LEFT://左键
if(pm)
{
if(i==1)
j=j-1>=0?j-1:10;
else
if(i==3&&j>0)
for(int ii=j-1;ii>=0;ii--)
{
if(weapon[ii]!=9)
{
j=ii;
break;
}
}
repaint(0,0,160,128);
}
else
if(!pm&&!atm&&!tm&&!win&&!die&&!me&&tip==null&&!gameMenu)
{
if(mo==null)
{
if(dr/3!=0)
{
dr=0;
repaint();
}
else
stm();
}
}
else
if(am)
{
i=i-1>=0?i-1:11;
repaint();
}
else
if(me&&tip==null)
{
if(curnpc==6||curnpc==4||curnpc==5)
i=i-1>=0?i-1:0;
repaint();
}
break;
case RIGHT://右键
if(pm)
{
if(i==1)
{
j=j+1<11?j+1:0;
repaint(0,0,160,128);
}
else
if(i==3)
{
for(int ii=j+1;ii<6;ii++)
{
if(weapon[ii]!=9)
{
j=ii;
break;
}
}
repaint(0,0,160,128);
}
}
else
if(!pm&&!tm&&!atm&&!win&&!die&&!me&&tip==null&&!gameMenu)
{
if(mo==null)
{
if(dr/3!=3)
{
dr=9;
repaint();
}
else
stm();
}
}
else
if(am)
{
i=i+1<=11?i+1:0;
repaint();
}
else
if(me&&tip==null)//对话时候的菜单选项
{
if(curnpc==6||curnpc==4)
i=i+1<=1?i+1:0;
else
if(curnpc==5)
{
switch(sn)
{
case 1:
i=i+1<=2?i+1:0;
break;
case 2:
i=i+1<=1?i+1:0;
break;
default:
break;
}
}
repaint();
}
break;
case FIRE:
FIRE();
break;
default:
switch(keyCode)
{
case KEY_NUM1://1键取消
// if(am&&!pm)
// {
// am=false;
// an=4;
// repaint();
// }
// else
if(pm&&i==3)
{
gold+=(weapon[j]%3+1)*(weapon[j]%3+1)*100;
if(curweapon==weapon[j])
curweapon=9;
weapon[j]=9;
addPd=0;
addMd=0;
addPdP=0;
D=d;
repaint(0,0,160,128);
}
break;
default:
break;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -