📄 maincanvas.java
字号:
import java.io.InputStream;
import java.io.IOException;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import javax.microedition.io.Connector;
import javax.microedition.io.HttpConnection;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.lcdui.game.Sprite;
import javax.microedition.lcdui.Font;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.media.Manager;
import javax.microedition.media.MediaException;
import javax.microedition.media.Player;
import javax.microedition.rms.RecordStore;
import javax.microedition.io.file.FileConnection;
public class MainCanvas extends GameCanvas implements Runnable {
public static final int STATUS_MAINMENU = 0;
public static final int STATUS_MISSION_SELECTING = 1;
public static final int STATUS_MISSION_RUNNING = 2;
public static final int STATUS_OPTION = 3;
public static final int MISSION_PAUSE = 0;
public static final int MISSION_RUNNING = 1;
public static final int MISSION_FAIL = 2;
public static final int MISSION_COMPLETED = 3;
public static final int RIVER = 2;
public static final int TARGET = 3;
public static final int TOOL_POWER = 4; //无敌魔法
public static final int TOOL_TORCH = 5; //闪电魔法
public static final int TOOL_HAMMER = 6;
public static final int TOOL_WRENCH_CW = 7; //顺时针
public static final int TOOL_WRENCH_CCW = 8; //逆时针
public static final int TOOL_BOMB = 9;
public static final int TOOL_LASER_UP = 14;
public static final int TOOL_LASER_RIGHT = 15;
public static final int TOOL_LASER_DOWN = 16;
public static final int TOOL_LASER_LEFT = 17;
public static final int TOOL_MIRROR_CW = 18; //+45度
public static final int TOOL_MIRROR_CCW = 19; //-45度
public static final int STUFF_BOMB = 25;
public static final int STUFF_LASER_UP = 30;
public static final int STUFF_LASER_RIGHT = 31;
public static final int STUFF_LASER_DOWN = 32;
public static final int STUFF_LASER_LEFT = 33;
public static final int STUFF_MIRROR_CW = 34;
public static final int STUFF_MIRROR_CCW = 35;
public static final int STUFF_STONE = 36;
public static final int LASER = 64;
//当前屏幕显示状态
public int status;
//是否正在连接上网
public boolean isLinking = true;
//任务的当前执行状态
public static int missionStatus;
//游戏循环线程
private volatile Thread thread;
//副菜单显示状态
private static boolean subMenuVisible;
//主菜单当前选中的菜单项索引
private int mainMenuIndex;
//任务的页号
private int missionPageNum;
//当前选中的任务索引
private int missionSelectedIndex;
//副菜单当前选中的菜单项索引
private static int subMenuIndex;
//光标行位置
private int cursorRow;
//光标列位置
private int cursorColumn;
//主菜单菜单项的图片
private Image[] mainMenuItems = new Image[5];
//副菜单菜单项的图片
private static Image[] subMenuItems;
private Graphics g;
//游戏中需要使用的图片
public static Image[] number = new Image[11];
public static Image[] image_floors = new Image[2];
public static Image[] image_tools = new Image[16];
public static Image word_start;
public static Image word_continue;
public static Image word_setting;
public static Image word_option;
public static Image word_quit;
public static Image word_mission;
public static Image word_success;
public static Image word_failure;
public static Image word_back;
public static Image word_retry;
public static Image word_nextMission;
public static Image word_mainMenu;
public static Image image_logo;
public static Image image_hand;
public static Image image_cup;
public static Image image_explode;
public static Image image_ice;
public static Image image_target;
public static Image image_bomb;
public static Image image_mirror;
public static Image image_laser;
public static Image image_stone;
public static Image image_broking;
public static Image image_otta;
public static Image image_firing;
public static Image image_description;
public static Image image_toolbar;
public static Image image_infobar;
public static Image image_menubar;
public static Image image_bottom;
public static Image background;
public static Image window;
public static Image word2;
public static Image link;
public static Image select;
public static Image menub;
public static Image num;
public static Image hand;
public static Image level;
public static Image chen;
//读取文件的文件流
public InputStream input;
//任务开始的时间
private long startTime;
//一些动画精灵
private Sprite iceFloor;
private Sprite targetFloor;
private Sprite back;
//存储按键信息
private int keyPressed;
//任务描述的显示位置
private int descriptionX;
//使用的字体
private Font font = Font.getFont(Font.FACE_MONOSPACE, Font.STYLE_PLAIN, Font.SIZE_MEDIUM);
//一个增量用于实现闪现效果
private int incr;
//任务的总数
public static int missionCount = 6;
//玩家记录
public static byte[] record;
//选中的工具索引
public static int selectedToolIndex = -1;
//地图信息
public static byte[] temp = new byte[120];
//当前任务号
public static int missionNum;
//地面上的元素
public static int[][] base = new int[12][10];
//物体元素
public static Magic[][] stuffs = new Magic[12][10];
//道具包中的道具
public static int[] tools = new int[9];
//背景图片序列
public static int[] serial = new int[]
{0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,6,6,5,5,4,4,3,3,2,2,1,1};
//地面风格
public static int floor = 0;
//精灵
public static Otta otta;
//精灵初始行位置
public static int initRow;
//精灵初始列位置
public static int initColumn;
//道具包中预置的工具
public static byte[] initTools;
//默认播放器
public static Player[] players = new Player[3];
//自定义播放器
public static Player player_custom;
//声音播放器
public static Player playerWin;
//当前正在播放的播放器
public static Player nowPlayer;
//地图文件
public static Info info;
public MainCanvas() {
super(false);
try {
setFullScreenMode(true);
for (int i=0; i<players.length; i++) {
players[i] = Manager.createPlayer(
getClass().getResourceAsStream("/Sound/"+ (i+1) + ".mid"), "audio/midi");
}
nowPlayer = players[0];
playerWin = Manager.createPlayer(
getClass().getResourceAsStream("/Sound/win.mid"), "audio/midi");
initial();
info = new Info();
iceFloor = new Sprite(image_ice, 16, 16);
iceFloor.setFrameSequence(new int[] { 0, 1, 2, 1, 0 });
targetFloor = new Sprite(image_target, 16, 16);
targetFloor.setFrameSequence(new int[] { 0, 1, 1, 0 });
otta = new Otta();
back = new Sprite(background, 176, 220);
back.setFrameSequence(serial);
RecordStore recordStore = RecordStore.openRecordStore("Otta", true);
int num = recordStore.getNumRecords();
if (num < 1) {
record = new byte[4];
recordStore.addRecord(record, 0, record.length);
} else {
record = recordStore.getRecord(1);
}
recordStore.closeRecordStore();
System.gc();
} catch (Exception e) {
System.out.print(e.toString());
}
}
protected void showNotify() {
thread = new Thread(this);
thread.start();
playSound(nowPlayer, -1);
}
protected void hideNotify() {
thread = null;
}
protected void keyPressed(int keyCode) {
keyPressed = keyCode;
}
public void run() {
g = getGraphics();
while (thread == Thread.currentThread()) {
try {
Thread.sleep(Start.gameLoop);
incr = (incr + 1) % 8;
//清屏
if (status != STATUS_MISSION_RUNNING) {
g.setColor(0xFFFFFF);
g.fillRect(0, 0, 176, 220);
g.setColor(0x000000);
g.drawString("asda",0,0,0);
}
int lastKeyPressed = keyPressed;
keyPressed = 0;
switch (status) {
case STATUS_MAINMENU: // 主菜单
int menuCount = (missionStatus == MISSION_RUNNING) ? 5 : 4;
int menuS = 5 - menuCount;
switch (lastKeyPressed) {
case -2:
mainMenuIndex = (mainMenuIndex + 1) % menuCount;
break;
case -1:
mainMenuIndex = (mainMenuIndex - 1 + menuCount) % menuCount;
break;
case -5:
case -6:
Image selectedImage = mainMenuItems[mainMenuIndex + menuS];
if (selectedImage == word_start)
status = STATUS_MISSION_SELECTING;
else if (selectedImage == word_continue)
status = STATUS_MISSION_RUNNING;
else if (selectedImage == word_setting)
Start.showSetting();
else if (selectedImage == word_option)
status = STATUS_OPTION;
else if (selectedImage == word_quit)
Start.quitApp();
break;
}
back.paint(g);
back.nextFrame();
// 绘制LOGO
g.drawImage(image_logo, 21, 21, 20);
// 绘制光标
g.drawImage(select, 57, 120 + mainMenuIndex * 14, 20);
// 绘制菜单项
for (int i = menuS; i < mainMenuItems.length; i ++)
g.drawImage(mainMenuItems[i], 75, 120 + (i - menuS)* 14, 20);
break;
case STATUS_MISSION_SELECTING: // 任务选择菜单
switch(lastKeyPressed) {
case -1:
if (missionSelectedIndex > 0)
missionSelectedIndex--;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -