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

📄 j2me的rpg游戏核心代码.txt

📁 J2ME RPG 游戏核心代码 需要学习的可以下载看看 比较详细
💻 TXT
📖 第 1 页 / 共 5 页
字号:
/*游戏场景类
包括如下场景:
场景一:城郊
场景二:荒岛
场景三:女儿国
场景四:勇士国
场景五:真假蓬莱
场景六:军营*/
//逻辑处理
import javax.microedition.lcdui.*;
import java.io.*;
import java.lang.*;
import java.util.Timer;
import java.util.TimerTask;
import java.util.Random;
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]];
int i = 0;
try
{
while((c=s.read())!=-1)
{
switch(c)
{
case ' ':
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 keyReleased(int keyCode)
{
int act=getGameAction(keyCode);
if(act==Canvas.UP||act==Canvas.DOWN||act==Canvas.LEFT||act==Canvas.RIGHT)
{
walk=false;
}
}
/*构建一个从0到n-1范围的随机数*/
public int rR(int n) 
{
int r =rd.nextInt();
if(r<0)
r=-r;
r=r%n;
return r;
}
/*移动方式选择,移动可能性判断和移动计时器触发*/
public void stm()
{
System.out.println("startmove");
if(c()>10&&c()<=20)//怪物出现的Tile
{
fi(chn(),c()-10);//调出战斗场景
if(!atm)//没有怪出现
{
dr++;
if(dr%3==0)
dr-=2;
switch(dr)
{
//case 7://向上1
//y-=speed;
//if(y0>0&&y-y0<=64)
//y0-=speed;
//repaint();
//break;
//case 4://向下1
//y+=speed;
//if(y0<128&&y-y0>=48)
//y0+=speed;
//repaint();
//break;
//case 1://向左1
//x-=speed;
//if(x0>0&&x-x0<=64)
//x0-=speed;
//repaint();
//break;
//case 10://向右1
//x+=speed;
//if(x0<24*16&&x-x0>=64)
//x0+=speed;
//repaint();
//break;
//default://静止状态
//repaint();
//break;
case 7://向上1
y-=speed;
if(y0>0&&y-y0<=h/2)
y0-=speed;
repaint();
break;
case 4://向下1
y+=speed;
if(y0<(H[sl]-(h+15)/16)*16&&y-y0>=h/2)
y0+=speed;
repaint();
break;
case 1://向左1
x-=speed;
if(x0>0&&x-x0<=w/2)
x0-=speed;
repaint();
break;
case 10://向右1
x+=speed;
if(x0<(W[sl]-w/16)*16&&x-x0>=w/2)
x0+=speed;
repaint();
break;
default://静止状态
repaint();
break;
}
walk=true;
mo=new TI(this,7);
ti.schedule(mo,0,300);
}
else
{
switch(dr/3)
{

case 0://向左
x-=16;
break;
case 1://向下
y+=16;
break;
case 2://向上
y-=16;
break;
case 3://向右
x+=16;
break;
}
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>=64)
{
if(y<=H[sl]*16-h/2)
y0=y-h/2;
else
y0=H[sl]*16-h;
}
else
y0=0;
}
}
else
if(c()>1&&c()<10)//对话NPC出现的Tile
{
if(c()==4)
{
if(tn[0]==10&&tn[1]==5&&tn[2]==10&&tn[3]==5)
message(c());
}
else
message(c());
}
else
if(c()==99)//场景出入口
{
if(boat)
{
tm=true;
i=0;
}
else
tip="请去找船工买船";
repaint();
}
else
if(c()==98)//宝箱
{
int ii=rR(2*sl+1)*50;
gold+=ii*(2*sl+1);
tip=ii>0 "获得"+ts(ii*(2*sl+1))+"两银子":"一无所获";
switch(dr/3)//将宝箱所在Tile设为平地
{
case 1://向下
if(y<H[sl]*16-32)
sc[((y+31)/16+1)*W[sl]+x/16]=sc[(y+31)/16*W[sl]+x/16];
break;
case 0://向左
if(x!=0)
sc[(y+31)/16*W[sl]+x/16-1]=sc[(y+31)/16*W[sl]+x/16];
break;
case 3://向右
if(x!=W[sl]*16-16)
sc[(y+31)/16*W[sl]+x/16+1]=sc[(y+31)/16*W[sl]+x/16];
break;
case 2://向上
if(y!=0)
sc[((y+31)/16-1)*W[sl]+x/16]=sc[(y+31)/16*W[sl]+x/16];
break;
}
repaint();
}
else
if(c()==97)//大Boss
{
if(tn[0]==10&&tn[1]==5&&tn[2]==10&&tn[3]==5&&tn[4]==20)
fi(1,15);
else
{
tm=true;
repaint();
}
}
else
{
walk=true;
mo=new TI(this,7);
ti.schedule(mo,0,150);
}
}
/*对话控制*/
public void message(int ii)
{
i=0;
dlgM=null;
me=true;
curnpc=ii-2;
switch(ii)
{
case 2://母亲
dlgM=new String[5];
dlgM[0]="景鸿:孩儿此去不知何时才能回,母亲要保重身体.";
dlgM[1]="母亲:我儿一路上要多加小心";
dlgM[2]="景鸿:孩儿记住了";
dlgM[3]="母亲:......(呜咽)";
dlgM[4]="母亲:大事为重,不用挂念我.";
break;
case 3://皇榜
dlgM=new String[1];
dlgM[0]="由于最近山贼横行,朝廷悬赏缉拿,抓住山贼头领将有重金奖赏。";
break;
case 4://长须仙人
dlgM=new String[3];
dlgM[0]="长须仙人:你从很远的地方来的,是为了找徐承志与骆承志二人吧!";
dlgM[1]="景鸿:是,求仙人指点。";
dlgM[2]="长须仙人:好,随我来";
break;
case 5://徐承志与骆承志
dlgM=new String[8];
dlgM[0]="徐承志:现在有一件很重要的事需要你的帮忙。";
dlgM[1]="景鸿:将军请说!";
dlgM[2]="徐承志:马上就到冬季,将士们需要100件去寒之物。";
dlgM[3]="景鸿:这个好办,我来的路上经过一个荒岛,上面野兽众多,找点皮毛还不容易。";
dlgM[4]="徐承志:这样便好,那就托付与你了,这些银两你带上。";
dlgM[5]="获得银两10000";
dlgM[6]="徐承志:早去早回。";
dlgM[7]="徐承志:太好了,有了这些虎皮,整个冬天都不怕了,过了这个冬天就是我们讨伐武后,复我河山之时!";
break;
case 6://竞技官
dlgM=new String[1];
dlgM[0]="你希望参加这个勇士的竞技吗 需要收取350两费用,竞技必须是杀死所有野兽才会停止 参加 离开";
break;
case 7://多九公
dlgM=new String[4];
dlgM[0]="最近老觉得身体不好,本想自己去收集些药引,可是力不从心了,希望你可以帮助我,我将会给你一会报酬";
dlgM[1]="  分配技能     任务      离开";
dlgM[2]="重新分配技能点需要10000两,交纳费用后你可以将技能点重新分配  马上分配    下次再说";
dlgM[3]="在荒岛收集10棵鹤灵草,5颗狼牙,在女儿国收集10棵米云香,在蓬莱收集5个雪岩";
break;
case 8://船工
dlgM=new String[1];
dlgM[0]="在京城你找不到比我这更好的船了!船只价格是600两,你赶紧买吧! 购买 离开";
break;
}
if(!dlg[ii-2])//如果没有和某个NPC对完话,则每次对话从第一句开始。
sn=0;
else
if(ii<5)
sn=dlgM.length-1;
else
if(ii==5)
{
if(tn[4]==20)
sn=7;
else
sn=6;
}
else
sn=0;
createDlgPic(dlgM[sn],8);
repaint();
}


--------------------------------------------------------------------------------

回复: 


我找的辛苦``贴的辛苦``不过的确米什么研究价值~!~ ~!~ 我刚刚把这个RPG游戏重新调试过了1边 终于调过去了 等下再继续贴


--------------------------------------------------------------------------------

回复: 


/*战斗菜单绘制*/
if(am)
{
System.out.println("tmd3");
g.setFont(Loading.myfont);
g.setColor(0,255,0);
g.fillRect(29,47,140,75);
g.setColor(0,0,255);
g.drawRect(29,47,140,75);
g.drawString("火球",31,49,0);
g.drawString("落星",65,49,0);
g.drawString("风残",99,49,0);
g.drawString("召狼",133,49,0);
g.drawString("召熊",31,71,0);
g.drawString("召龙",65,71,0);
g.drawString("隐身",99,71,0);
g.drawString("遁走",133,71,0);
g.drawString("附身",31,93,0);
g.drawString("回血",65,93,0);
g.drawString("回气",99,93,0);
g.drawString("攻击",133,93,0);
if(i<11)
{
if(s[i]==0)
g.setColor(255,0,0);
else
g.setColor(0,0,255);
}
else
g.setColor(0,0,255);
g.drawRect(i%4*34+30,i/4*22+48,34,18);
}
/*属性菜单绘制*/
if(pm)
{
g.setFont(Loading.myfont);
g.setColor(104,135,196);
g.fillRect(0,0,160,128);
g.setColor(0,0,0);
g.drawRect(0,0,40,127);
g.drawRect(40,0,119,127);
g.drawString("属性",5,10,0);
g.drawString("技能",5,37,0);
g.drawString("任务",5,64,0);
g.drawString("装备",5,91,0);
switch(i)
{
case 0://属性显示
g.drawString("血:"+ts(l)+"/"+ts(lm),41,5,0);
g.drawString("气:"+ts(m)+"/"+ts(mm),41,25,0);
g.drawString("经验值: ",41,45,0);
g.drawString(ts(ex)+"/"+ts(m(le+1)),41,65,0);
g.drawString("攻击:"+ts(d)+"+"+ts(addPd+d*addPdP/100),41,85,0);
g.drawString("当前等级:"+ts(le),41,105,0);
break;
case 1://技能显示
if(j<4)
{
g.drawString("火球:"+(s[0]>0 "等级"+ts(s[0]):"未修炼"),41,5,0);
g.drawString("落星:"+(s[1]>0 "等级"+ts(s[1]):"未修炼"),41,27,0);
g.drawString("风残:"+(s[2]>0 "等级"+ts(s[2]):"未修炼"),41,49,0);
g.drawString("召狼:"+(s[3]>0 "等级"+ts(s[3]):"未修炼"),41,71,0);
}
else
if(j<8)
{
g.drawString("召熊:"+(s[4]>0 "等级"+ts(s[4]):"未修炼"),41,5,0); 
g.drawString("召龙:"+(s[5]>0 "等级"+ts(s[5]):"未修炼"),41,27,0); 
g.drawString("隐身:"+(s[6]>0 "等级"+ts(s[6]):"未修炼"),41,49,0); 
g.drawString("遁走:"+(s[7]>0 "等级"+ts(s[7]):"未修炼"),41,71,0); 
}
else
{
g.drawString("附身:"+(s[8]>0 "等级"+ts(s[8]):"未修炼"),41,5,0);
g.drawString("治疗:"+(s[9]>0 "等级"+ts(s[9]):"未修炼"),41,27,0);
g.drawString("回气:"+(s[10]>0 "等级"+ts(s[10]):"未修炼"),41,49,0);
}
g.drawString("技能点:"+ts(sp),41,98,0);
g.setColor(255,0,255);
g.drawRect(40,4+j%4*22,100,20);
break;
case 2://任务显示
if(task)
{
g.drawString("收集物品",50,5,0);
g.drawString("鹤灵草:"+(tn[0]==10 "完成":ts(tn[0])),41,25,0);
g.drawString("狼牙:"+(tn[1]==5 "完成":ts(tn[1])),41,45,0);
g.drawString("米云香:"+(tn[2]==10 "完成":ts(tn[2])),41,65,0);
g.drawString("雪岩:"+(tn[3]==5 "完成":ts(tn[3])),41,85,0);
if(task2)
g.drawString("虎皮: "+(tn[4]==20 "完成":ts(tn[4])),41,105,0);
}
break;
case 3://装备显示
String temp=new String();
for(int ii=0;ii<6;ii++)
{
switch(weapon[ii])
{
case 0:
temp="短剑";
break;
case 1:
temp="铁剑";
break;
case 2:
temp="守护剑";
break;
case 3:
temp="青剑";
break;
case 4:
temp="烈焰枪";
break;
case 5:
temp="紫砂剑";
break;
case 6:
temp="榔头";
break;
case 7:
temp="战斧";
break;
case 8:
temp="战神剑";
break;
}
if(weapon[ii]!=9)
g.drawString(temp,41+ii%2*55,2+ii/2*21,0);
}
g.drawString("按"1"卖掉",41,108,0);
g.setColor(255,0,255);
g.drawRect(40+j%2*55,1+j/2*21,53,20);
if(curweapon!=9)//如果当前装备有武器就用蓝色框显示
{
for(int iii=0;iii<6;iii++)
{
if(weapon[iii]==curweapon)
{
g.setColor(0,0,255);
g.drawRect(40+iii%2*55,1+iii/2*21,53,20);
break;
}

⌨️ 快捷键说明

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