漂亮的游戏开始画面
介绍一个游戏开始的画面。
先建两个类 MenuScreen.java SimpleCustomMenuWithBGFont.java用于测试
首先说下SimpleCustomMenuWithBGFont.java
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
//import java.util.*;
public class SimpleCustomMenuWithBGFont extends MIDlet implements CommandListener {
Display display;
Display pauseDisplay;
boolean isSplash = true;
MenuScreen menuScreen;
public SimpleCustomMenuWithBGFont() {
MenuScreen menuScreen = new MenuScreen();
display = Display.getDisplay(this);
display.setCurrent(menuScreen);
}
protected void startApp() throws MIDletStateChangeException {
}
protected void pauseApp() { }
protected void destroyApp (boolean flag) throws MIDletStateChangeException {}
public void commandAction (Command cmd, Displayable dis) {
}
}
这个类很简单,就是作为了测试使用的。
主要来介绍一下MenuScreen.java
import javax.microedition.lcdui.*;
public class MenuScreen extends Canvas implements Runnable {
// 设置字体
static final Font lowFont = Font.getFont (Font.FACE_MONOSPACE, Font.STYLE_PLAIN, Font.SIZE_SMALL);
static final Font highFont = Font.getFont (Font.FACE_MONOSPACE, Font.STYLE_BOLD, Font.SIZE_MEDIUM);
static final int NEW_GAME = 0;
static final int HIGH_SCORE = 1;
static final int SETTINGS = 2;
static final int HELP = 3;
static final int ABOUT = 4;
static final int MENU_ITEM_COUNT = 5;
// 设置颜色
static final int lowColor = 0x0000FF00; // Not Highlighted
static final int highColor = 0x000000FF; // Highlighted
static final int highBGColor = 0x00CCCCCC; // Highlighted Background
static int width; //屏幕宽
static int height; // 屏幕高
static int startHeight; // 菜单开始的高度
static final int spacing = highFont.getHeight()/2; // 菜单项间的距离
// 菜单项
static final String[] mainMenu = {"New Game","High Score","Settings","Help","About"};
// 当前高亮显示的索引号
static int menuIdx;
Thread thread;
// 背景图
Image bgImage;
//构造
public MenuScreen() {
width = getWidth();
height = getHeight();
// 计算菜单开始的高度
startHeight = (highFont.getHeight() * mainMenu.length) + ((mainMenu.length-1) * spacing);
startHeight = (height - startHeight) / 2;
// 默认所选为菜单的第一项
menuIdx = 0;
try {
bgImage = Image.createImage("/res/bg.png");
} catch (Exception e) {}
thread = new Thread(this);
thread.start();
}
public void run() {
while(true) {
repaint();
}
}
public void paint(Graphics g) {
//清屏
g.setColor(0x00000000);
g.fillRect(0,0,width,height);
// 背景
g.drawImage(bgImage,(width - bgImage.getWidth()) / 2, (height - bgImage.getHeight())/2,20);
for (int i=0; i<mainMenu.length; i++) {
if (i==menuIdx) {
//g.setColor(highBGColor);
//g.fillRect(0,startHeight + (i*highFont.getHeight()) + spacing,width,highFont.getHeight());
g.setFont(highFont);
g.setColor(highColor);
g.drawString(mainMenu,
(width - highFont.stringWidth(mainMenu)) / 2,
startHeight + (i*highFont.getHeight()) + spacing,
20
);
} else {
g.setFont(lowFont);
g.setColor(lowColor);
g.drawString(mainMenu,
(width - lowFont.stringWidth(mainMenu) ) / 2,
startHeight + (i*highFont.getHeight()) + spacing,
20
);
}
}
}
protected void keyPressed (int code) {
if (getGameAction(code) == Canvas.UP && menuIdx - 1 >= 0) {
menuIdx--;
} else if (getGameAction(code) == Canvas.DOWN && menuIdx + 1 < mainMenu.length) {
menuIdx++;
}else if (getGameAction(code) == Canvas.FIRE)
switch(menuIdx) {
case NEW_GAME: System.out.println("Start New Game"); break;
case HIGH_SCORE: System.out.println("Display High Score"); break;
case SETTINGS: System.out.println("Display Settings"); break;
case HELP: System.out.println("Display Help"); break;
case ABOUT: System.out.println("Display About Info."); break;
}
}
}
顺便这里介绍一下J2ME中的字体:
字体的属性由:字体类型,风格和字体大小构成,请注意颜色并不是字体的属性。字体
类型由Form类中的静态常量进行定义,可能的取值:
FACE_MONOSPACE: 等宽字体
FACE_PROPORTIONAL: 比例字体,非常宽
FACE_SYSTEM: 系统字体
字体风格由Font 类中的静态常量进行定义,字体风格是可以多选的,可能的取值为:
STYLE_BOLD : 加粗
STYLE_ITALIC :斜体
STYLE_PLAIN :常规
STYLE_UNDERLINED:带下划线字体
字体由Font 类中的静态常量进行定义,可能的取值为:
SIZE_LARGE: 大号字体
SIZE_MEDIUM: 中号字体
SIZE_SMALL: 小号字体
创建字体时并不是通过Font 类的构造方法来创建,而是利用Font类的静态方法
static Font getFont(int face,int style,int size)来创建字体。或者利用
static font getDefauleFont()来创建系统默认字体。
在MIDP v2.0中,为Font类增加了新的一个方法用于创建字体,即 static Font
getFont(int fontSpecifier),参数fontSpecifier的取值范围被定义为Font类
的静态常量,目前只能由俩种取值:
FONT_STATIC_TEXT:静态文本字体,定义了屏幕显示时设备采用的字体
FONT_INPUT_TEXT:输入文体,定义了在用户输入时设备采用的字体
在显示文字时,如果文字过长而超过当前屏幕的宽度,那么多余的部分将无法显示,
所以为了有效地显示文字可以用检测字符或者字符串的宽度的方法,由程序判断每
行输出的字符数,来达到更好的显示效果.