📄 jcanvas.java
字号:
import java.io.IOException;
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Font;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
/**
* @author 陈利昌
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
/**
* 游戏还存在着碰撞检测的bug。
*/
public class jCanvas extends Canvas implements Runnable{
//所有创建的对象
jiaomidlet midlet;
protected Thread t;
protected Jilu jilu;
protected Shenyin shenyin;
protected NPC Nshiwei;
protected NPC Nshiwei1;
protected NPC Nqingnian;
protected NPC Nfunv;
protected NPC Nguowang;
protected NPC Nshangdian;
protected NPC Ndachen;
protected NPC npc;
protected Zhuangtaikuang zhuangtai;
protected daoju wupin;
//所有图片 Image
protected Image logo;
protected Image ditu;
protected Image zhujiao;
protected Image penquan;
protected Image daditu;
protected Image shangdian;
protected Image shiwei;
protected Image qingnian;
protected Image guowang;
protected Image funv;
protected Image shilaimu;
protected Image daoguai;
protected Image sheguai;
//各类变量
int time = 0;
int mapImage = 1;
int logox = 88;
int logoy = 79;
boolean anjianpanduan=false;
boolean yanshipanduan=false;
protected int yudile=0;
protected int xianshidiren=0;
protected boolean Bxianshidiren=true;
protected int xianshizhujue=0;
protected int row,col; //主角的方向
protected int move=0,move1=0; //键盘按键变量
protected int NPCmove=0; //NPC的方向
protected int hang=5*24; //主角的行
protected int lian=7*24-6; //主角的列
protected int renx=120; //主角所在屏幕的X坐标
protected int reny=144; //主角所在屏幕的Y坐标
protected int gao=320; //游戏得到的屏幕高度
protected int kuan=240; //游戏得到的屏幕宽度
protected int buchang; //主角的步长
protected int penquanx; //NPC碰撞时的X坐标
protected int penquany; //NPC碰撞时的Y坐标
protected int penhuan; //喷泉的图片变换
protected int haihuan; //海的图片变换
protected int mapqiehuan = 10; //所有关卡
protected int qiehuan; //防止进出关卡时主角卡住
protected int bianliang; //数值判断
protected int su=0; //数值判断
protected int bu=0; //数值判断
//所有NPC以及商店的X和Y坐标
protected int shiweix=18*24,shiweiy=18*24-6; //侍卫甲的X、Y
protected int shiwei1x=20*24,shiwei1y=18*24-6; //侍卫乙的X、Y
protected int guowangx=10*24,guowangy=11*24-6; //国王的X、Y
protected int dachenx=11*24,dacheny=12*24-6; //大臣的X、Y
protected int qingnianx=23*24,qingniany=19*24-6; //青年的X、Y
protected int funvx=12*24,funvy=13*24-6; //妇女的X、Y
protected int daojudianx=40*24,daojudiany=25*24-6; //道具店老板的X、Y
protected int wuqidianx=19*24,wuqidiany=21*24-6; //武器店老板的X、Y
protected int fangjudianx=31*24,fangjudiany=21*24-6;//防具店老板的X、Y
protected int lvdianx=33*24,lvdiany=32*24-6; //旅店老板的X、Y
protected int NPCcol; //NPC的图片变换
protected int NPCrow; //NPC青年的方向
protected int NPCrow1; //NPC妇女的方向
protected int huanrow=1; //数值判断
protected int shiweirow=1; //NPC侍卫甲的方向
protected int shiwei1row=1; //NPC侍卫乙的方向
protected int NPCbuchang; //NPC的步长
protected int NPCjisuan; //计算NPC的随机数
protected int ss; //数值判断
protected int pengx=24*24; //NPC坐标
protected int pengy=20*24-6; //NPC坐标
protected int penghuan=0; //NPC数值判断
protected int pengnvx=12*24; //NPC数值判断
protected int pengnvy=13*24-6; //NPC数值判断
protected int xx=hang; //主角数值判断
protected int yy=lian; //主角数值判断
protected int kuangx=16+6,kuangy=6; //对话框的坐标
protected int kuangxx=112+6,kuangyy=86; //对话框的坐标
protected int biaox=30,biaoy=14; //光标的X与Y坐标
protected int biaoxx,biaoyy; //储存光标坐标
protected int duihuakuang=0; //对话框选择
protected int huan; //数值判断
protected int xuanze; //数值判断
protected int duihuajixu=0; //对话更换
protected int zhandoujixu=0;
protected int zhandouduihua=100;
protected int jishuqi=0; //数值判断
protected int xuanzekuangx=88,xuanzekuangy=80;; //菜单选择框
//所有地图
protected short huanggongmap[][]=Huanggongmap.map;
protected short huanggongmap1[][]=Huanggongmap.map1;
protected short chengwaimap[][]=Chengwaimap.map[0];
protected short chengwaimap1[][]=Chengwaimap.map[1];
protected short chengneimap[][]=Chengneimap.map;
protected short map[][]=Huanggongmap.map1;
public jCanvas(jiaomidlet midlet){
setFullScreenMode(true);
this.midlet = midlet;
jilu = new Jilu(this);
shenyin = new Shenyin(this);
wupin=new daoju();
zhuangtai=new Zhuangtaikuang(this);
Nshiwei=new NPC("/images/shiwei.png");
Nshiwei1=new NPC("/images/shiwei.png");
Nqingnian=new NPC("/images/qingnian.png");
Nfunv=new NPC("/images/funv.png");
Nguowang=new NPC("/images/guowang.png");
Ndachen=new NPC("/images/guowang.png");
Nshangdian=new NPC("/images/shangdian.png");
npc=new NPC("/images/shiwei.png");
t = new Thread(this);
t.start();
try {
logo = Image.createImage("/images/logo.png");
shilaimu=Image.createImage("/images/shilaimu.png");
daoguai=Image.createImage("/images/daoguai.png");
sheguai=Image.createImage("/images/sheguai.png");
shangdian=Image.createImage("/images/shangdian.png");
zhujiao=Image.createImage("/images/zhujue.png");
ditu = Image.createImage("/images/chengnei.png");
penquan=Image.createImage("/images/pengquan.png");
daditu=Image.createImage("/images/chengwai.png");
} catch (IOException e) {
e.printStackTrace();
}
}
protected void ShowNotify(){
}
protected void hideNotify(){
}
/**
* @param b
*/
//重绘黑屏
protected void chonghui(Graphics g)
{
g.setClip(0,0,getWidth(),getHeight());
g.setColor(0,0,0);
g.fillRect(0,0,getWidth(),getHeight());
}
//重绘白屏
protected void chonghui1(Graphics g)
{
g.setColor(255,255,255);
g.fillRect(0,0,getWidth(),getHeight());
}
//绘制蓝天
protected void lantian(Graphics g)
{
g.setColor(63,191,255);
g.fillRect(0,0,getWidth(),getHeight());
}
//绘制城内地图
protected void chengnei(Graphics g){
for(int i=hang/24;i<hang/24+11;i++){
for(int j=lian/24;j<lian/24+14;j++){
g.setClip(i*24-hang,j*24-lian,24,24);
g.drawImage(ditu,(i-(map[j][i]-1)%9)*24-hang,(j-(map[j][i]-1)/9)*24-lian,Graphics.TOP|Graphics.LEFT);
}
}
}
//绘制城外地图
protected void chengwai(Graphics g){
haihuan++;
if(haihuan%2==0){
map=chengwaimap;
}
else{
map=chengwaimap1;
}
if(haihuan==100){haihuan=0;}
for(int i=hang/24;i<hang/24+11;i++){
for(int j=lian/24;j<lian/24+14;j++){
g.setClip(i*24-hang,j*24-lian,24,24);
g.drawImage(daditu,(i-(map[j][i]-1)%7)*24-hang,(j-(map[j][i]-1)/7)*24-lian,Graphics.TOP|Graphics.LEFT);
}
}
}
//绘制喷泉
protected void penquan(Graphics g){
g.setClip(576-hang,858-lian,24,24);
g.drawImage(penquan,(576-hang)-penquanx*24,(858-lian)-penquany*24,Graphics.TOP|Graphics.LEFT);
penhuan++;
if(penhuan%3==0){penquanx++;}
if(penquanx==3){penquany++;penquanx=0;}
if(penquany==3){penquany=0;penhuan=0;}
}
//绘制主角
protected void zhujiao(Graphics g){
g.setClip(renx,reny,24,24);
g.drawImage(zhujiao,renx-col*24,reny-row*24,Graphics.TOP|Graphics.LEFT);
}
protected void Logo(Graphics g){
g.setClip(0, 0, kuan, gao);
g.drawImage(logo, 0, 0, Graphics.TOP | Graphics.LEFT);
g.setColor(255, 0, 0);
g.drawRect(logox, logoy, 76, 25);
}
/**
* 绘制进度条界面
* @param g
*/
protected void Time(Graphics g){
time += 5;
g.setColor(0, 0, 0);
g.fillRect(0,0,getWidth(),getHeight());
g.setColor(255, 255, 255);
g.setFont(Font.getFont(Font.FACE_MONOSPACE,Font.STYLE_PLAIN,Font.SIZE_MEDIUM));
g.drawString("正在读取资料中"+ time +"%", 20, 120, Graphics.TOP | Graphics.LEFT);
g.fillRect(22,140,time+48,5);
if(time >= 100){
if(mapqiehuan == 10){
time = 0;
mapqiehuan = 6;
shenyin.logo(1);
}
if(mapqiehuan == 11){
time = 0;
mapqiehuan = 2;
shenyin.logo(1);
}
if(mapqiehuan == 12){
time = 0;
jilu.Duqu();
MapImage();
shenyin.logo(1);
}
}
}
protected void paint(Graphics g) {
chonghui(g);
// g.setColor(0xff0000);
// g.drawString("游戏占用内存 = "+String.valueOf((Runtime.getRuntime().totalMemory()-Runtime.getRuntime().freeMemory()) / 1000)+" K",0,0,0);
/**
* 主菜单
*/
if(mapqiehuan==0){
Logo(g);
}
/**
* 绘制游戏开始的对话界面
*/
if(mapqiehuan == 6){
zhuangtai.logoy -= 1;
zhuangtai.logo(g, logo, gao, kuan);
if(zhuangtai.logoy < - 320){
mapqiehuan = 0;
zhuangtai.logoy = 120;
}
}
/**
* 绘制游戏的设置界面
*/
if(mapqiehuan == 7){
zhuangtai.setshengyin(g, biaox, biaoy);
}
/**
* 绘制游戏的帮助界面
*/
if(mapqiehuan == 8){
zhuangtai.bangzhu(g);
}
/**
* 绘制游戏的进度条画面
*/
if(mapqiehuan == 10 || mapqiehuan == 11 || mapqiehuan == 12){
Time(g);
}
//城内皇宫下层
if(mapqiehuan==1){
chengnei(g);
Nshiwei.drawNPC(g,hang,lian,col,shiweirow,shiweix,shiweiy);
Nshiwei1.drawNPC(g,hang,lian,col,shiwei1row,shiwei1x,shiwei1y);
Nqingnian.drawNPC(g,hang,lian,col,NPCrow,qingnianx,qingniany);
Nfunv.drawNPC(g,hang,lian,col,NPCrow1,funvx,funvy);
zhujiao(g);
}
//城内皇宫上层
if(mapqiehuan==2){
chengnei(g);
Nguowang.drawNPC(g,hang,lian,col,0,guowangx,guowangy);
Ndachen.drawNPC(g,hang,lian,col,shiwei1row,dachenx,dacheny);
zhujiao(g);
}
//城内地图
if(mapqiehuan==3){
chengnei(g);
penquan(g);
Nshangdian.drawNPC(g,hang,lian,col,2,daojudianx,daojudiany);
Nshangdian.drawNPC(g,hang,lian,col,1,fangjudianx,fangjudiany);
Nshangdian.drawNPC(g,hang,lian,col,2,wuqidianx,wuqidiany);
Nshangdian.drawNPC(g,hang,lian,col,1,lvdianx,lvdiany);
Nqingnian.drawNPC(g,hang,lian,col,NPCrow,qingnianx,qingniany);
Nfunv.drawNPC(g,hang,lian,col,NPCrow1,funvx,funvy);
zhujiao(g);
}
//城外地图
if(mapqiehuan==4){
chengwai(g);
zhujiao(g);
/**
* 游戏中主角遇敌的动画场面
*/
if(yudile==1){
if(zhuangtai.duizhan_yudibianhuan(g,gao,kuan)==3){
yudile=0;
mapqiehuan=5;
biaox=12+10;
biaoy=8*24+8;
duihuajixu=0;
}
}
/**
* 游戏中主角结束战斗的动画场面
*/
if(yudile==2){
if(zhuangtai.duizhan_yudibianhuan(g,gao,kuan)==1){
zhuangtai.heipin = false;
Bxianshidiren=true;
duihuakuang=0;
duihuajixu=0;
yudile=0;
}
}
}
if(mapqiehuan==5){
duizhanhuamian(g);
}
//对话:前方没有任何人
if(duihuakuang==100){
zhuangtai.shiwei(g,huan,duihuajixu);
}
//显示对话框
if(duihuakuang==1){
zhuangtai.duihuakuang(g,kuangx,kuangy,kuangxx,kuangyy,biaox,biaoy);
}
//显示与所有NPC对话
if(duihuakuang>=2&&duihuakuang<=13){
zhuangtai.shiwei(g,duihuakuang-1,duihuajixu);
shangdianpanduan(g);
if(duihuajixu==4||duihuajixu==8){
zhuangtai.panduankuang(g,144,48,72,72,biaox,biaoy,1);
}
huan=0;
}
//显示人物状态
if(duihuakuang==20){
if(duihuajixu==0){
zhuangtai.zhuangtailan(g,1*24+12,1*24+12,4*24,5*24,1);
zhuangtai.zhuangbeilan(g,1*24+12,6*24+12,4*24,4*24,0,0,1);
}
if(duihuajixu==1){
zhuangtai.zhuangtailan(g,5*24+12,1*24+12,4*24,8*24-10,2);
}
}
//显示人物道具
if(duihuakuang==21){
if(duihuajixu==0){
zhuangtai.daojulan(g,5*24+12,12,4*24+5,6*24,biaox,biaoy,1);
}
if(duihuajixu==1){
zhuangtai.daojulan(g,5*24+12,4*24+12,3*24+5,4*24,biaox,biaoy,2);
}
if(duihuajixu>=2&&duihuajixu<=8){
zhuangtai.shiwei(g,duihuajixu+14,duihuajixu);
}
if(duihuajixu==10){
zhuangtai.shiwei(g,15,duihuajixu);
}
}
//显示调查结果
if(duihuakuang==22){
zhuangtai.shiwei(g,14,duihuajixu);
}
//显示开门结果
if(duihuakuang==23){
zhuangtai.shiwei(g,13,duihuajixu);
}
if(duihuakuang == 24){
zhuangtai.system(g, 6*24 - 12, 1*24, 4*24 + 12, 5*24, biaox, biaoy, 1);
}
if(duihuakuang == 25){
zhuangtai.shiwei(g,31, 0);
}
}
protected void keyPressed(int keyCode){
int k=this.getGameAction(keyCode);
if((((lian+6)%24==0&&hang%24==0)&&yudile==0) || (mapqiehuan == 5 && yudile==0)){
switch(k){
case Canvas.UP:
if(mapqiehuan == 0){
if(logoy > 79){
logoy -= 35;
}
break;
}
if(duihuakuang==0 && mapqiehuan != 5){
buchang=1;
move=1;
}
guangbiaopanduan(1);
break;
case Canvas.DOWN:
if(mapqiehuan == 0){
if(logoy < 219){
logoy += 35;
}
break;
}
if(duihuakuang==0 && mapqiehuan != 5){
buchang=1;
move=2;
}
guangbiaopanduan(2);
break;
case Canvas.LEFT:
/**
* 调节音量
*/
if(mapqiehuan == 7){
if(biaoy == 50){
if(zhuangtai.setshengyin > 0){
Shenyin.yinliang -= 33;
zhuangtai.setshengyin -= 1;
shenyin.logo(2);
break;
}
}
}
if(mapqiehuan == 0){
break;
}
if(duihuakuang==0 && mapqiehuan != 5){
buchang=1;
move=3;
}
guangbiaopanduan(3);
break;
case Canvas.RIGHT:
/**
* 调节音量
*/
if(mapqiehuan == 7){
if(biaoy == 50){
if(zhuangtai.setshengyin < 3){
Shenyin.yinliang += 33;
zhuangtai.setshengyin += 1;
shenyin.logo(2);
break;
}
}
}
if(mapqiehuan == 0){
break;
}
if(duihuakuang==0 && mapqiehuan != 5){
buchang=1;
move=4;
}
guangbiaopanduan(4);
break;
case Canvas.FIRE:
if( zhuangtai.heipin ){
break;
}
if(mapqiehuan == 10 || mapqiehuan == 11){
break;
}
if(mapqiehuan == 6){
mapqiehuan = 0;
shenyin.over();
shenyin.logo(1);
break;
}
if(mapqiehuan == 7){
if(biaoy == 80){
logoy = 79;
mapqiehuan = 0;
shenyin.over();
shenyin.logo(1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -