科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件MIDP 2.0 开发J2ME游戏起步之一

MIDP 2.0 开发J2ME游戏起步之一

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文通过对样例游戏Tumbleweed的代码分析,将展示MIDP2.0技术的几个主要部分.

作者:马岩编译 来源:天极网 2007年12月28日

关键字: MIDP J2ME 游戏

  • 评论
  • 分享微博
  • 分享邮件
MIDP2.0(Mobile Internet Device Profile)技术进行游戏开发中用到的最重要的包是:javax.microedition.lcdui.game,本文通过对样例游戏Tumbleweed的代码分析,将展示MIDP2.0技术的几个主要部分。游戏的主要情景是一个牛仔跳着闪避风滚草,这是一个简单的游戏,但你可以从中学到将来写复杂游戏必须具备的大部分基础知识。

  从MIDlet类开始

  象通常一样,应用从MIDlet类开始。本例中,我的MIDlet子类是Jump。Jump类几乎是完全继承的MIDIet子类,唯一的不同是用到了另一个独立类GameThread,用来动态设置当前窗口允许的有效按钮,比如当游戏处于非暂停状态时,玩家才可以使用暂停这个有效按钮,而激活按钮有效则是在游戏处于暂停状态时候,与此类似游戏停止后,开始按钮才是有效按钮。

  Listing 1是游戏的MIDlet子类——Jump.java源码。

  Listing 1. Jump.java

package net.frog_parrot.jump;

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

/**
* This is the main class of the Tumbleweed game.
*
* @author Carol Hamer
*/
public class Jump extends MIDlet implements CommandListener {

 //---------------------------------------------------------
 // Commands

 /**
 * The command to end the game.
 */
 private Command myExitCommand = new Command("Exit", Command.EXIT, 99);

 /**
 * The command to start moving when the game is paused.
 */
 private Command myGoCommand = new Command("Go", Command.SCREEN, 1);

 /**
 * The command to pause the game.
 */
 private Command myPauseCommand = new Command("Pause", Command.SCREEN, 1);

 /**
 * The command to start a new game.
 */
 private Command myNewCommand = new Command("Play Again", Command.SCREEN, 1);

 //---------------------------------------------------------
 // Game object fields

 /**
 * The canvas that all of the game will be drawn on.
 */
 private JumpCanvas myCanvas;

 /**
 * The thread that advances the cowboy.
 */
 private GameThread myGameThread;

 //-----------------------------------------------------
 // Initialization and game state changes
 /**
 * Initialize the canvas and the commands.
 */
 public Jump() {
  try {
   myCanvas = new JumpCanvas(this);
   myCanvas.addCommand(myExitCommand);
   myCanvas.addCommand(myPauseCommand);
   myCanvas.setCommandListener(this);
  } catch(Exception e) {
   errorMsg(e);
  }
 }

 /**
 * Switch the command to the play again command.
 */
 void setNewCommand () {
  myCanvas.removeCommand(myPauseCommand);
  myCanvas.removeCommand(myGoCommand);
  myCanvas.addCommand(myNewCommand);
 }

 /**
 * Switch the command to the go command.
 */
 private void setGoCommand() {
  myCanvas.removeCommand(myPauseCommand);
  myCanvas.removeCommand(myNewCommand);
  myCanvas.addCommand(myGoCommand);
 }

 /**
 * Switch the command to the pause command.
 */
 private void setPauseCommand () {
  myCanvas.removeCommand(myNewCommand);
  myCanvas.removeCommand(myGoCommand);
  myCanvas.addCommand(myPauseCommand);
 }

 //----------------------------------------------------------------
 // Implementation of MIDlet.
 // These methods may be called by the application management
 // software at any time, so you always check fields for null
 // before calling methods on them.

 /**
  * Start the application.
 */
 public void startApp() throws MIDletStateChangeException {
  if(myCanvas != null) {
   if(myGameThread == null) {
    myGameThread = new GameThread(myCanvas);
    myCanvas.start();
    myGameThread.start();
   } else {
    myCanvas.removeCommand(myGoCommand);
    myCanvas.addCommand(myPauseCommand);
    myCanvas.flushKeys();
    myGameThread.resumeGame();
   }
  }
 }

 /**
  * Stop and throw out the garbage.
 */
 public void destroyApp(boolean unconditional)
  throws MIDletStateChangeException {
   if(myGameThread != null) {
    myGameThread.requestStop();
   }
   myGameThread = null;
   myCanvas = null;
   System.gc();
  }

 /**
 * Request the thread to pause.
 */
 public void pauseApp() {
  if(myCanvas != null) {
   setGoCommand();
  }
  If(myGameThread != null) {
   myGameThread.pauseGame();
  }
 }

 //----------------------------------------------------------------
 // Implementation of CommandListener
 /*
 * Respond to a command issued on the Canvas.
 * (either reset or exit).
 */
 public void commandAction(Command c, Displayable s) {
  if(c == myGoCommand) {
   myCanvas.removeCommand(myGoCommand);
   myCanvas.addCommand(myPauseCommand);
   myCanvas.flushKeys();
   myGameThread.resumeGame();
  } else if(c == myPauseCommand) {
   myCanvas.removeCommand(myPauseCommand);
   myCanvas.addCommand(myGoCommand);
   myGameThread.pauseGame();
  } else if(c == myNewCommand) {
   myCanvas.removeCommand(myNewCommand);
   myCanvas.addCommand(myPauseCommand);
   myCanvas.reset();
   myGameThread.resumeGame();
  } else if((c == myExitCommand) || (c == Alert.DISMISS_COMMAND)) {
   try {
    destroyApp(false);
    notifyDestroyed();
   } catch (MIDletStateChangeException ex) {
  }
 }
}

//-------------------------------------------------------
// Error methods

/**
* Converts an exception to a message and displays
* the message.
*/
 void errorMsg(Exception e) {
  if(e.getMessage() == null) {
   errorMsg(e.getClass().getName());
  } else {
   errorMsg(e.getClass().getName() + ":" + e.getMessage());
  }
 }

 /**
 * Displays an error message alert if something goes wrong.
 */
 void errorMsg(String msg) {
  Alert errorAlert = new Alert("error", msg, null, AlertType.ERROR);
  errorAlert.setCommandListener(this);
  errorAlert.setTimeout(Alert.FOREVER);
  Display.getDisplay(this).setCurrent(errorAlert);
 }
}
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章