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

📄 defaultmenupainter.java

📁 J2ME 3D 第一人称射击迷宫类手机游戏源码。
💻 JAVA
字号:
package myGame.gui.menu;

import javax.microedition.lcdui.Font;
import javax.microedition.lcdui.Image;

import javax.microedition.lcdui.Graphics;

/**
 * A default implementation of <code>MenuPainter</code>. Transitions are
 * implemented as an horizontal movement. Items a rendered using normal MIDP
 * text methods.
 * 
 * @author YuBingxing
 */
public class DefaultMenuPainter implements MenuPainter {
	/** Font of the page title */
	protected Font m_titleFont = Font.getFont(Font.FACE_PROPORTIONAL,
			Font.STYLE_BOLD, Font.SIZE_LARGE);

	/** Font of items */
	protected Font m_itemFont = Font.getFont(Font.FACE_PROPORTIONAL,
			Font.STYLE_BOLD, Font.SIZE_MEDIUM);

	/** Page title color */
	protected int m_titleColor = 0xffffff;

	/** Page title back color */
	protected int m_titleBackColor = 0x880000;

	/** Enabled item label color */
	protected int m_itemColor = 0x00ffff;

	/** Disabled item label color */
	protected int m_itemColorDisabled = 0x888888;

	/** Selected item label color */
	protected int m_selItemColor = 0xffffff;

	protected int m_imgPadding = 4;

	public void paintMenu(Graphics g, MenuPage menu, int x, int y, int width,
			int height) {
		paintMenu(g, menu, x, y, width, height, false, false);
	}

	/**
	 * Paints a menu.
	 * 
	 * @param g
	 *            The graphics context to draw to.
	 * @param menu
	 *            The menu to draw.
	 * @param x
	 *            Offset x coordinate.
	 * @param y
	 *            Offset y coordinate.
	 * @param width
	 *            The width of the menu.
	 * @param height
	 *            The height of the menu.
	 * @param to
	 *            True if transition to this page, false if transition from or
	 *            no transition.
	 * @param from
	 *            True if transition from this page, false if transition to or
	 *            no transition.
	 */
	protected void paintMenu(Graphics g, MenuPage page, int x, int y,
			int width, int height, boolean to, boolean from) {
		if (page == null)
			return;
		int tHeight = m_titleFont.getHeight();
		int iHeight = m_itemFont.getHeight();
		paintTitle(g, page, x + width / 2, y, width);
		paintItems(g, page, x, y + getTitleHeight(page) + 8, width, height, to,
				from);
	}

	/**
	 * Calls paintMenu twice with the two pages, plus an x offset for each menu
	 * to visualize the transition.
	 */
	public void paintTransition(Graphics g, MenuPage fromMenu, MenuPage toMenu,
			int x, int y, int width, int height, int frame, int frames,
			boolean back) {
		double percent = (double) frame / (double) frames;
		int dx = (int) (width * Math.sin(Math.PI / 2d * percent));
		int sign = back ? -1 : 1;
		paintMenu(g, fromMenu, -dx * sign, y, width, height, false, true);
		paintMenu(g, toMenu, sign * (width - dx), y, width, height, true, false);
	}

