/* * aNNiMON 2012 * For more info visit http://annimon.com/ */ import com.s3d.Matrix3D; import com.s3d.Camera; import javax.microedition.lcdui.Canvas; import javax.microedition.lcdui.Font; import javax.microedition.lcdui.Graphics; import javax.microedition.lcdui.Image; /** * @author aNNiMON */ public class Menu extends Canvas implements Runnable { private static final byte MENU_MAIN = 0, MENU_OPTIONS = 1, ITEM_HIGHSCORES = 2, ITEM_SET_SIZE = 3; // настройка размера поля private static boolean threadRun; /* Двойная буферизация */ private Graphics G; private Image I; /* Меню */ private byte activeMenu; /* Шрифт меню */ private Font font; private int fontHeight; /* Матрица, необходимая для отрисовки текста */ private Matrix3D matrix; private int[] menuCursor; private String[][] menuItems; /* Углы поворота модели */ private float rotY, rotZ; /* Настройки */ private int tableSize; /* Опции */ private int scoreTableSize; /* Трёхмерный текст на фоне */ private Text3D text; /* Размер экрана */ private int w, h; public Menu() { setFullScreenMode(true); w = getWidth(); h = getHeight(); I = Image.createImage(w, h); G = I.getGraphics(); // Шрифт font = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_MEDIUM); fontHeight = font.getHeight() + 2; // Меню activeMenu = MENU_MAIN; menuCursor = new int[2]; menuCursor[MENU_MAIN] = 0; menuCursor[MENU_OPTIONS] = 0; menuItems = new String[2][]; initMenuStrings(); // Углы поворота rotY = 0; rotZ = 0; // Настройки tableSize = Rms.lastTableSize; scoreTableSize = Rms.lastTableSize; Camera.w = w; Camera.h = h; Camera.limit = 3000; matrix = new Matrix3D(); text = new Text3D(); text.setText("Flood-It"); new Thread(this).start(); threadRun = true; } private void initMenuStrings() { menuItems[MENU_MAIN] = new String[] { Language.getMessage(Language.START), Language.getMessage(Language.HIGH_SCORE), Language.getMessage(Language.OPTIONS), Language.getMessage(Language.HELP), Language.getMessage(Language.EXIT) }; menuItems[MENU_OPTIONS] = new String[] { Language.getMessage(Language.TABLE_SIZE), Language.getMessage(Language.LANGUAGE), Language.getMessage(Language.RESET_SCORES), Language.getMessage(Language.BACK) }; } public static void showMenu() { threadRun = true; Main.midlet.dsp.setCurrent(Main.midlet.menu); } public void paint(Graphics g) { draw(G); g.drawImage(I, 0, 0, Graphics.TOP | Graphics.LEFT); } /* Отрисовка в буфер */ private void draw(Graphics g) { g.setColor(0x00); g.fillRect(0, 0, w, h); if (activeMenu != ITEM_SET_SIZE) text.paint(g, matrix); g.setFont(font); if (activeMenu == ITEM_HIGHSCORES) { // Лучшие результаты Main.midlet.hiscore.paintResults(g, scoreTableSize); } else if (activeMenu == ITEM_SET_SIZE) { // Установка размера поля Main.midlet.floodit.paintTableOptions(g, tableSize); } else { // Отрисовываем фон курсора int menuY = h - menuItems[activeMenu].length * fontHeight; int menuW = w / 2; int menuX = w / 2 - menuW / 2; g.setGrayScale(100); g.fillRect(menuX, menuY + menuCursor[activeMenu] * fontHeight, menuW, fontHeight); g.setGrayScale(255); for (int i = 0; i < menuItems[activeMenu].length; i++) { g.drawString(menuItems[activeMenu][i], w / 2, menuY + i * fontHeight, Graphics.HCENTER | Graphics.TOP); } } } /** * Преобразования */ private void conversions() { // Сбросываем настройки матрицы matrix.unit(); // Поворачиваем по всем осям matrix.yrot(rotY); // matrix.yrot(0); matrix.zrot(rotZ); rotY += 0.1; rotZ += 0.2; if (rotY > 360) rotY = 1; if (rotZ > 360) rotZ = 1; // Устанавливаем координаты модели // matrix.translate(modelX, modelY, modelZ); matrix.translate(0, h, 1600); } private void menuAction() { if (activeMenu == MENU_MAIN) { switch (menuCursor[activeMenu]) { case 0: // Start Game threadRun = false; Main.midlet.floodit.game.setTableSize(tableSize); Main.midlet.dsp.setCurrent(Main.midlet.floodit); break; case 1: // Hi-scores activeMenu = ITEM_HIGHSCORES; break; case 2: // Options activeMenu = MENU_OPTIONS; break; case 3: // Help threadRun = false; Main.midlet.about.setBackground(I); Main.midlet.dsp.setCurrent(Main.midlet.about); break; case 4: // Exit Main.midlet.destroyApp(true); break; } } else if (activeMenu == MENU_OPTIONS) { switch (menuCursor[activeMenu]) { case 0: activeMenu = ITEM_SET_SIZE; break; case 1: Language.nextLanguage(); initMenuStrings(); Main.midlet.about = new About("about."+Language.getCurrentLanguage()); break; case 2: Main.midlet.hiscore.resetHiscores(); activeMenu = MENU_MAIN; break; case 3:// Back activeMenu = MENU_MAIN; break; } } } protected void sizeChanged(int w, int h) { this.w = getWidth(); this.h = getHeight(); I = Image.createImage(w, h); G = I.getGraphics(); super.sizeChanged(w, h); } protected void keyPressed(int key) { int ga = getGameAction(key); if (activeMenu == ITEM_SET_SIZE) { keyTableOptions(ga, key); } else if (activeMenu == ITEM_HIGHSCORES) { keyHiscore(ga, key); } else keyMenu(ga, key); } protected void keyRepeated(int key) { keyPressed(key); } public void run() { while (true) { if (threadRun) { conversions(); repaint(); } try { Thread.sleep(5L); } catch (InterruptedException ex) { ex.printStackTrace(); } } } private void keyMenu(int ga, int key) { switch (ga) { case FIRE: menuAction(); break; case LEFT: case UP: menuCursor[activeMenu]--; if (menuCursor[activeMenu] < 0) { menuCursor[activeMenu] = menuItems[activeMenu].length - 1; } break; case RIGHT: case DOWN: menuCursor[activeMenu]++; if (menuCursor[activeMenu] >= menuItems[activeMenu].length) { menuCursor[activeMenu] = 0; } break; default: if ((key == -7) || (key == -6) || (key == KEY_STAR)) { // Если в подменю - возврашаемся if (activeMenu != MENU_MAIN) { activeMenu = MENU_MAIN; // Иначе выходим } else { Main.midlet.destroyApp(true); } } } } private void keyTableOptions(int ga, int key) { // Настройки размера окна if ((ga == FIRE) || (key == -7) || (key == -6) || (key == KEY_STAR)) { activeMenu = MENU_OPTIONS; } else tableSize = changeTableSize(ga, key, tableSize); } private void keyHiscore(int ga, int key) { // Настройки размера окна if ((ga == FIRE) || (key == -7) || (key == -6) || (key == KEY_STAR)) { activeMenu = MENU_MAIN; } else scoreTableSize = changeTableSize(ga, key, scoreTableSize); } private int changeTableSize(int ga, int key, int size) { // смена размера окна switch (ga) { case LEFT: case DOWN: if (size > Main.MIN_TABLE_SIZE) { size--; } break; case RIGHT: case UP: if (size < Main.MAX_TABLE_SIZE) { size++; } break; } return size; } }