Java MIDP 2.1_Java手机游戏编程之MIDP图形设计篇(2)

2、九宫格MIDlet

下面是九宫格MIDlet的类模式图:

19101eb85588d0d39053fe1e9430d63f.png

图3:九宫格MIDlet类图

当MIDlet启动方法startApp()时,将创建闪烁屏幕和第一个游戏屏幕(ChoosePieceScreen)。闪烁屏幕显示4秒之后,第一个游戏屏幕开始显示。ChoosePieceScreen让游戏者选择使用哪种棋子(圆还是叉)。当游戏者做出选择之后,他可以使用OK键确认。这会使ChoosePieceScreen回调主MIDlet的choicePieceScreenDone()方法。

ChoosePieceScreen是使用高级应用编程接口List类实现的。

06362d4d4f59db63ab60de3cf84ca193.png 

图4:ChoosePieceScreen是一个高级用户界面List子类

choosePieceScreenDone()回调创建并显示下一个屏幕,这个屏幕在此应用程序中作为游戏的主屏(GameScreen)。

每当轮到游戏者下棋的时候,游戏者使用GameScreen的箭头键和Select按钮来选择想要走的空格。每一回合之后,应用程序都会检查游戏的状态,检查其是否符合游戏结束条件并显示游戏结果。游戏者通过点击GameScreen的Quit命令结束游戏,或使用New命令开始新一轮游戏。Quit(结束)命令调用TicTacToeMIDlet的quit()方法,然后MIDlet就会调用destroyApp()方法来终止整个MIDlet程序。

游戏程序逻辑被封装在一个单独的Game类中。本文只关注MIDlet的图形设计,而对游戏程序逻辑不作深入探讨。如果要与现有的applet Java程序作比较,请参阅http://java.sun.com/applets/jdk/1.0/demo/TicTacToe/TicTacToe.java 和http://java.sun.com/products/jfc/tsc/articles/tictactoe/index.html 中的游戏程序逻辑。

GameScreen通过使用低级Canvas和Graphics类来实现。它使用Canvas、Image和Graphics对象来绘制图形。

GameScreen首先初始化基于画布尺寸的显示面板。这可让MIDlet能够运行在不同显示屏幕的移动设备上。在本例中还使用了一个Image对象用来表示游戏面板。然后GameScreen根据游戏者在ChoosePieceScreen中所做的选择为游戏者和MIDlet分配棋子。游戏然后进行初始化(包括随机决定谁是先手),然后游戏就开始了。

为了使GameScreen能够被移植,MIDlet的键盘代码必须被映射到游戏动作上,如:Up、Down、Left、Right和Fire,用于具有不同键盘的移动设备。每当一个键被按下的时候,keyPressed()方法就会判断这是一个方向键还是一个Fire/Select键。如果按下的键是方向键,光标就会相应地移动,帮助游戏者可视化地选择一个空格放入棋子。Select键用来选择一个空格放入棋子。如果探测到满足游戏结束的条件,就会显示一条信息宣布游戏的获胜者和本轮游戏的得分。(见下图)

f5674fbdbc8f16787ab97c3eea63339e.png

图5: GameScreen 是一个低级 Canvas(画布)子类

3、TicTacToeMIDlet.javaTicTacToeMIDlet非常简单:它处理MIDlet的生命周期事件。它根据需要创建屏幕对象并且处理来自屏幕的回调。ChoosePieceScreenDone回调被用来创建GameScreen。quit方法则被GameScreen用来结束游戏。

package example.tictactoe;

import java.io.IOException;

import javax.microedition.midlet.*;

import javax.microedition.lcdui.*;

import javax.microedition.io.*;

public class TicTacToeMIDlet extends MIDlet {

private ChoosePieceScreen choosePieceScreen;

private GameScreen gameScreen;

public TicTacToeMIDlet()

{

}

public void startApp() {

Displayable current = Display.getDisplay(this).getCurrent();

if (current == null) {

// first time we've been called

// Get the logo image

Image logo = null;

try

{

logo = Image.createImage("/tictactoe.png");

}

catch (IOException e) {

// just use null image

}

Alert splashScreen = new Alert(null, "Tic-Tac-Toe\nForum Nokia", logo, AlertType.INFO);

splashScreen.setTimeout(4000);

// 4 seconds

choosePieceScreen = new ChoosePieceScreen(this);

Display.getDisplay(this).setCurrent(splashScreen, choosePieceScreen);

}

else

{

Display.getDisplay(this).setCurrent(current);

}

}

public void pauseApp() {

}

public void destroyApp(boolean unconditional) {

}

public void quit()

{

destroyApp(false);

notifyDestroyed();

}

public void choosePieceScreenDone(boolean isPlayerCircle)

{

gameScreen = new GameScreen(this, isPlayerCircle);

Display.getDisplay(this).setCurrent(gameScreen);

}

}

4、ChoosePieceScreen.java

ChoosePieceScreen是一个基于高级应用编程接口窗体的屏幕,允许游戏者选择圆或叉作为棋子。当游戏者按下OK键时,它使用MIDlet的回调方法choosePieceScreenDone来处理游戏者的选择。

package example.tictactoe;

import javax.microedition.midlet.*;

import javax.microedition.lcdui.*;

import javax.microedition.io.*;

public class ChoosePieceScreen extends List implements CommandListener

{

private static final String CIRCLE_TEXT = "Circle";

private static final String CROSS_TEXT = "Cross";

private final TicTacToeMIDlet midlet;

private final Command quitCommand;

public ChoosePieceScreen(TicTacToeMIDlet midlet) {

super("Choose your piece", List.IMPLICIT);

this.midlet = midlet;

append(CIRCLE_TEXT, loadImage("/circle.png"));

append(CROSS_TEXT, loadImage("/cross.png"));

quitCommand = new Command("Quit", Command.EXIT, 2);

addCommand(quitCommand);

setCommandListener(this);

}

public void commandAction(Command c, Displayable d) {

boolean isPlayerCircle = getString(getSelectedIndex()).equals(CIRCLE_TEXT);

if (c == List.SELECT_COMMAND) {

midlet.choosePieceScreenDone(isPlayerCircle);

}

else

// quit Command

{

midlet.quit();

}

}

private Image loadImage(String imageFile)

{

Image image = null;

try

{

image = Image.createImage(imageFile);

}

catch (Exception e)

{

// Use a 'null' image in the choice list (i.e. text only choices).

}

return image;

}

}

内容导航

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值