gamemidlet.java
来自「J2ME的游戏原代码!希望能帮助有需要帮助的师兄弟们!」· Java 代码 · 共 925 行 · 第 1/3 页
JAVA
925 行
// package javagapi;import java.io.*;import javax.microedition.midlet.*;import javax.microedition.lcdui.*;import javax.microedition.rms.RecordStore;import javax.microedition.rms.InvalidRecordIDException;/** Remains to implement: progress bar for loading images. * should have last_menu reference for back_cmd. * In order to use this abstract class, a subclass that implements * createCanvas() must be created. The purpose of createCanvas() is * to return a new object that has the type of an appropriate * subclass of GameShell. This means that for each game, there must * be one subclass of GameShell as well as one subclass of GameMIDlet. */public abstract class GameMIDlet extends MIDlet implements CommandListener{ // constants static Command BACK_CMD, OK_CMD, HSCLEAR_CMD; //, HSSEND_CMD; THIS IS USED IF SEND HIGH SCORE FUNCTIONALITY IS ENABLED GAEvent curEvent; public Display display; GameShell canvas; private static boolean lock; List mainMenu, newGameMenu, optionsMenu, languageMenu, difficultyMenu, soundMenu, forbiddenMenu, colorMenu; TextBox tb, he; GAMenuSelectObject_t mso = null; /** * Main Game Menu */ int RESUME = -1; int NEW_GAME = -1; int SET_BIRTH_DATE = -1; int OPTIONS = -1; int HIGHSCORE = -1; int HELP = -1; int QUIT = -1; /** * Difficulty Menu */ int VERY_EASY = -1; int EASY = -1; int MEDIUM = -1; int HARD = -1; int VERY_HARD = -1; /** * New Game Menu */ int SINGLE = -1; int TWO_ON_SAME = -1; /** * Options Menu */ // Not supported: int SOUND = -1; int SOUNDON = -1; int SOUNDOFF = -1; int FORBIDDEN = -1; int FORBIDDENON = -1; int FORBIDDENOFF = -1; int COLOR = -1; int COLORBLACK = -1; int COLORWHITE = -1; int LANGUAGE = -1; public static short lang = 0; public GameMIDlet() { display = Display.getDisplay(this); curEvent = new GAEvent(); } public void startApp() { lang = GetLang(); if (lang != -1) { doInitMenus(); GameSplash gameSplash = new GameSplash(canvas, display, mainMenu); Thread thread = new Thread(gameSplash); thread.start(); display.setCurrent(gameSplash); //display.setCurrent(mainMenu); } else { lang = 0; doInitMenus(); GameSplash gameSplash = new GameSplash(canvas, display, languageMenu); Thread thread = new Thread(gameSplash); thread.start(); display.setCurrent(gameSplash); //display.setCurrent(languageMenu); } } /** * Returns a new instance of the appropriate subclass of GameShell for * the game that corresponds to a specific subclass of GameMIDlet. * This is abstract, as is GameShell, so it must be implemented by * a non-abstract subclass of GameMIDlet. * * @returns a new instance of the appropriate subclass of GameShell. */ protected abstract GameShell createCanvas(); protected void doInitMenus() { /* there should be some message indicating to wait for images to load possibly even a progress bar. maybe this should be done when menus are finished. */ unLockCommandAction(); canvas = createCanvas(); canvas.setMIDlet(this); //new Thread(canvas).start(); if (mso == null) mso = canvas.GAGetMenuSetting(); mso.birthDate = new StringBuffer(); mso.hsName = new StringBuffer(); // Menus are created in startApp since they depend on // the game as well as the phone. // 1. send a GAGetMenuSetting event to game event loop // 2. look at GAMenuSelectObject to find out which menus to draw. // initialize first event (GAGetMenuSetting); curEvent.type = GameShell.GAMenuSettingsEvent; // send first event to game.main loop canvas.gameMain(curEvent); canvas.setCommandListener(this); setUpMenus(); } private void setUpMenus() { OK_CMD = new Command(Lang.labels[lang][Lang.GUI_OK_SK], Command.OK, 1); BACK_CMD = new Command(Lang.labels[lang][Lang.GUI_BACK_SK], Command.BACK, 2); HSCLEAR_CMD = new Command(Lang.labels[lang][Lang.MENU_GAMES_HIGHSCORE_CLR_TXT], Command.SCREEN, 3); // THIS IS USED IF SEND HIGH SCORE FUNCTIONALITY IS ENABLED: // HSSEND_CMD = new Command(Lang.labels[lang][Lang.MENU_GAMES_SEND_TXT], Command.SCREEN, 3); canvas.addCommand(OK_CMD); canvas.addCommand(BACK_CMD); // MAIN MENU int i = 0; mainMenu = new List(canvas.getGameName(), Choice.IMPLICIT); if ((mso.AllowStartMode & GameShell.GAM_START_RESUME) != 0) { mainMenu.append(Lang.labels[lang][Lang.MENU_GAMES_RESUME_TXT], null); RESUME = i++; } if ((mso.AllowStartMode & GameShell.GAM_START_NEW) != 0) { mainMenu.append(Lang.labels[lang][Lang.MENU_GAMES_NEWGAME_TXT], null); NEW_GAME = i++; } if ((mso.AllowStartMode & GameShell.GAM_START_SETBIRTHDATE) != 0) { mainMenu.append(Lang.labels[lang][Lang.MENU_GAMES_BR_SETBDATE_TXT], null); SET_BIRTH_DATE = i++; } if (mso.AllowOptions != 0 && mso.AllowOptions != GameShell.GAM_OPT_SOUND) { mainMenu.append(Lang.labels[lang][Lang.MENU_GAMES_OPTIONS_TXT], null); OPTIONS = i++; } if (mso.AllowHighScore != 0) { mainMenu.append(Lang.labels[lang][Lang.MENU_GAMES_HIGHSCORE_TXT], null); HIGHSCORE = i++; } mainMenu.append(Lang.labels[lang][Lang.MENU_GAMES_HELP_TXT], null); HELP = i++; mainMenu.append("Quit", null); QUIT = i++; mainMenu.setCommandListener(this); // DIFFICULTY MENU // nb: The options in the submenus must be generated // depending on the settings retrieved. // one or both of 1. choose players, 2. choose difficulty // ????????? consider AllowSinglelevels and AllowTwoonSameLevels i = 0; difficultyMenu = new List(Lang.labels[lang][Lang.MENU_GAMES_LEVEL_TXT], Choice.IMPLICIT); if ((mso.AllowSingleLevels & GameShell.GAM_LEVEL_VERYEASY) != 0) { difficultyMenu.append(Lang.labels[lang][Lang.MENU_GAMES_VERY_EASY_TXT], null); VERY_EASY = i++; canvas.DiffWidth = 2; } if ((mso.AllowSingleLevels & GameShell.GAM_LEVEL_EASY) != 0) { difficultyMenu.append(Lang.labels[lang][Lang.MENU_GAMES_EASY_TXT], null); EASY = i++; canvas.DiffWidth = 1; } if ((mso.AllowSingleLevels & GameShell.GAM_LEVEL_MEDIUM) != 0) { difficultyMenu.append(Lang.labels[lang][Lang.MENU_GAMES_MEDIUM_TXT], null); MEDIUM = i++; canvas.DiffWidth = 1; } if ((mso.AllowSingleLevels & GameShell.GAM_LEVEL_HARD) != 0) { difficultyMenu.append(Lang.labels[lang][Lang.MENU_GAMES_HARD_TXT], null); HARD = i++; canvas.DiffWidth = 1; } if ((mso.AllowSingleLevels & GameShell.GAM_LEVEL_VERYHARD) != 0) { difficultyMenu.append(Lang.labels[lang][Lang.MENU_GAMES_VERY_HARD_TXT], null); VERY_HARD = i++; canvas.DiffWidth = 2; } difficultyMenu.addCommand(BACK_CMD); difficultyMenu.setCommandListener(this); // NEW GAME MENU // is inserted if not only GAM_OPP_PHONE is allowed // this could be changed to "if two on same is allowd" i = 0; if (mso.AllowOpponents != GameShell.GAM_OPP_PHONE ) { newGameMenu = new List(Lang.labels[lang][Lang.MENU_GAMES_NEWGAME_TXT], Choice.IMPLICIT); if ((mso.AllowOpponents & GameShell.GAM_OPP_PHONE) != 0) { newGameMenu.append(Lang.labels[lang][Lang.MENU_GAMES_SINGLE_TXT], null); SINGLE = i++; } if ((mso.AllowOpponents & GameShell.GAM_OPP_SAME_PHONE) != 0) { newGameMenu.append(Lang.labels[lang][Lang.MENU_GAMES_TWOONONE_TXT], null); TWO_ON_SAME = i++; } newGameMenu.addCommand(BACK_CMD); newGameMenu.setCommandListener(this); } // OPTIONS MENU if (mso.AllowOptions != 0 && mso.AllowOptions != GameShell.GAM_OPT_SOUND) { i = 0; optionsMenu = new List(Lang.labels[lang][Lang.MENU_GAMES_OPTIONS_TXT], Choice.IMPLICIT); if ((mso.AllowOptions & GameShell.GAM_OPT_LANGUAGE) != 0) { optionsMenu.append(Lang.labels[lang][Lang.MENU_LANGUAGE_TXT], null); LANGUAGE = i++; } if ((mso.AllowOptions & GameShell.GAM_OPT_SOUND) != 0) { optionsMenu.append(Lang.labels[lang][Lang.MENU_GAMES_SOUND_TXT], null); SOUND = i++; } if ((mso.AllowOptions & GameShell.GAM_OPT_FORBIDDEN_RULES) != 0) { optionsMenu.append(Lang.labels[lang][Lang.MENU_GAMES_FORBIDDEN_RULES_TXT], null); FORBIDDEN = i++; } if ((mso.AllowOptions & GameShell.GAM_OPT_PLAYER_SIDE_BLACK) != 0 || (mso.AllowOptions & GameShell.GAM_OPT_PLAYER_SIDE_WHITE) != 0) { optionsMenu.append(Lang.labels[lang][Lang.MENU_GAMES_RENJU_SELECT_USER_SIDE_TXT], null); COLOR = i++; } /* { String str = "Player Side ???"; if ((mso.SelOptions & GameShell.GAM_OPT_PLAYER_SIDE_BLACK) != 0) str = "Player Side Black"; else if ((mso.SelOptions & GameShell.GAM_OPT_PLAYER_SIDE_WHITE) != 0) str = "Player Side White";
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?