	/**
	 * Draws a page title horizontally centered around specified coordinates.
	 * 
	 * @param g
	 *            Graphics context to paint on.
	 * @param page
	 *            The page with the title.
	 * @param x
	 *            X coordinate of title, title is centered around this.
	 * @param y
	 *            Y coordinate of title, denoting top of text.
	 * @param w
	 *            Width of the menu.
	 */
	protected void paintTitle(Graphics g, MenuPage page, int x, int y, int w) {
		char[] title = page.getTitle();
		Image img = page.getTitleImage();
		int imgW = 0;
		int imgH = 0;
		int txtW = 0;
		int txtH = m_itemFont.getHeight();
		int layout = page.getLayout();
		boolean imgLeft = layout == MenuPage.LAYOUT_LEFT;

		if (title != null) {
			txtW = m_itemFont.charsWidth(title, 0, title.length);
		}
		if (img != null) {
			imgW = img.getWidth();
			imgH = img.getHeight();
		}

		int totW = imgW + txtW + ((imgW == 0 || txtW == 0) ? 0 : m_imgPadding);
		int totH = Math.max(imgH, txtH);

		// draw image if any
		if (img != null) {
			int dx = imgLeft ? (-totW / 2 - imgW) : (txtW / 2);
			g.drawImage(img, x + dx, y + (totH - imgH) / 2, Graphics.TOP
					| Graphics.LEFT);
			imgW += m_imgPadding;
		}

		// draw title if any
		if (title != null) {
			int dx = imgLeft ? (imgW / 2) : (-imgW / 2);
			g.setFont(m_titleFont);
			g.setColor(m_titleBackColor);
			g.drawChars(title, 0, title.length, x + dx + 1, y + (totH - txtH)
					/ 2 + 1, Graphics.TOP | Graphics.HCENTER);
			g.setColor(m_titleColor);
			g.drawChars(title, 0, title.length, x + dx, y + (totH - txtH) / 2,
					Graphics.TOP | Graphics.HCENTER);
		}
	}

	/**
	 * Paints all items in a page. This methods checks height of each item and
	 * sorts out exactly what items to paint according to currently selected
	 * item. Calls <code>getItemHeight</code> for items to determine how to
	 * fit items, and then calls <code>paintItem</code> for those items it
	 * seems fit to draw.
	 * 
	 * @param g
	 *            Graphics context to draw to.
	 * @param page
	 *            The page containing all items.
	 * @param x
	 *            X offset coordinate.
	 * @param y
	 *            Y offset coordinate.
	 * @param w
	 *            Width of menu, to determine how to horizontally centralize
	 *            items.
	 * @param h
	 *            Height of menu, to determine how many items to draw.
	 * @param to
	 *            True if transition to this item, false if transition from or
	 *            no transition.
	 * @param from
	 *            True if transition from this item, false if transition to or
	 *            no transition.
	 */
	protected void paintItems(Graphics g, MenuPage page, int x, int y, int w,
			int h, boolean to, boolean from) {
		int selectedIndex = page.getSelectedIndex();
		PageItem selectedItem = page.itemAt(selectedIndex);
		PageItem itemBelow = page.itemAt(selectedIndex + 1);
		itemBelow = itemBelow == null ? selectedItem : itemBelow;

		// Find number of items that we can show in the viewport,
		// try having the selected near middle
		int startIndex = selectedIndex < 0 ? 0 : selectedIndex;
		int size = page.size();
		if (selectedItem != null) {
			int topIndex = selectedIndex;
			int endIndex = selectedIndex;
			int yLeft = h - y - getItemHeight(selectedItem)
					- getItemHeight(itemBelow);
			// check item under and above
			// until viewport is filled or all items are added
			do {
				if (endIndex < size - 1) {
					endIndex++;
					yLeft -= getItemHeight(page.itemAt(endIndex));
				}
				if (yLeft > 0 && topIndex > 0) {
					topIndex--;
					yLeft -= getItemHeight(page.itemAt(topIndex));
				}
			} while (yLeft > 0 && (topIndex > 0 || endIndex < size - 1));

			startIndex = topIndex;
		}

		// Find max width
		int iMaxW = 0;
		for (int i = startIndex < 0 ? 0 : startIndex; i < size; i++) {
			iMaxW = Math.max(iMaxW, getItemWidth(page.itemAt(i)));
		}
		// Draw items
		for (int i = startIndex < 0 ? 0 : startIndex; i < size; i++) {
			boolean selected = i == selectedIndex;
			PageItem item = page.itemAt(i);
			paintItem(g, item, selected, x + w / 2, y, w, iMaxW, to, from);
			y += getItemHeight(item);
			if (y >= h) {
				break;
			}
		}
	}

