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 + -
显示快捷键?