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

📄 midpdungeonfrontend.java

📁 j2me实现的一款小游戏
💻 JAVA
字号:
package istarion.midlet;

import java.util.Vector;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import istarion.core.*;
import istarion.frontend.*;

public class MIDPDungeonFrontend extends Canvas implements DungeonFrontend, CommandListener
{

	private GameController __controller = null;
	private Display __display = null;

	private int upKey;
	private int downKey;
	private int leftKey;
	private int rightKey;
	private int fireKey;

	int __dungeonRows;
	int __dungeonColumns;

	char[][] __envDungeon;
	Mobile[][] __envMobiles;
	Vector[][] __envItems;
	String __message;

	private Font __fontMono = null;
	private Font __fontProp = null;



	/**
	 * Constructor.
	 */
	public MIDPDungeonFrontend(Display d, GameController c)
	{
		super();
		__controller = c;
		__display = d;

		addCommand(new Command("Cmds", Command.SCREEN, 1));
		addCommand(new Command("Char", Command.SCREEN, 1));
		addCommand(new Command("go North", Command.SCREEN, 2));
		addCommand(new Command("go South", Command.SCREEN, 2));
		addCommand(new Command("go East", Command.SCREEN, 2));
		addCommand(new Command("go West", Command.SCREEN, 2));
		setCommandListener(this);

		//get game key codes:
		fireKey = getKeyCode(Canvas.FIRE);
		upKey = getKeyCode(Canvas.UP);
		downKey = getKeyCode(Canvas.DOWN);
		leftKey = getKeyCode(Canvas.LEFT);
		rightKey = getKeyCode(Canvas.RIGHT);

		//fonts:
		__fontProp = Font.getFont(Font.FACE_PROPORTIONAL,
			Font.STYLE_PLAIN, Font.SIZE_SMALL);
		__fontMono = Font.getFont(Font.FACE_MONOSPACE,
			Font.STYLE_PLAIN, Font.SIZE_SMALL);

		//number of rows and columns of dungeon environment display:
		__dungeonRows = (getHeight() / __fontMono.getHeight()) - 4;
		//if (__dungeonRows % 2 == 1) __dungeonRows--;
		__dungeonColumns = getWidth() / __fontMono.charWidth('#');
		//if (__dungeonColumns % 2 == 1) __dungeonColumns--;

	}


	public void doShow()
	{
		__display.setCurrent(this);
	}


	public void redrawDungeon(char[][] dungeon, Mobile[][] mobiles,
		Vector[][] items, String msg)
	{
		__envDungeon = dungeon;
		__envMobiles = mobiles;
		__envItems = items;
		__message = msg;
		repaint();
	}


	public int getDungeonDisplayColumns()
	{
		return __dungeonColumns;
	}


	public int getDungeonDisplayRows()
	{
		return __dungeonRows;
	}



	/**
	 * Redraws the complete screen. Must be optimized.
	 */
	public void paint(Graphics g)
	{
		//g.setColor(Toolkit.COLOR_WHITE);
		//g.fillRect(0,0,getWidth(), getHeight());//clear screen
		g.setColor(Toolkit.COLOR_WHITE);
		g.fillRect(0, 0, getWidth(), getHeight());

		g.setColor(Toolkit.COLOR_BLACK);

		g.setFont(__fontProp);

		//titel and dungeonname:
		g.drawString(__controller.getPlayer().getDungeon().getName(),
			0, 0, Graphics.TOP|Graphics.LEFT);

		//infotext:
		g.drawString(__message, 0, __fontProp.getHeight() *
			(getDungeonDisplayRows() + 2),
				Graphics.TOP|Graphics.LEFT
		);

		//character-status:
		g.drawString(__controller.getPlayer().getName() + " HP:" +
			__controller.getPlayer().getHitpoints() + " MP:" +
		 	__controller.getPlayer().getMana(), 0,
		 	__fontProp.getHeight() * (getDungeonDisplayRows() + 3),
			Graphics.TOP|Graphics.LEFT
		);

		 //draw dungeon environment:
		__drawDungeonEnvironment(g, 1);

	}


