📄 gamedraws.java
字号:
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.TextField;
import javax.microedition.midlet.MIDlet;
/*====================================*/
/* 【游戏主控类:动作、逻辑、绘制。】 */
/* 程序编写:励晓维 */
/* 2004-11-27 */
/*====================================*/
public class gameDraws extends Canvas implements CommandListener
{
private Display display; //显示
private Form f; //窗体
private TextField tf; //文本输入框
private Command menuBack; //返回
private Command menuOk; //确认
private Command menuPause; //暂停
private ImageLib pic; //创建图片类的对象
private MIDlet mid;
private int MenuX = 40; //菜单x轴位置变量
private int MenuY = 55; //菜单y轴位置变量
private int MoveTitle = MenuY; //标题框移动变量
private int MoveCote = 6; //战机选择栏初始位置
private int menuIndex=1; //菜单序列
private int count1= 0; //战机选择计数
private gameScore gc; //创建记录库
Random rd = new Random();
private boolean alive=true; //游戏线程开关
private boolean gameinfo; //信息提示开关
Timer timer = new Timer();
private int planeW,planeH; //战机宽高
private int epBtW,epBtH; //敌机子弹宽高
private int count; //暂停菜单开关计数
private int SelectPlane; //选择飞机
private int Lifes; //飞机生命
private int BackGY; //背景移动
private int PlaneMove = 2; //飞机移动状态
private int MovePX, MovePY, //定义战机起点
MoveBtX = 60, MoveBtY = 100;//控制飞机与子弹的起点
private int[] SuiJi = new int[7], //乱数出现敌机
epW = new int[4], epH = new int[4], //敌机宽高
MoveEpX= new int[7], MoveEpY = new int[7],//敌机位置
SuiJiEpX = new int[7], //乱数敌机X坐标
epBtX = new int[4], epBtY = new int[4]; //敌机子弹位置
private int SpeedEnemy = 2; //敌机飞行速度
private int SpeedepBt = 1; //敌机子弹速度
private int SpeedpBt = 4; //战机子弹速度
private int Score = 0; //得分
private int term,Num; //过关用到的变量
private int OverX=20,OverY=60; //游戏结束画面的位置
private int difficulty=3; //游戏难度控制
private int TopScore = 8000; //过关总分
private int pause; //暂停用计数
private int IbackY=-128; //首页背景坐标
private boolean Iback=true; //首页动画开关
/*===============================*/
/* 本类构造器 */
/*===============================*/
public gameDraws(MIDlet midlet,Display s)
{
this.mid=midlet;
this.display=s;
f = new Form(""); //实例化表单
tf=new TextField("留下大名", "YOURNAME", 20, TextField.ANY);
menuOk = new Command("确认", Command.OK, 1);
menuBack = new Command("返回", Command.BACK, 3);
menuPause = new Command("暂停", Command.STOP, 1);
pic=new ImageLib();
pic.loadMenuImg(); //初始化游戏图片
setCommand(menuOk);
EpType(); //取得敌机类型
timer.schedule(new backMove(),10,10);
timer.schedule(new PlaneMove(), 10, 100); //战机与背景移动线程
timer.schedule(new Enemy(), 400, 100); //敌机线程
timer.schedule(new PlaneBullet(), 20, 10); //战机子弹线程
timer.schedule(new bulletEp(),400,16); //敌机子弹线程
}
/*===============================*/
/* 主绘制方法 */
/*===============================*/
public void paint(Graphics g)
{
if(menuIndex==1)
{paintMain(g);} //游戏首页
if(menuIndex==2){
count1++;choicePage(g);}//战机选择页
if(menuIndex==3){
paintGame(g);} //游戏主界面
if(menuIndex==4){
gc.showCompet(g);} //排行页
}
/**======首页绘制=======*/
public void paintMain(Graphics g) {
this.setCommandListener(this);
g.setColor(255, 255, 255);
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(255, 0, 0);
g.drawImage(pic.gameUI[3], 0,IbackY, 0); //游戏首页
g.fillRect(MenuX-1, MoveTitle-1, 52, 18);//填充选择框
/**测试用遮挡屏幕*/
g.setColor(255,255,255);
g.fillRect(0,128,128,50);
for(int i=0;i<3;i++)
g.drawImage(pic.gameUI[i], MenuX, MenuY+i*23, 0);
}
/**=====帮助页绘制======*/
public void helpPage()
{
f.setCommandListener(this);
delForm(); //清空Form
f.removeCommand(menuOk);
f.append(pic.gameUI[4]); //调用帮助图片
f.addCommand(menuBack); //添加返回命令
display.setCurrent(f);
}
/**=====战机选择页======*/
public void choicePage(Graphics g)
{
g.setColor(0,255,0);
g.drawImage(pic.gameUI[5],0,0,0);//战机选择画面
g.drawRect(MoveCote, 26, 49, 79);//Y.W.H
addCommand(menuBack);
}
/**====游戏画面绘制=====*/
public void paintGame(Graphics g) {
addCommand(menuBack);
removeCommand(menuOk);
addCommand(menuPause);
g.setColor(255, 255, 255);
g.fillRect(0, 0, getWidth(), getHeight());
if(Score<=3000)
g.drawImage(pic.gameUI[7], 0, BackGY, 0);//背景1
if(Score>3000&&Score<=5000){
g.drawImage(pic.gameUI[24], 0, BackGY, 0);//背景2
}
if(Score>5000&&Score<=8000){
g.drawImage(pic.gameUI[25], 0, BackGY, 0);//背景3
}
//敌机
for(int i=0;i<difficulty;i++)
{ if(difficulty==4)
MoveEpX[i]=i*35;
else MoveEpX[i]=SuiJiEpX[i]+i*40;
g.drawImage(pic.gameUI[13], epBtX[i], epBtY[i]+2, 0);
g.drawImage(pic.gameUI[SuiJi[i]], MoveEpX[i],MoveEpY[i], 0);}
Impact(g);//碰撞检测
//过关条件判断
term = Score;
if(term>1000*Num) {gameinfo=true;Num+=1;}
/**测试用遮挡屏幕*/
g.fillRect(0,129,128,50);
g.setColor(0, 255, 0);
if(alive) g.drawString("按任意键开始",25,60,0);
paintInfo(g);
g.drawString("得分:" + String.valueOf(Score), 0, 0, 0);
g.drawString("第"+String.valueOf(Num)+"关",100,0,0);
if (SelectPlane == 1)
PlaneRed(g);
else
PlaneBlue(g);//选中战机
//游戏结束判断
if(Lifes<0)
{
OverY=60;MovePX=-20;
g.drawImage(pic.gameUI[6],OverX,OverY,0);
alive=true;removeCommand(menuPause);
}
//游戏胜利判断
if(Score>=TopScore)
{
OverY=60;g.drawImage(pic.gameUI[21],0,0,0);
alive=true;removeCommand(menuPause);Lifes=-1;
}
}
/*===============================*/
/* 选择战机:SelectAir */
/*===============================*/
public void SelectAir()
{
/**初始化游戏各项参数*/
alive = true;
pause=0;//重置暂停开关
count=0;//重置暂停菜单计数
BackGY = -384; //背景位置
MovePX = 50; MovePY = 110; //战机坐标
MoveBtX=-10; //战机子弹坐标
for(int i=0;i<7;i++) MoveEpY[i]=200;//敌机坐标
Lifes = 3;Score=0;Num=1; //生命、得分、关数
for(int i=0;i<difficulty;i++) //难度控制
{epBtX[i]=-10;epBtY[i]=0;epW[i]=0;epH[i]=0;}
MoveEpY[0]=-60; MoveEpY[1]=-30;
MoveEpY[2]=-60; MoveEpY[3]=-30;
if(MoveCote==66)
{
SelectPlane=2;//选择蓝色战机
}
if(MoveCote==6&&menuIndex==2)
{
SelectPlane=1;//选择红色战机
}
menuIndex=3;
}
/**====绘制红色战机=====*/
public void PlaneRed(Graphics g) {
// 战机子弹1
g.drawImage(pic.gameUI[12], MoveBtX, MoveBtY, 0);
for(int i=0;i<Lifes;i++) //画左下角飞机1生命
g.drawImage(pic.gameUI[8], 5+i*8, 118, 0);
if(PlaneMove>=0&&PlaneMove<5)
g.drawImage(pic.gameUI[10], MovePX, MovePY, 0);
}
/**====绘制蓝色战机=====*/
public void PlaneBlue(Graphics g) {
// 战机子弹2
g.drawImage(pic.gameUI[23], MoveBtX, MoveBtY, 0);
for(int i=0;i<Lifes;i++) //画左下角飞机2生命
g.drawImage(pic.gameUI[9], 5+i*8, 118, 0);
if(PlaneMove>=0&&PlaneMove<5)
g.drawImage(pic.gameUI[11], MovePX, MovePY, 0);
}
/**====获得敌机类型=====*/
public void EpType()
{
for(int i=0;i<7;i++)//敌机调用类型
{
SuiJi[i] = Math.abs(rd.nextInt())%7+14;
SuiJiEpX[i]=7;
}
}
/**====绘制过关提示=====*/
public void paintInfo(Graphics g)
{
if(gameinfo==true)
{
for(int i=1;i<7;i++)
{
g.drawString(" 第"+String.valueOf(Num)+"关!",30,60,0);
g.drawString("目标:"+String.valueOf(Num*1000)+"分", 30, 75, 0);
}
}
}
/*===============================*/
/* 按键定义 */
/*===============================*/
public void keyPressed(int KeyCode) {
if(Lifes>=0&&pause==0)
alive = false;
pause++;//暂停开关一次有效
gameinfo = false;
/**战机选择页按键控制*/
if(KeyCode==getKeyCode(Canvas.LEFT)|| (KeyCode == KEY_NUM4)){
if(MoveCote>60)
MoveCote-=60;
else
MoveCote+=60;
PlaneMove = 0;
}//左
if(KeyCode==getKeyCode(Canvas.RIGHT) || (KeyCode == KEY_NUM6)){
if(MoveCote<60)
MoveCote+=60;
else
MoveCote-=60;
PlaneMove = 1;
}//右
/**游戏首页按键控制*/
if (KeyCode == getKeyCode(Canvas.DOWN) || (KeyCode == KEY_NUM8)) {
if(MoveTitle<=MenuY+23)
MoveTitle += 23;
else
MoveTitle = MenuY;
PlaneMove = 4;
}//定位下移的选择框位置
if (KeyCode == getKeyCode(Canvas.UP) || (KeyCode == KEY_NUM2)) {
if(MoveTitle>=MenuY+23)
MoveTitle -= 23;
else
MoveTitle = MenuY+46;
PlaneMove = 3;
}//定位上移的选择框位置
if (KeyCode == getKeyCode(Canvas.FIRE)) {
if(menuIndex==1){
if (MoveTitle == MenuY) {
menuIndex=2;repaint();
}}
}//新游戏菜单选择
if (KeyCode == getKeyCode(Canvas.FIRE)) {
if(menuIndex==1){
if (MoveTitle == (MenuY+23)) {
helpPage();}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -