📄 planecanvas.java
字号:
// 调用退出方法
PlaneMIDlet.quitApp();
break;
}
break;
}
}
}
/** 游戏帮助界面按键功能块 */
private void helpKeyPressed(int keyCode) {
if (gameState == GAME_HELP) {
if (keyCode == -6) {
gameState = GAME_MENU;
delay = 0;
}
if (keyCode == -7) {
gameState = GAME_SETTING;
delay = 0;
}
}
}
/** 游戏设置界面按键功能块 */
private void settingKeyPressed(int keyCode) {
int action = getGameAction(keyCode);
if (gameState == GAME_SETTING) {
if (keyCode == -6) {
gameState = GAME_MENU;
delay = 0;
}
if (keyCode == -7) {
gameState = GAME_READING;
delay = 0;
}
switch (action) {
case UP:
case LEFT:
if (settingIndex > 0) {
settingIndex--;
} else {
settingIndex = gameSpeedStr.length - 1;
}
break;
case DOWN:
case RIGHT:
if (settingIndex < gameSpeedStr.length - 1) {
settingIndex++;
} else {
settingIndex = 0;
}
break;
case FIRE:
switch (settingIndex) {
case FAST: // 快速
sleepTime = 80;
break;
case NORMAL: // 正常
sleepTime = 100;
break;
case SLOW: // 慢速
sleepTime = 150;
break;
}
delay = -100;
break;
}
}
}
/** 游戏说明界面按键功能块 */
private void readKeyPressed(int keyCode) {
if (gameState == GAME_READING) {
if (keyCode == -6 || keyCode == -7) {
gameState = GAME_MENU;
delay = 0;
}
}
}
/** 游戏执行中的按键功能块 */
private void gameKeyPressed(int keyCode) {
int action = getGameAction(keyCode);
if (gameState == GAME_CONTINUE) {
if (keyCode == -6) {
if (popMenuOpen) {
return;
}
if (leftPauseSwitch) {
leftPauseSwitch = false;
} else {
leftPauseSwitch = true;
}
}
if (keyCode == -7) {
if (popMenuOpen) {
popMenuOpen = false;
} else {
popMenuOpen = true;
}
}
if (popMenuOpen) { // 右键菜单打开时
switch (action) {
case UP:
case LEFT:
if (popMenuIndex > 0) {
popMenuIndex--;
} else {
popMenuIndex = popMenuStr1.length - 1;
}
break;
case DOWN:
case RIGHT:
if (popMenuIndex < popMenuStr1.length - 1) {
popMenuIndex++;
} else {
popMenuIndex = 0;
}
break;
case FIRE:
switch (popMenuIndex) {
case 0: // 储存进度
gameState = GAME_SAVING;
delay = 0;
break;
case 1: // 开启或关闭无敌
if (unlock) {
unlock = false;
} else {
unlock = true;
}
runRightMenuIndex = 1;
break;
case 2: // 重闯本关
popMenuOpen = false;
gameState = GAME_CONTINUE;
gateState = GATE_OPEN;
// 存储器刷新
clearArray();
break;
case 3: // 退出任务(返回主界面)
popMenuOpen = false;
gameState = GAME_MENU;
gateState = GATE_OPEN;
// 存储器刷新
clearArray();
break;
}
break;
}
} else { // 右键菜单关闭状态
switch (action) {
case UP:
repeat = 0;
break;
case DOWN:
repeat = 1;
break;
case LEFT:
repeat = 2;
break;
case RIGHT:
repeat = 3;
break;
case FIRE:
if (pp[13] == 1) {
// 分值减少
pp[11] -= INVINCIBILITY_COST;
// 炮弹左上x坐标
int x = pp[3] + (pp[6] - 10) / 2;
// 炮弹左上y坐标
int y = pp[4] + 12;
// 释放必杀技
Invincibility_Logicol(x, y, 0);
}
break;
default:
repeat = -1;
break;
}
}
}
}
/** 关卡或游戏失败界面的按键功能块 */
private void overKeyPressed(int keyCode) {
if (keyCode == -6) {
// 左键暂停功能开着,则……
if (leftPauseSwitch) {
// 玩家不放弃,重玩当前关卡
popMenuOpen = false;
leftPauseSwitch = false;
gameState = GAME_CONTINUE;
gateState = GATE_OPEN;
delay = 0;
times = 0;
shotDelay = 0;
}
}
}
/** 获得状态栏显示数据 */
private void getBarSreDate() {
// 关卡数
barStr[0] = String.valueOf(gate);
// 级别
barStr[1] = String.valueOf(pp[14]);
// 得分
barStr[2] = String.valueOf(pp[11]);
// 剩余生命
barStr[3] = String.valueOf(LIFE - pp[12] + 1);
}
/** 状态栏绘制 */
private void drawBar(Graphics g) {
if (gameState == GAME_CONTINUE & gateState == GATE_CONTINUE) {
switch (pp[13]) {
case 0:
g.drawImage(bar0Img, 0, 309, Graphics.BOTTOM | Graphics.LEFT);
break;
case 1:
g.drawImage(bar1Img, 0, 309, Graphics.BOTTOM | Graphics.LEFT);
break;
}
g.setColor(255, 0, 0);
g.setFont(Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_BOLD,
Font.SIZE_MEDIUM));
g.drawString(barStr[0], 36, 294, Graphics.TOP | Graphics.RIGHT);
g.drawString(barStr[1], 76, 294, Graphics.TOP | Graphics.RIGHT);
g.drawString(barStr[2], 156, 294, Graphics.TOP | Graphics.RIGHT);
g.drawString(barStr[3], 195, 294, Graphics.TOP | Graphics.RIGHT);
}
}
/** 绘制游戏主菜单界面 */
private void drawGameMenu(Graphics g) {
g.drawImage(menuImg, 0, 0, Graphics.TOP | Graphics.LEFT);
for (int i = 0; i < 6; i++) {
if (menuIndex == i) {
g.setColor(0, 255, 0);
if (delay % 4 < 2) {
g.setFont(Font.getFont(Font.FACE_PROPORTIONAL,
Font.STYLE_BOLD | Font.STYLE_UNDERLINED,
Font.SIZE_LARGE));
} else {
g.setFont(font);
}
} else {
g.setFont(font);
g.setColor(255, 0, 0);
}
g.drawString(menuStr[i], width / 2, 130 + i * 25, Graphics.TOP
| Graphics.HCENTER);
}
}
/** 绘制游戏设置界面 */
private void drawGameSetting(Graphics g) {
g.drawImage(settingImg, 0, 0, Graphics.TOP | Graphics.LEFT);
if (delay < 0) {
g.setFont(font);
g.setColor(0, 255, 0);
g.drawString("游戏速度已设定为:" + gameSpeedStr[settingIndex], width / 2,
170, Graphics.TOP | Graphics.HCENTER);
g.setColor(3, 27, 205);
g.fillRect(0, 210, width, 50);
delay = -100;
return;
}
for (int i = 0; i < 3; i++) {
if (settingIndex == i) {
g.setColor(0, 255, 0);
if (delay % 4 < 2) {
g.setFont(Font.getFont(Font.FACE_PROPORTIONAL,
Font.STYLE_BOLD | Font.STYLE_UNDERLINED,
Font.SIZE_LARGE));
} else {
g.setFont(font);
}
} else {
g.setFont(font);
g.setColor(255, 0, 0);
}
g.drawString(gameSpeedStr[i], width / 2, 150 + i * 25, Graphics.TOP
| Graphics.HCENTER);
}
}
/** 绘制游戏失败界面 */
private void drawGameFail(Graphics g) {
if (delay < 30) {
g.drawImage(failImg, 0, 0, Graphics.TOP | Graphics.LEFT);
} else if (delay < 91) {
// 辅助界面显示开关
leftPauseSwitch = true;
popMenuOpen = false;
// 绘制文字
g.setColor(0);
g.fillRect(0, 0, width, height);
g.setFont(font);
g.setColor(0, 255, 0);
g.drawString("不 轻 言 放 弃", width / 2, 100, Graphics.TOP
| Graphics.HCENTER);
g.drawString("就 继 续 努 力", width / 2, 122, Graphics.TOP
| Graphics.HCENTER);
// 倒计时显示(60)
g.setColor(5, 253, 238);
g.drawRect(57, 152, 121, 8);
g.setColor(0, 255, 0);
g.fillRect(58, 153, (delay - 30) * 2, 7);
g.setColor(253, 238, 5);
g.setFont(Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_PLAIN,
Font.SIZE_MEDIUM));
g.drawString("【倒计时完毕将返回主菜单】", width / 2, 172, Graphics.TOP
| Graphics.HCENTER);
// 绘制左软键继续游戏提示
drawContinue(g);
}
}
/** 绘制左软键继续游戏提示 */
private void drawContinue(Graphics g) {
if (gameState == GAME_OVER || gameState == GAME_CONTINUE) {
if (leftPauseSwitch & !popMenuOpen) {
g.setColor(255, 0, 0);
g.setFont(font);
g.drawString("继续", 5, height - 15, Graphics.BOTTOM
| Graphics.LEFT);
}
}
}
/** 绘制右软键菜单 */
private void drawRightMenu(Graphics g) {
if (gameState == GAME_CONTINUE & popMenuOpen == true) {
// 绘制底色
g.setColor(3, 27, 205);
g.fillRect(width - 84, height - 105, 83, 89);
// 绘制边框
g.setColor(255, 0, 0);
g.drawRect(width - 85, height - 106, 84, 90);
for (int i = 0; i < popMenuStr1.length; i++) {
if (popMenuIndex == i) {
g.setColor(0, 255, 0);
} else {
g.setColor(255, 0, 0);
}
g.setFont(font);
// 根据必杀技开启状态选择绘制右键菜单
if (unlock) { // 已开启必杀技
g.drawString(popMenuStr2[i], width - 12, height - 100 + i
* 20, Graphics.TOP | Graphics.RIGHT);
} else { // 未开启必杀技
g.drawString(popMenuStr1[i], width - 12, height - 100 + i
* 20, Graphics.TOP | Graphics.RIGHT);
}
}
}
}
/** 右键菜单选项执行信息绘制 */
private void drawRightMenuRunInfo(Graphics g) {
if (!popMenuOpen || gameState != GAME_CONTINUE
|| gateState != GATE_CONTINUE) {
return;
}
switch (runRightMenuIndex) {
case 0: // 存盘
break;
case 1: // 作弊
g.setColor(255, 0, 0);
g.setFont(font);
if (popMenuIndex == 1) {
if (unlock) {
g.drawString("【已处于无敌状态】", width / 2, 140, Graphics.TOP
| Graphics.HCENTER);
} else {
g.drawString("【已解除无敌状态】", width / 2, 140, Graphics.TOP
| Graphics.HCENTER);
}
}
break;
}
}
/**
* 加载或存盘界面绘制
*
* @param sys_state操作状态标识,0加载,1存盘
* @param g画笔
*/
public void loadOrSave(Graphics g, int sys_state) {
// 绘制底色
g.setColor(0);
g.fillRect(0, 0, width, height);
if (!record && gameState == GAME_LOADING) {
g.setFont(font);
g.setColor(0, 255, 0);
g.drawString("【游戏存档不存在或未发现】", width / 2, 150, Graphics.TOP
| Graphics.HCENTER);
if (delay > 10) {
gameState = GAME_MENU;
delay = 0;
return;
}
return;
}
// 设置剪切区域
g.setClip(92, 250 - 44 - delay * 4, 57, 44);
// 绘制飞机动画
g.drawImage(loadSaveImg, 92 - delay % 3 * 57, 250 - 44 - delay * 4,
Graphics.TOP | Graphics.LEFT);
// 恢复剪切区域
g.setClip(0, 0, width, height);
// 设置字体、前景色
g.setFont(font);
g.setColor(0, 255, 0);
switch (sys_state) {
case LOADING: // 加载游戏进度
g.drawString("正在加载存档...", width / 2, 250, Graphics.TOP
| Graphics.HCENTER);
break;
case SAVING: // 存储游戏进度
g.drawString("正在存储游戏...", width / 2, 250, Graphics.TOP
| Graphics.HCENTER);
break;
}
// 绘制进度条框
g.setColor(5, 56, 248);
g.drawRect(68, 278, 103, 8);
// 绘制进度条
g.setColor(0, 255, 0);
g.fillRect(70, 280, delay * 2, 5);
}
/** 玩家被击中:敌人炮弹同玩家飞机的碰撞检测及碰撞处理、数据存储等 */
private void collidesWithPP() {
// 玩家飞机处于新生状态不进行此操作
if (pp[9] == 1 & pp[1] == 1 & gameState == GAME_CONTINUE
& gateState == GATE_CONTINUE) {
for (int i = 0; i < eb.length; i++) { // 敌人炮弹
if (eb[i][1] == 1) {
// 缩小玩家飞机碰撞区域为:20*20
if (collision(pp[3] + 7, pp[4] + 3, pp[6] - 14, pp[7] - 6,
eb[i][2], eb[i][3], eb[i][4], eb[i][5])) {
// 炮弹不再可见
eb[i][1] = 0;
// 动画数据存储
for (int k = 0; k < ppBlast.length; k++) {
// 找空位
if (ppBlast[k][0] == 0) {
// 爆炸可见
ppBlast[k][0] = 1;
// 爆炸帧
ppBlast[k][1] = 1;
// 爆炸x坐标
ppBlast[k][2] = pp[3] - 8;
// 爆炸y坐标
ppBlast[k][3] = pp[4] - 13;
}
}
// 玩家飞机生命值处理
pp[5] -= eb[i][6];
if (pp[5] <= 0) {
pp[1] = 0;
// 玩家飞机复活(在其中添加复活记录,并判断是否游戏失败)
ppRevival();
}
}
}
}
}
}
/** 玩家飞机复活 */
private void ppRevival() {
// 添加复活记录(共六次生命机会,可复活5次)
if (pp[1] == 0) {
pp[12]++;
if (pp[12] > LIFE) {
gateState = GATE_CLOSE;
} else {
// 在屏幕起始位置复活(也可以在原位复活,把死亡时的x、y赋值给中间变量,再转赋给新生后的x、y即可)
createPP();
}
}
}
/** 绘制玩家飞机爆炸动画 */
private void drawPPBlast(Grap
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -