326 lines
9.3 KiB
Java
326 lines
9.3 KiB
Java
/*
|
|
* 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;
|
|
}
|
|
} |