	/**
	 * Draws the players dungeon environment onto the screen.
	 */
	private void __drawDungeonEnvironment(Graphics g, int offset)
	{
		g.setFont(__fontMono);
		//g.setColor(Toolkit.COLOR_LIGHTGRAY);
		//g.fillRect(0, offset * __fontMono.getHeight(),
		//	__dungeonColumns * __fontMono.charWidth('#'), (offset + __dungeonRows) *
		//		__fontMono.getHeight());
		g.setColor(Toolkit.COLOR_BLACK);
		int x, y;

		for (x = 0; x < __dungeonColumns; x++)
			for (y = 0; y < __dungeonRows; y++)
			{
				if (__envDungeon[x][y] == Dungeon.NOTHING) continue;

				//draw walls as solid rectangles:
				//if (__dungeonEnv[x][y] == '#')
				//{
				//	g.fillRect(x * __fontMono.charWidth('#'), (y + offset) * __fontMono.getHeight(),
				//		__fontMono.charWidth('#'), __fontMono.getHeight());
				//} else {
					g.drawChar(__getCellFace(x, y), x * __fontMono.charWidth('x'),
						(y + offset) * __fontMono.getHeight(), Graphics.TOP|Graphics.LEFT
					);
				//}
			}

	}


	private char __getCellFace(int x, int y)
	{
		char symbol = ' ';

		//blocked cell? (e.g. wand?)
		if (__envDungeon[x][y] == Dungeon.WALL)
		{
			symbol = '#';
			//color = Toolkit.COLOR_BLACK;

		//free cell. stuff can be in here.
		} else {

			symbol = '.'; //free cell as default
			//color = Toolkit.COLOR_BLACK;

			//a mobile to draw?
			if (__envMobiles[x][y] != null)
			{
				symbol = __envMobiles[x][y].getSymbol();
				//color = mobile.getColor();
			//if not: an item to draw?
			} else {


        		if ((__envItems[x][y] != null) && (__envItems[x][y].size() > 0))
				{
					symbol = ((Entity)__envItems[x][y].lastElement()).getSymbol();
					//color = ((Entity)items.lastElement()).getColor();
				}
			}
		}

		return symbol;

	}


    /**
     * String to identify the object in the CommandListeners.
     */
	public String toString()
	{
		return "dungeonscreen";
	}


	/**
	 * Perform Actions on Commands. Forwards the user's action
	 * to game controller.
	 */
	public void commandAction(Command c, Displayable d)
	{
		__controller.frontendAction(c.getLabel(), d.toString());
	}



	/**
	 * Process cell phone keypad events. Forward them to GameController.
	 *
	 */
	public void keyPressed(int keyCode)
	{
		if (keyCode == upKey)
		{
			__controller.frontendAction("go North", toString());
		} else if (keyCode == downKey) {
			__controller.frontendAction("go South", toString());
		} else if (keyCode == rightKey) {
			__controller.frontendAction("go East", toString());
		} else if (keyCode == leftKey) {
			__controller.frontendAction("go West", toString());
		} else if (keyCode == fireKey) {
		}
	}


	/**
	 * Process pointer events.
	 */
	 public void pointerReleased(int x, int y)
	 {
	 	int diffX = x - (getWidth() / 2);
	 	int diffY = y - (getHeight() / 2);
 		int abstandX = Math.abs(diffX);
 		int abstandY = Math.abs(diffY);

 		if ((diffY < 0) && (abstandY > abstandX))
 			__controller.frontendAction("go North", toString());
 		else if ((diffY > 0) && (abstandY > abstandX))
 			__controller.frontendAction("go South", toString());
 		else if ((diffX < 0) && (abstandX > abstandY))
 			__controller.frontendAction("go West", toString());
 		else if ((diffX > 0) && (abstandX > abstandY))
 			__controller.frontendAction("go East", toString());
	 }

}

⌨️ 快捷键说明

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