📄 midpdungeonfrontend.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 + -