⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 menu.java

📁 自己开发的打企鹅小游戏
💻 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 + -