	/**
	 * Paints one single item. If the item has an image, the image will be
	 * painted to the left of the label text.
	 * 
	 * @param g
	 *            The graphics context to draw to.
	 * @param item
	 *            The item to paint.
	 * @param selected
	 *            If this item is selected or not.
	 * @param x
	 *            X coordinate, item will be centered around this.
	 * @param y
	 *            Y coordinate, denoting top of item
	 * @param w
	 *            Width of menu, to determine center.
	 * @param iMaxW
	 *            Maximum width of all visible items, for alignment.
	 * @param to
	 *            True if transition to this item, false if transition from or
	 *            no transition.
	 * @param from
	 *            True if transition from this item, false if transition to or
	 *            no transition.
	 */
	protected void paintItem(Graphics g, PageItem item, boolean selected,
			int x, int y, int w, int iMaxW, boolean to, boolean from) {
		char[] label = item.getLabel();
		boolean enabled = item.isEnabled();
		Image img = item.getImage();
		int imgW = 0;
		int imgH = 0;
		int txtW = 0;
		int txtH = m_itemFont.getHeight();
		int layout = item.getLayout();
		boolean align = layout == PageItem.LAYOUT_ALIGN_LEFT
				| layout == PageItem.LAYOUT_ALIGN_RIGHT;
		boolean imgLeft = layout == PageItem.LAYOUT_CENTERED_LEFT
				| layout == PageItem.LAYOUT_ALIGN_LEFT;

		if (label != null) {
			txtW = m_itemFont.charsWidth(label, 0, label.length);
		}
		if (img != null) {
			imgW = img.getWidth();
			imgH = img.getHeight();
		}

		int totW = imgW + txtW + ((imgW == 0 || txtW == 0) ? 0 : m_imgPadding);
		int totH = Math.max(imgH, txtH);

		// draw image if any
		if (img != null) {
			int dx = 0;
			if (align) {
				dx = imgLeft ? (-iMaxW / 2) : (iMaxW / 2 - imgW);
			} else {
				dx = imgLeft ? (-totW / 2 - imgW) : (txtW / 2);
			}
			g.drawImage(img, x + dx, y + (totH - imgH) / 2, Graphics.TOP
					| Graphics.LEFT);
			imgW += m_imgPadding;
		}

		// draw label if any
		if (label != null) {
			if (!selected) {
				g.setColor(enabled ? m_itemColor : m_itemColorDisabled);
			} else {
				g.setColor(m_selItemColor);
			}
			int dx = 0;
			if (align) {
				dx = imgLeft ? ((iMaxW - txtW) / 2) : (-(iMaxW - txtW) / 2);
			} else {
				dx = imgLeft ? (imgW / 2) : (-imgW / 2);
			}
			g.setFont(m_itemFont);
			g.drawChars(label, 0, label.length, x + dx, y + (totH - txtH) / 2,
					Graphics.TOP | Graphics.HCENTER);
		}
	}

	/**
	 * Returns the height of a title. Simply returns height of title font.
	 * 
	 * @param menu
	 *            The menu with title whose height to return.
	 * @return The title height.
	 */
	protected int getTitleHeight(MenuPage menu) {
		return m_titleFont.getHeight();
	}

	/**
	 * Returns the height of an item. Takes the maximum value of height of image
	 * and height of item font.
	 * 
	 * @param item
	 *            The item whose height to return.
	 * @return The height of the item.
	 */
	protected int getItemHeight(PageItem item) {
		int fHeight = m_itemFont.getHeight();
		Image image = item.getImage();
		int iHeight = (image == null ? 0 : image.getHeight());
		return Math.max(fHeight, iHeight);
	}

	/**
	 * Returns the width of an item. Summarizes image width, padding and label
	 * width.
	 * 
	 * @param item
	 *            The item whose width to return.
	 * @return The width of the item.
	 */
	protected int getItemWidth(PageItem item) {
		Image image = item.getImage();
		char[] text = item.getLabel();
		int w = (image == null ? 0 : image.getWidth());
		w += (text == null ? 0 : m_itemFont.charsWidth(text, 0, text.length));
		w += (image == null || text == null) ? 0 : m_imgPadding;
		return w;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -