📄 wxjgamecanvas.java
字号:
import java.io.*; //导入异常类
import java.util.Random; //导入随机数类
import javax.microedition.lcdui.*;//导入用户显示屏类
import javax.microedition.lcdui.game.*;//游戏类
import javax.microedition.rms.*; //记录仓库
//游戏画布类(GameCanvas) 游戏画布类 线程接口 监听接口
public class WXJGameCanvas extends GameCanvas implements Runnable,CommandListener
{
private WXJ_MIDlet w; //主类对象
private Sound sod; //声音类对象
Random rdm = new Random(); //随机数对象
static boolean exit_bz=false; //游戏退出标志
boolean isGamePaused=false; //游戏暂停标志
boolean kaiguan0 = true;
boolean kaiguan1 = true;
boolean kaiguan2 = true;
boolean kaiguan3 = true;
boolean shengyin = true;
boolean bofang = true;
private Command cmdBack=null; //退出按钮引用变量
private Command queding=null; //排行榜确定按钮引用变量
boolean JiXubz=false; //继续按键标志
RecordStore rs; //记录仓库对象
StringBuffer sb; //字符串变量对象
Graphics g = getGraphics(); //脱机缓冲画笔
Font ziti =Font.getFont(Font.FACE_SYSTEM, //字体的外观 //改变字体的大小
Font.STYLE_PLAIN, //字体的样式
Font.SIZE_LARGE); //字体的尺寸
private WXJ_GameSprite pPeople; //主角飞机对象
private WXJ_GameSprite BOSS; //敌人BOOS
private WXJ_GameSprite laozide_dj; //飞机道具 1
private WXJ_GameSprite fj_dj1; //飞机道具 2
private WXJ_GameSprite zhaDan; //炸弹
private WXJ_GameSprite BACK; //游戏中的返回图标
private WXJ_GameSprite laba1; //飞机道具 1
private WXJ_GameSprite[]jiemian = new WXJ_GameSprite [2]; //背景边框
private WXJ_GameSprite[] fjzd = new WXJ_GameSprite[15]; //飞机子弹
private WXJ_GameSprite[] fjzd1 = new WXJ_GameSprite[15]; //飞机子弹
private WXJ_GameSprite[] fjzd2 = new WXJ_GameSprite[15]; //飞机子弹
private WXJ_GameSprite[] BOSS_DD= new WXJ_GameSprite [4]; //敌人BOOS的导弹
private WXJ_GameSprite[] xiaobidiji = new WXJ_GameSprite [4]; //敌人小飞机
private WXJ_GameSprite[] diren = new WXJ_GameSprite [4]; //敌人中型飞机
private WXJ_GameSprite[] wofeiji_HP = new WXJ_GameSprite [3]; //飞机HP标志
private WXJ_GameSprite[] laozidezhadan = new WXJ_GameSprite [3]; //飞机保险标志
private WXJ_GameSprite[] DJZD = new WXJ_GameSprite[16]; //敌人小飞机子弹
private WXJ_GameSprite[] DJZD2 = new WXJ_GameSprite[16]; //敌人中型飞机子弹
private WXJ_GameSprite[] DJZD3 = new WXJ_GameSprite[16]; //敌人BOSS子弹
private WXJ_GameSprite[] HuoGuang=new WXJ_GameSprite [6]; //爆炸效果对象
private LayerManager mLayerManager; //层管理类对象
private Image sp1_Image, sp2_Image; //闪屏图片
private Image win_Image,over_Image; //胜利和失败的图片
private Image shezhi_img, help_img; //设置和帮助的图片
private Image allbutton, img; //图片菜单和菜单背景图片
private Image beijing, beijing1, laba; //游戏背景图片 //喇叭图片
private Image fanhui, paihang; //排行榜背景图片 //菜单中的返回图标
private Image mc,zimu,shuzi,zhizhen; //排行榜的 名次,字母,数字,指针
private Image phb_bjt,mingzi,quding; //排行榜背景图片 //排行榜输入界面背景标题 //确定图标
private int Xuan_Ji,XuanZe_jsp=0; //选择敌人飞机的计数器 2个//小飞机和中型飞机
private int x2,y2; //图片菜单的坐标
private int timeStep =1000; //线程时间
private int DiJiCX_jsq =0, DiJiCX_jsq2 =0, DiJiCX_jsq3 =0; //敌机出现计数器 一共3个
private int bj_y1 =-310, bj_y2 =0; //背景图移动的纵坐标
private int df_jsq =0, daoju_jsq=0; //得分计数器 // 道具存在时间计数器
private int kill_jsq =0; //主角死亡时间计数器
private int mz1, mz2, mz3, mzw=1; //胜利输入的人名
private int [][] a=new int [3][5]; //前3名得分
private boolean labaBz = true; //喇叭标志
private boolean djcz =false; //敌人中型飞机存在标志 1
private boolean djcz2 =false; //敌人中型飞机存在标志 2
private boolean djcz3 =false; //敌人中型飞机存在标志 3
private boolean djcz4 =false; //敌人中型飞机存在标志 4
private boolean boss =false; //敌人BOSS存在标志
private boolean huanzhen=false; //爆炸效果换桢标志
private boolean xdf_bz =false; //是否写得分标志
private boolean zd_bz =false; //主角发射子弹的标志
private boolean DJ_BZ =false; //道具存在标志
private boolean cs_hp =false; //判断是否增加主角生命的标志
private byte action = -2; //分支条件变量
private byte jsq2=0, js=1; //控制闪屏时间的计数器 和选择菜单计数器
private byte BaoZha_jsq=0; //爆炸计数器
private byte huanzhen_jsq=0; //爆炸效果换桢的记数器
private byte djjsq = 4; //敌人小飞机jsq
private byte djjsq2 = 4; //敌人中飞机jsq
private byte kaishi = 0; //动画时间计数器
// int bf = 1;
public WXJGameCanvas (WXJ_MIDlet w) throws IOException //抛出异常
{
super(true); //不调用keyPress等,提高速度和性能
this.w=w; //给全局变量赋值
mLayerManager = new LayerManager();//容器的对象
Load_Image(); //装载菜单 关于 帮助 图片 //断点 18
game_init(); //游戏初始化方法
//断点 1
// bofang();
cmdBack=new Command("返回",Command.OK,1); //设置返回按键
queding=new Command("确定",Command.OK,1); //设置确定按键
this.setCommandListener(this); //打开监听
this.setFullScreenMode (true); //设置全屏模式
x2=90; //给图片菜单坐标赋值
y2=75;
sod = new Sound(); //给声音分配内存空间
rs=openRSAnyway(); //记录仓库对象 //断点 19
sb=new StringBuffer("得分: "); //游戏中的得分和记录仓库的分数公用
Thread t = new Thread(this); //调用线程
t.start(); //断点 20
}
public void Paint_Menu(Graphics g)//画菜单//和贪吃蛇的尺寸一样
{
g.drawImage(img, 0, 0, Graphics.TOP | Graphics.LEFT);//菜单的背景
g.setClip(x2,y2,52,20);
if (js==1) //开始按键
g.drawImage(allbutton,x2-52,y2,Graphics.TOP|Graphics.LEFT);
else
g.drawImage(allbutton,x2,y2,Graphics.TOP|Graphics.LEFT);
g.setClip(x2,y2+23*1,52,20);
if (js==2) //帮助按键
g.drawImage(allbutton,x2-52*3,y2+23*1,Graphics.TOP|Graphics.LEFT);
else
g.drawImage(allbutton,x2-52*2,y2+23*1,Graphics.TOP|Graphics.LEFT);
g.setClip(x2,y2+23*2,52,20);
if (js==3) //设置按键
g.drawImage(allbutton,x2-52*5,y2+23*2,Graphics.TOP|Graphics.LEFT);
else
g.drawImage(allbutton,x2-52*4,y2+23*2,Graphics.TOP|Graphics.LEFT);
g.setClip(x2,y2+23*3,52,20);
if (js==4) //排行榜按键
g.drawImage(allbutton,x2-52*11,y2+23*3,Graphics.TOP|Graphics.LEFT);
else
g.drawImage(allbutton,x2-52*10,y2+23*3,Graphics.TOP|Graphics.LEFT);
if (JiXubz==true)//有继续按键的时候
{
g.setClip(x2,y2+23*4,52,20);
if (js==5) //继续按键
g.drawImage(allbutton,x2-52*7,y2+23*4,Graphics.TOP|Graphics.LEFT);
else
g.drawImage(allbutton,x2-52*6,y2+23*4,Graphics.TOP|Graphics.LEFT);
g.setClip(x2,y2+23*5,52,20);
if (js==6) //退出按键
g.drawImage(allbutton,x2-52*9,y2+23*5,Graphics.TOP|Graphics.LEFT);
else
g.drawImage(allbutton,x2-52*8,y2+23*5,Graphics.TOP|Graphics.LEFT);
g.setClip(0,0,getWidth(),getHeight());
}
else
{
g.setClip(x2,y2+23*5,52,20);
if (js==5) //退出按键
g.drawImage(allbutton,x2-52*9,y2+23*5,Graphics.TOP|Graphics.LEFT);
else
g.drawImage(allbutton,x2-52*8,y2+23*5,Graphics.TOP|Graphics.LEFT);
g.setClip(0,0,getWidth(),getHeight());
}
}
private void Print_Item(Graphics g,int n)
{
if(n==-2) //画闪屏1 (移动logo)
g.drawImage(sp1_Image,getWidth()/2,getHeight()/2,Graphics.VCENTER|Graphics.HCENTER);
if(n==-1) //画闪屏2 (游戏学院logo)
g.drawImage(sp2_Image, 0, 0,Graphics.LEFT|Graphics.TOP);
if(n==2) //画帮助图片
{
g.drawImage(help_img, 30,57,Graphics.LEFT|Graphics.TOP);
g.drawImage(fanhui,177,this.getHeight()-25,0);
this.addCommand(cmdBack);
}
if(n==3) //画设置图片
{
laba1.setVisible(true);
g.drawImage(shezhi_img,32,63,Graphics.LEFT|Graphics.TOP);
g.drawImage(fanhui,177,this.getHeight()-25,0);
if (labaBz==true)//画喇叭标志
{
laba1.setPosition(132,138);
laba1.setFrame(0);
}
else
{
laba1.setFrame(1);
}
this.addCommand(cmdBack);
}
if(n==4) //画排行榜图片
{
sortData();//仓库内容排序的方法 //断点 29
g.drawImage(paihang,32,45,Graphics.LEFT|Graphics.TOP);
g.drawImage(fanhui,177,this.getHeight()-25,0);
g.drawImage(mc,60,130,0);
g.setClip(136,130,9,13); //写第一名字
g.drawImage(zimu,136-9*a[0][0],130,0);
g.setClip(151,130,9,13);
g.drawImage(zimu,151-9*a[0][1],130,0);
g.setClip(166,130,9,13);
g.drawImage(zimu,166-9*a[0][2],130,0);
g.setClip(91,150,9,13); //写第一得分
g.drawImage(shuzi,91-9*(a[0][3]/1000),150,0);
g.setClip(106,150,9,13);
g.drawImage(shuzi,106-9*((a[0][3]%1000)/100),150,0);
g.setClip(121,150,9,13);
g.drawImage(shuzi,121-9*((a[0][3]%100)/10),150,0);
g.setClip(136,150,9,13);
g.drawImage(shuzi,136-9*(a[0][3]%10),150,0);
g.setClip(151,150,9,13);
g.drawImage(shuzi,151,150,0);
g.setClip(166,150,9,13);
g.drawImage(shuzi,166,150,0);
g.setClip(136,175,9,13); //写第二名字
g.drawImage(zimu,136-9*a[1][0],175,0);
g.setClip(151,175,9,13);
g.drawImage(zimu,151-9*a[1][1],175,0);
g.setClip(166,175,9,13);
g.drawImage(zimu,166-9*a[1][2],175,0);
g.setClip(91,195,9,13); //写第二得分
g.drawImage(shuzi,91-9*(a[1][3]/1000),195,0);
g.setClip(106,195,9,13);
g.drawImage(shuzi,106-9*((a[1][3]%1000)/100),195,0);
g.setClip(121,195,9,13);
g.drawImage(shuzi,121-9*((a[1][3]%100)/10),195,0);
g.setClip(136,195,9,13);
g.drawImage(shuzi,136-9*(a[1][3]%10),195,0);
g.setClip(151,195,9,13);
g.drawImage(shuzi,151,195,0);
g.setClip(166,195,9,13);
g.drawImage(shuzi,166,195,0);
g.setClip(136,220,9,13); //写第三名字
g.drawImage(zimu,136-9*a[2][0],220,0);
g.setClip(151,220,9,13);
g.drawImage(zimu,151-9*a[2][1],220,0);
g.setClip(166,220,9,13);
g.drawImage(zimu,166-9*a[2][2],220,0);
g.setClip(91,239,9,13); //写第三得分
g.drawImage(shuzi,91-9*(a[2][3]/1000),239,0);
g.setClip(106,239,9,13);
g.drawImage(shuzi,106-9*((a[2][3]%1000)/100),239,0);
g.setClip(121,239,9,13);
g.drawImage(shuzi,121-9*((a[2][3]%100)/10),239,0);
g.setClip(136,239,9,13);
g.drawImage(shuzi,136-9*(a[2][3]%10),239,0);
g.setClip(151,239,9,13);
g.drawImage(shuzi,151,239,0);
g.setClip(166,239,9,13);
g.drawImage(shuzi,166,239,0);
g.setClip(0,0,this.getWidth(),this.getHeight());
this.addCommand(cmdBack);
}
if(n==5) //画失败图片
{
this.addCommand(cmdBack);
g.drawImage(over_Image,70, 110,Graphics.LEFT|Graphics.TOP);
xdf_bz=dfpd();//是否写得分标志 //断点 30
}
if(n==6) //画胜利图片
{
this.addCommand(cmdBack);
g.drawImage(win_Image,70, 110,Graphics.LEFT|Graphics.TOP);
xdf_bz=true;
}
if(n==7)//画排行榜输入
{
this.addCommand(queding);
g.drawImage(phb_bjt,32,51,0);
g.drawImage(mingzi,65,71,0);
g.drawImage(zhizhen,90+(30*(mzw-1)),195,0);
g.drawImage(quding,177,this.getHeight()-25,0);
g.setClip(90,180,9,13);
g.drawImage(zimu,90-9*mz1,180,0);
g.setClip(120,180,9,13);
g.drawImage(zimu,120-9*mz2,180,0);
g.setClip(150,180,9,13);
g.drawImage(zimu,150-9*mz3,180,0);
g.setClip(78,220,9,13);
g.drawImage(shuzi,78-9*(df_jsq/1000),220,0);
g.setClip(93,220,9,13);
g.drawImage(shuzi,93-9*((df_jsq%1000)/100),220,0);
g.setClip(108,220,9,13);
g.drawImage(shuzi,108-9*((df_jsq%100)/10),220,0);
g.setClip(123,220,9,13);
g.drawImage(shuzi,123-9*(df_jsq%10),220,0);
g.setClip(138,220,9,13);
g.drawImage(shuzi,138,220,0);
g.setClip(153,220,9,13);
g.drawImage(shuzi,153,220,0);
g.setClip(0,0,getWidth(),getHeight());
}
}
private void render(Graphics g)// 实施
{
g.setColor(0xffffff);//颜色为白
g.fillRect(0, 0, getWidth(),getHeight());//清屏
jsq2++;
if (jsq2 == 3)//30
{
action++;
}
else if(jsq2 == 6)//60
{
action++;
}
if(jsq2==0) //不设 就卡或者界面乱跳
jsq2=10;
//分支情况
switch(action)
{
case -2: //如果action=-2,画闪屏1
Print_Item(g,-2);
break;
case -1: //如果action=-1,画闪屏2
Print_Item(g,-1);
break;
case 0: //如果action=0, 画菜单
timeStep=700;
if(labaBz==true) //喇叭标志
sod.play_music1();//启用声音
else
sod.STOP1();
Paint_Menu(g);
break;
case 1: //如果action=1, 画游戏
timeStep=150;
sod.STOP1();
//sod.close1();
sod.play_music();
// bf=2;
if(kaiguan0=true)
{
game_act();//游戏动作
kaiguan0=false;
}//断点 31
break;
case 2: //如果action=2, 画帮助
timeStep=700;
bj_move();
Print_Item(g,2);
break;
case 3: //如果action=3, 画设置图片
timeStep=700;
bj_move();
Print_Item(g,3);
break;
case 4: //如果action=4, 画排行榜
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -