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

📄 jumpcanvas.java

📁 本光盘是《J2ME无线移动游戏开发》一书的配套光盘
💻 JAVA
字号:
package ch09;

import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;

public class JumpCanvas
    extends javax.microedition.lcdui.game.GameCanvas {
  //声明一个代表草地水平面高度的变量
  static int GROUND_HEIGHT = 32;

  //声明一个代表屏幕左上角X坐标的变量
  static int CORNER_X;

  //声明一个代表屏幕左上角Y坐标的变量
  static int CORNER_Y;

  //声明一个代表屏幕宽度的变量
  static int DISP_WIDTH;

  //声明一个代表屏幕高度的变量
  static int DISP_HEIGHT;

  //声明一个代表字体的高度变量
  static int FONT_HEIGHT;

  //声明一个字体对象
  static Font FONT;

  //声明一个代表得分文字的宽度变量
  static int SCORE_WIDTH;

  //声明一个代表时间文字的宽度变量
  static int TIME_WIDTH;

  //声明一个Display对象
  Display myDisplay;

  //声明一个主类MIDlet对象
  Jump_MIDlet myJump;

  //声明一个图层管理对象
  JumpManager myManager;

  //声明一个代表游戏结束状态的布尔变量
  static boolean myGameOver;

  //声明一个代表游戏者得分的变量
  int myScore = 0;

  //游戏的总持续时间,除以16就是实际的时间秒数
  final int myInitialGameTicks = 950;

  //代表每次游戏的总持续时间
  int myOldGameTicks = myInitialGameTicks;

  //代表游戏已剩余时间(即游戏已持续时间)
  int myGameTicks = myOldGameTicks;

  //声明游戏绘制初始化状态的变量
  boolean myInitialized;

  //初始时间文字
  static String myInitialString = "1:00";

  //声明一个代表时间文字变量
  String myTimeString = myInitialString;

  /*
     14.构造器
   */
  public JumpCanvas(Jump_MIDlet midlet) {
    super(false);
    myDisplay = Display.getDisplay(midlet);
    myJump = midlet;
  }

  /*
     15.启动游戏
   */
  void advance() {
    myGameTicks--;
    myScore += myManager.advance(myGameTicks);

    if (myGameTicks == 0) {
      setGameOver();
    }

    try {
      paint(getGraphics());
      flushGraphics();
    }
    catch (Exception e) {
      errorMsg(e);
    }

    //控制游戏刷新快慢
    synchronized (this) {
      try {
        wait(1);
      }
      catch (Exception e) {
        System.out.println(e.getMessage());
      }
    }
  }

  /*
     16.停止游戏
   */
  static void setGameOver() {
    myGameOver = true;
    GameThread.requestStop();
  }

  /*
     17.绘制游戏
   */
  public void paint(Graphics g) {
    //初始化变量
    if (!myInitialized) {
      CORNER_X = g.getClipX();
      CORNER_Y = g.getClipY();
      DISP_WIDTH = g.getClipWidth();
      DISP_HEIGHT = g.getClipHeight();
      FONT = g.getFont();
      FONT_HEIGHT = FONT.getHeight();
      SCORE_WIDTH = FONT.stringWidth("Score: 000");
      TIME_WIDTH = FONT.stringWidth("Time: " + myInitialString);
      myInitialized = true;
    }
    //设置背景色
    g.setColor(0xffffff);
    g.fillRect(CORNER_X, CORNER_Y, DISP_WIDTH, DISP_HEIGHT);
    g.setColor(0x0000ff00);
    g.fillRect(CORNER_X, CORNER_Y + DISP_HEIGHT - GROUND_HEIGHT,
               DISP_WIDTH, DISP_HEIGHT);
    //启动层管理器绘制工作
    try {
      if (myManager == null) {
        myManager = new JumpManager(CORNER_X, CORNER_Y + FONT_HEIGHT * 2,
                                    DISP_WIDTH,
                                    DISP_HEIGHT - FONT_HEIGHT * 2 -
                                    GROUND_HEIGHT);
      }
      myManager.paint(g);
    }
    catch (Exception e) {
      errorMsg(g, e);
    }
    //绘制时间和得分
    g.setColor(0);
    g.setFont(FONT);
    g.drawString("Score: " + myScore,
                 (DISP_WIDTH - SCORE_WIDTH) / 2,
                 DISP_HEIGHT + 5 - GROUND_HEIGHT, g.TOP | g.LEFT);
    g.drawString("Time: " + formatTime(),
                 (DISP_WIDTH - TIME_WIDTH) / 2,
                 CORNER_Y + FONT_HEIGHT, g.TOP | g.LEFT);
    //绘制游戏结束时画面
    if (myGameOver) {
      myJump.setNewCommand();
      //清空时间文字区域,添加“Game Over”文字
      g.setColor(0xffffff);
      g.fillRect(CORNER_X, CORNER_Y, DISP_WIDTH, FONT_HEIGHT * 2 + 1);
      int goWidth = FONT.stringWidth("Game Over");
      g.setColor(0);
      g.setFont(FONT);
      g.drawString("Game Over", (DISP_WIDTH - goWidth) / 2,
                   CORNER_Y + FONT_HEIGHT, g.TOP | g.LEFT);
    }
  }

  /*
   18.处理异常
   */
  void errorMsg(Exception e) {
    errorMsg(getGraphics(), e);
    flushGraphics();
  }

  /*
   19.处理异常
   */
  void errorMsg(Graphics g, Exception e) {
    if (e.getMessage() == null) {
      errorMsg(g, e.getClass().getName());
    }
    else {
      errorMsg(g, e.getClass().getName() + ":" + e.getMessage());
    }
  }

  /*
   20.处理异常
   */
  void errorMsg(Graphics g, String msg) {
    //清楚屏幕
    g.setColor(0xffffff);
    g.fillRect(CORNER_X, CORNER_Y, DISP_WIDTH, DISP_HEIGHT);
    int msgWidth = FONT.stringWidth(msg);
    //设置提示文字为红色
    g.setColor(0x00ff0000);
    g.setFont(FONT);
    g.drawString(msg, (DISP_WIDTH - msgWidth) / 2,
                 (DISP_HEIGHT - FONT_HEIGHT) / 2, g.TOP | g.LEFT);
    myGameOver = true;
  }

  /*
    21.处理时间文字
   */
  public String formatTime() {
    //每隔16次绘制屏幕,刷新一次时间,使时间数字的变化接近实际时间变化,不至于过快。
    //另有优势处,就是不用停止原有线程
    //16为每秒绘制屏幕的次数
    if ( (myGameTicks / 16) + 1 != myOldGameTicks) {
      myTimeString = "";
      myOldGameTicks = (myGameTicks / 16) + 1;
      int smallPart = myOldGameTicks % 60; //秒部分
      int bigPart = myOldGameTicks / 60; //分部分
      myTimeString += bigPart + ":";
      if (smallPart / 10 < 1) {
        myTimeString += "0";
      }
      myTimeString += smallPart;
    }
    return (myTimeString);

  }

  /*
     22.开始游戏初始化设置,在主类Jump_MIDlet的startApp()方法中被调用
   */
  void start() {
    myGameOver = false;
    myDisplay.setCurrent(this);
    repaint();
  }

  /*
   23.重玩游戏初始化设置,在主类Jump_MIDlet的commandAction()方法中激活重玩按钮时被调用
   */
  void reset() {
    myManager.reset();
    myScore = 0;
    myGameOver = false;
    myGameTicks = myInitialGameTicks;
    myOldGameTicks = myInitialGameTicks;
    repaint();
  }

  /*
    24.初始按键状态,在控制线程类GameThread的run()方法中作为第一条语句被调用。
   */
  void flushKeys() {
    getKeyStates();
  }

  /*
    25.响应按键,在控制线程类GameThread的run()方法中被调用。
   */
  public void checkKeys() {
    if (!myGameOver) {
      int keyState = getKeyStates();
      if ( (keyState & LEFT_PRESSED) != 0) {
        myManager.setLeft(true);
      }
      if ( (keyState & RIGHT_PRESSED) != 0) {
        myManager.setLeft(false);
      }
      if ( (keyState & UP_PRESSED) != 0) {
        myManager.jump();
      }
    }
  }

}

⌨️ 快捷键说明

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