S3D-Flood-It/src/Menu.java

326 lines
9.3 KiB
Java
Raw Normal View History

2018-11-15 00:06:29 +02:00
/*
* 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;
}
}