📄 menu.java
字号:
/*
游戏菜单类
完成菜单的显示和操作,支持树结构
erduo
*/
package penguin;
import java.io.*;
import java.lang.Class;
import java.util.*;
import javax.microedition.lcdui.*;
public class Menu {
private MenuNode[] array_menu;
private int showType;
private MenuNode menuArrow;
public int menuSelect; //当前选择的菜单
public final static int SCREENWIDTH = 176;
public final static int SCREENHEIGHT = 208;
//创建3种属性,用来定义显示模式
public final static int LIST = 0;
public final static int SCROLL = 1;
public final static int RADIO = 2;
public int MENUITEMCELL; //菜单之间的间隔
//菜单的左上角座标
private int MENUITEMLEFT;
private int MENUITEMTOP;
//用来储存当前需要显示的菜单(有些菜单属于子菜单)
private int[] showMenu = new int[20];
//构造函数 参数是 菜单数组,指针对象,左上角x,y座标,显示模式
public Menu(MenuNode[] array_menu, MenuNode menuArrow,int MENUITEMLEFT,int MENUITEMTOP,int showType) {
this.array_menu = array_menu;
this.menuArrow = menuArrow;
this.showType = showType;
this.MENUITEMLEFT = MENUITEMLEFT;
this.MENUITEMTOP = MENUITEMTOP;
MENUITEMCELL = 4;
menuSelect = 0;
}
//返回上级菜单
public void MenuBack() {
int parent = array_menu[menuSelect].parent;
if (parent != -1) {
menuSelect = parent;
}
return;
}
//选择上一个菜单
public void MenuUp() {
int parent, i;
int start = 0, end = 0;
parent = array_menu[menuSelect].parent;
for (i = 0; i < array_menu.length; i++) {
if (array_menu[i].parent == parent) {
if (start == end) {
start = i;
end = start;
}
end++;
}
}
if (menuSelect == start) {
menuSelect = end - 1;
}
else {
menuSelect--;
}
return;
}
//下一个菜单
public void MenuDown() {
int parent, i;
int start = 0, end = 0;
parent = array_menu[menuSelect].parent;
for (i = 0; i < array_menu.length; i++) {
if (array_menu[i].parent == parent) {
if (start == end) {
start = i;
end = start;
}
end++;
}
}
if (menuSelect == end - 1) {
menuSelect = start;
}
else {
menuSelect++;
}
}
//执行当前菜单
public int MenuOK() {
int i;
int parent;
int re_state = array_menu[menuSelect].state;
parent = array_menu[menuSelect].parent;
for (i = 0; i < array_menu.length; i++) {
if (array_menu[i].parent == menuSelect) {
menuSelect = i;
break;
}
}
//没有当前菜单的子菜单
if (i == array_menu.length) {
re_state = array_menu[menuSelect].state;
if(parent!=-1) menuSelect = parent;
}
return (re_state);
}
//画图函数,和Screen里面的一样
public static void drawImageEx(Graphics g, Image image, int destX,
int destY, int srcX, int srcY, int width,
int height) {
g.setClip(destX, destY, width, height);
g.drawImage(image, destX - srcX, destY - srcY, 0);
}
//显示菜单的函数,在screen的paint函数中调用
public void paint(Graphics g,Image menuImage) {
int nowParent = array_menu[menuSelect].parent;
switch (showType) {
//列表模式:像pauseMenu那样的
case LIST:
int menuNum = 0; //统计当前需要显示的菜单数量
int arrowNum = 0; //指针的位置
int menuHeight=-1; //记录最大的菜单高度
boolean arrowFlag = true; //控制arrowNum的变量
for (int i = 0; i < array_menu.length; i++) {
if (array_menu[i].parent == nowParent) {
if(menuHeight==-1) menuHeight=array_menu[i].h;
//画菜单
drawImageEx(g, menuImage, MENUITEMLEFT,
MENUITEMTOP +
(array_menu[i].h + MENUITEMCELL) *
menuNum,
array_menu[i].x, array_menu[i].y,
array_menu[i].w,
array_menu[i].h);
menuNum++;
//计算指针的位置
if (arrowFlag) {
if (i != menuSelect) {
arrowNum++;
}
else {
arrowFlag = false;
}
}
}
}
//防止指针溢出
if(arrowNum>array_menu.length-1) arrowNum=array_menu.length-1;
//画指针
drawImageEx(g, menuImage, MENUITEMLEFT - menuArrow.w-5,
MENUITEMTOP +
(menuHeight + MENUITEMCELL) *
arrowNum,
menuArrow.x, menuArrow.y, menuArrow.w,
menuArrow.h);
break;
//卷轴的画法,例如MainMenu
case SCROLL:
int countMenu = 0;
int maxMenu;
for (int i = 0; i < array_menu.length; i++) {
if (array_menu[i].parent == nowParent) {
showMenu[countMenu] = i;
countMenu++;
}
}
maxMenu = countMenu;
int i;
//记录3个要显示的菜单
int firstMenu = -1;
int lastMenu = -1;
int nowMenu = -1;
int max_width = 0;//保存最大的宽度
try {
for (i = 0; i < maxMenu; i++) {
if (showMenu[i] == menuSelect) {
nowMenu = i;
break;
}
}
firstMenu = nowMenu - 1;
lastMenu = nowMenu + 1;
if (nowMenu == 0) {
firstMenu = maxMenu - 1;
}
if (nowMenu == maxMenu - 1) {
lastMenu = 0;
}
firstMenu = showMenu[firstMenu];
lastMenu = showMenu[lastMenu];
nowMenu = showMenu[nowMenu];
if (array_menu[firstMenu].w > max_width) {
max_width = array_menu[firstMenu].w;
}
if (array_menu[nowMenu].w > max_width) {
max_width = array_menu[nowMenu].w;
}
if (array_menu[lastMenu].w > max_width) {
max_width = array_menu[lastMenu].w;
}
MENUITEMLEFT = (SCREENWIDTH - max_width) / 2;
//清除上下两个菜单的背景
g.setColor(18, 166, 255);
g.fillRect(MENUITEMLEFT,
MENUITEMTOP,
array_menu[firstMenu].w,
array_menu[firstMenu].h);
g.setColor(69, 187, 255);
g.fillRect(MENUITEMLEFT,
MENUITEMTOP + array_menu[firstMenu].h +
MENUITEMCELL + array_menu[nowMenu].h +
MENUITEMCELL,
array_menu[lastMenu].w,
array_menu[lastMenu].h);
if ( (firstMenu != -1) && (lastMenu != -1)) {
//画指针
drawImageEx(g, menuImage,
MENUITEMLEFT -
(menuArrow.w - max_width) / 2,
MENUITEMTOP + array_menu[firstMenu].h +
MENUITEMCELL -
(menuArrow.h - array_menu[nowMenu].h) / 2,
menuArrow.x, menuArrow.y, menuArrow.w,
menuArrow.h);
//画3个菜单
drawImageEx(g, menuImage, MENUITEMLEFT, MENUITEMTOP,
array_menu[firstMenu].x,
array_menu[firstMenu].y,
array_menu[firstMenu].w,
array_menu[firstMenu].h);
drawImageEx(g, menuImage, MENUITEMLEFT,
MENUITEMTOP + array_menu[firstMenu].h +
MENUITEMCELL,
array_menu[nowMenu].x, array_menu[nowMenu].y,
array_menu[nowMenu].w, array_menu[nowMenu].h);
drawImageEx(g, menuImage, MENUITEMLEFT,
MENUITEMTOP + array_menu[firstMenu].h +
MENUITEMCELL + array_menu[nowMenu].h +
MENUITEMCELL,
array_menu[lastMenu].x,
array_menu[lastMenu].y,
array_menu[lastMenu].w,
array_menu[lastMenu].h);
}
}
catch (Exception e) {}
break;
//左右按钮的画法,如UploadMenu
case RADIO:
//画菜单
for (i=0; i<array_menu.length; i++){
drawImageEx(g, menuImage, MENUITEMLEFT+i*MENUITEMCELL,
MENUITEMTOP,
array_menu[i].x + (menuSelect*array_menu[i].w),
array_menu[i].y,
array_menu[i].w,
array_menu[i].h);
}
//画光标
drawImageEx(g, menuImage, (MENUITEMLEFT-(menuArrow.w-array_menu[menuSelect].w)/2)+(1-menuSelect)*MENUITEMCELL,
MENUITEMTOP-(menuArrow.h-array_menu[menuSelect].h)/2,
menuArrow.x, menuArrow.y, menuArrow.w, menuArrow.h);//方框
break;
default:
break;
}
}
}
class MenuNode {
int parent;
int x;
int y;
int w;
int h;
int state;
public MenuNode(int parent, int x, int y, int w, int h, int state) {
this.parent = parent;
this.x = x;
this.y = y;
this.w = w;
this.h = h;
this.state = state;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -