📄 mycanvas.java
字号:
import javax.microedition.lcdui.*;
import java.io.*;
import java.lang.*;
public class MyCanvas extends Canvas implements Runnable{
public Image offScreen;
public Graphics offg;
public int gameState=MENU;//游戏状态
private static final int MENU=1;
private static final int menuState=2;
private static final int helpMenu=3;
private static final int aboutMenu=4;
private static final int optionMenu=5;
public static final int LOAD=6;
private static final int GAME=7;
private static final int PAUSE=8;
private static final int PassLevel=9;
private static final int GAMEOVER=10;
private static final int GAMEWIN=11;
private static final int mainMenu=12;
public Image imp;//人物图片
public Image imbk;//背景图片
public Image immap;//地图元素
public Image imlife;//生命
public Image imarrow[];//箭头
public Image imenemy[];//敌人
public Image imlifebottle;//血瓶
public Image imbox;//宝箱
public Image imGirl;//公主
public Image imHeart;//心
public Image imRole;//剧情主人公
public Image imbk1;
public Image imjq;
public boolean fire=false;//是否射箭
public int arrow[];
public int ax,ay;//箭的位置
public int pp=2;//箭的方向
public int px,py;//主角位置
public int d=1;//主角方向
public int life;//主角生命
public int nowrow1,nowcol1;//主角脚下位置
public int nowrow2,nowcol2;//主角前面的位置
public int movex;//map[movex][movey]
public int movey;
public int dir=0;//键位控制的方向0stop 1left 2right 3up 4 down
public int nowFrame=0;//当前帧
public int moveFrame[][]={//主角图片移动图片索引
{0,1,2},//up
{3,4,5},//right
{6,7,8},//down
{9,10,11},};//left
public boolean jump=true;//控制是否执行下落的左右移动
public int map[][];//地图元素
public int nowCol=0;//当前需要渲染的起始行
public int bkpx=0;//背景图片的位移
public int mappx=0;//地图元素的移动
public int jumpy=12;//跳跃y
public int jumpx=0;//跳跃x
public int canCro[]={41,42,86,394,408,396,395,5,396,145,146,147,
197,374,444,414,384,157,218,159,376,407,408
,437,55,161,162,389,449,419,11,435,272};//ifdown判断
public int canPro[]={0,297,295,296,298,444,447,352,353,354,413,412,
262,292,322,263,237,323,324,294,264,175,176,177,
178,205,206,207,208,235,236,237,238,265,266,267,
268,382,383,411,441,471,410,440,470,445,449,419,389};//ifpass判断
public MyCanvas()
{
imarrow=new Image[2];
imenemy=new Image[2];
arrow=new int[3];
offScreen=Image.createImage(240,289);
offg=offScreen.getGraphics();
initLevel(1);
(new Thread(this)).start();
}
//加载本关数据
public void initLevel(int n)
{
imbk=null;
imp=null;
immap=null;
if(n==1)
{
try{
imbk=Image.createImage("/bk.png");
imp=Image.createImage("/walk.png");
immap=Image.createImage("/01.png");
imlife=Image.createImage("/life.png");
imarrow[0]=Image.createImage("/arrow.png");
imarrow[1]=Image.createImage("/arrow1.png");
imenemy[0]=Image.createImage("/enemy1.png");
imenemy[1]=Image.createImage("/enemy2.png");
imlifebottle=Image.createImage("/lifebottle.png");
imGirl=Image.createImage("/Noble.png");
imbox=Image.createImage("/box.png");
imHeart =Image.createImage("/xin.png");
imRole=Image.createImage("/Fighter.png");
imbk1=Image.createImage("/bk1.png");
imjq=Image.createImage("/Duke.png");
}catch(Exception e){}
px=10;
py=10;
dir=4;
life=5;
}
map=null;
try{
InputStream is=this.getClass().getResourceAsStream("/map0"+n+".dat");//map01.dat
DataInputStream dis=new DataInputStream(is);
int row=dis.readInt();
int col=dis.readInt();
map=new int[row][col];
for(int i=0;i<row;i++)
{for(int j=0;j<col;j++)
{
map[i][j]=dis.readInt();
}
}
dis.close();
is.close();
}catch(Exception e){}
}
public void paint(Graphics g)
{
g.drawImage(offScreen,0,0,0);
}
public void drawMainMenu(){}
public void drawHelp(){}
public void drawAbout(){}
public void drawOption(){}
int t=0;
public void drawLoad(){
if(t<=100)
{offg.drawImage(imjq,0,0,0);
t++;
}
else
this.gameState=GAME;
}
public void drawBack(){//绘制背景
//offg.drawImage(imbk,bkpx-240,0,0);
offg.drawImage(imbk,bkpx,0,0);
offg.drawImage(imbk,bkpx+240,0,0);
Font f1=Font.getFont(Font.FACE_SYSTEM,Font.STYLE_BOLD,Font.SIZE_LARGE);
offg.setFont(f1);
offg.setColor(255,0,0);
offg.drawString("生命:",10,10,Graphics.LEFT|Graphics.TOP);
for(int i=0;i<life;i++)
offg.drawImage(imlife,20+30*(i+1),10,Graphics.LEFT|Graphics.TOP);
}
public void drawMap(){//绘制地图
for(int i=0;i<16;i++)
{for(int j=nowCol;j<16+nowCol;j++)
{
//offg.setClip((j-nowCol)*16+mappx,i*16,16,16);
// offg.setClip((j-nowCol)*16,i*16,16,16);
if(map[i][j]>0)
{
movey = map[i][j]/30;
movex = map[i][j]%30 - 1;
if(movex < 0)
{
movey -= 1;
movex = 29;
}
offg.setClip((j-nowCol)*16+mappx,i*16+32,16,16);
offg.drawImage(immap,(j-nowCol)*16-movex*16 + mappx, i*16-movey*16+32,0);
}
}
}
offg.setClip(0,0,240,289);
}
public void drawPlayer(){//绘制人物
switch(dir)
{
case 1://left
d=3;break;
case 2://right
d=1;break;
case 5://right up
d=1;
break;
case 6://left up
d=3;
break;
case 0:
break;
}
offg.setClip(px,py,16,24);
int trueframe=moveFrame[d][nowFrame];
int movex=16*(trueframe);
offg.drawImage(imp,px-movex,py,0);
offg.setClip(0,0,240,289);
}
public void drawArrow(){//绘制箭
if(fire)
{
offg.drawImage(imarrow[pp],ax,ay,0);
}
}
int edir=0;//方向
int er=11,ec=25;//敌人行列数
int eframe=0;//帧数
int move=150;//移动范围
int ex,ey;//坐标
int time=0;//死亡帧
boolean enemydead=false;
public void drawEnemy(){//绘制敌人
if(!enemydead)
{
ex=ec*16-nowCol*16+mappx+move;
ey=er*16+5;
offg.setClip(ex,ey,48,48);
offg.drawImage(imenemy[0],ex-eframe*48,ey-48*edir,0);}
else
{
if(time!=3)
{offg.setClip(ex,ey+16,48,32);
offg.drawImage(imenemy[0],ex-eframe*48,ey-48*2+16,0);
time++;}
else
{
ex=ey=0;
}
}
offg.setClip(0,0,240,289);
}
boolean eat=false;
boolean open=false;
int bx,by;
public void drawD(){//绘制宝箱和血瓶
bx=44*16-nowCol*16+mappx;
by=14*16;
if(!open)
{offg.setClip(bx,by,32,32);
offg.drawImage(imbox,bx,by,0);
}
else
{
if(!eat)
{
offg.drawImage(imlifebottle,bx,by,0);
}
else {bx=0;by=0;}
}
offg.setClip(0,0,240,289);
}
public void drawPause(){}
public void drawPass(){
offg.drawString("YOU WIN!!!",80,144,Graphics.LEFT|Graphics.TOP);
this.gameState=GAMEWIN;
}
public void drawOver(){
Font f2=Font.getFont(Font.FACE_SYSTEM,Font.STYLE_BOLD,Font.SIZE_LARGE);
offg.setFont(f2);
offg.setColor(255,0,0);
offg.drawString("GAME OVER!",80,144,Graphics.LEFT|Graphics.TOP);
}
public int RoleFrame[]={8,9,10,11,10,9,8};
//public int GirlFrame[]={0,1,2,3,2,3,1};
public int ppx=0;
public int ppy=130;
public int RoleNow=0;
public boolean isrun=false;
public int isflash=3;
public void drawWin(){
offg.drawImage(imbk1,0,0,0);
if(isrun&&isflash> 6)
{
offg.drawImage(imHeart,106,57,0);
}
isflash--;
offg.setClip(122,130,32,48);
offg.drawImage(imGirl,122,82,0);
offg.setClip(ppx,ppy,32,48);
int RoleTrue=RoleFrame[RoleNow];
int movex=32*(RoleTrue%4);
offg.drawImage(imRole,ppx-movex,ppy-96,0);
if(isflash==0)
{
isflash=18;
}
offg.setClip(0,0,240,289);
}
public void run()
{
long starttime=0;
long passtime=0;
while(true)
{
starttime=System.currentTimeMillis();
//图形绘制
switch(gameState)
{
case MENU://菜单状态
switch(menuState)
{case mainMenu://绘制主菜单
drawMainMenu();break;
case helpMenu://绘制帮助画面
drawHelp(); break;
case aboutMenu://游戏关于画面
drawAbout();break;
case optionMenu://游戏选项画面
drawOption();break;
}
break;
case LOAD://游戏载入状态
drawLoad();break;
case GAME://游戏状态
drawBack();//绘制背景
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -