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

📄 jumpcanvas.java

📁 Java版PRG游戏——跳动的牛仔
💻 JAVA
字号:
package net.frog_parrot.jump;

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

/**
 * This class is the display of the game.
 * 
 * @author Carol Hamer
 */
public class JumpCanvas extends javax.microedition.lcdui.game.GameCanvas {

  //---------------------------------------------------------
  //   dimension fields
  //  (constant after initialization)

  /**
   * the height of the green region below the ground.
   */
  static int GROUND_HEIGHT = 32;

  /**
   * a screen dimension.
   */
  static int CORNER_X;

  /**
   * a screen dimension.
   */
  static int CORNER_Y;


  static int DISP_WIDTH;    //屏幕宽度
  static int DISP_HEIGHT; //屏幕高度


  static int FONT_HEIGHT;   //默认字体高度
  static Font FONT;     //默认字体

  /**
   * a font dimension.
   */
  static int SCORE_WIDTH;   //分数显示的宽度
  static int TIME_WIDTH;    //事件显示的宽度


  Display myDisplay;
  Jump myJump;
  JumpManager myManager;
  
  static boolean myGameOver;    //游戏结束?
  int myScore = 0;      //玩家得分
  
  int myInitialGameTicks = 950;     //游戏滚动条
  int myOldGameTicks = myInitialGameTicks;
  int myGameTicks = myOldGameTicks;

  boolean myInitialized;    //是否初始化?

  static String myInitialString = "1:00";
  String myTimeString = myInitialString;

  //-----------------------------------------------------
  //    gets/sets


// This is called when the game ends.
  static void setGameOver() {
    myGameOver = true;
    GameThread.requestStop();
  }

  static boolean getGameOver() {
    return(myGameOver);
  }

  //-----------------------------------------------------
  //    initialization and game state changes
  public JumpCanvas(Jump midlet) {
    super(false);
    myDisplay = Display.getDisplay(midlet);
    myJump = midlet;
  }

  void start() {
    myGameOver = false;
    myDisplay.setCurrent(this);
    repaint();
  }

  void reset() {
    myManager.reset();
    myScore = 0;
    myGameOver = false;
    myGameTicks = myInitialGameTicks;
    myOldGameTicks = myInitialGameTicks;
    repaint();
  }

// clears the key states.
  void flushKeys() {
    getKeyStates();
  }

  //-------------------------------------------------------
  //  graphics methods

  public void paint(Graphics g) {
    // perform the calculations if necessary:
    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;
    }
    System.out.println("CORNER_X="+CORNER_X+",CORNER_Y="+CORNER_Y+
            ",DISP_WIDTH="+DISP_WIDTH+",DISP_HEIGHT="+DISP_HEIGHT);
    //设置屏幕背景:
    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);
    // create (if necessary) then paint the layer manager:
    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) {
        System.out.println("err:"+e);
      errorMsg(g, e);
    }
    // draw the time and score
    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);
    // write game over if the game is over
    if(myGameOver) {
      myJump.setNewCommand();
      // clear the top region:
      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);
    }
  }

  /**
   * a simple utility to make the number of ticks look like a time...
   */
  public String formatTime() {
    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);
  }

  //-------------------------------------------------------
  //  game movements

  /**
   * Tell the layer manager to advance the layers and then 
   * update the display.
   */
  void advance() {
    myGameTicks--;
    myScore += myManager.advance(myGameTicks);
    if(myGameTicks == 0) {
      setGameOver();
    }
    // paint the display
    try {
      paint(getGraphics());
      flushGraphics();
    } catch(Exception e) {
      errorMsg(e);
    }
    // we do a very short pause to allow the other thread 
    // to update the information about which keys are pressed:
    synchronized(this) {
      try {
	wait(1);
      } catch(Exception e) {}
    }
  }

  /**
   * Respond to keystrokes.
   */
  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();
      } 
    }
  }

  //-------------------------------------------------------
  //  error methods

  /**
   * Converts an exception to a message and displays 
   * the message..
   */
  void errorMsg(Exception e) {
    errorMsg(getGraphics(), e);
    flushGraphics();
  }

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

  /**
   * Displays an error message if something goes wrong.
   */
  void errorMsg(Graphics g, String msg) {
    // clear the screen
    g.setColor(0xffffff);
    g.fillRect(CORNER_X, CORNER_Y, DISP_WIDTH, DISP_HEIGHT);
    int msgWidth = FONT.stringWidth(msg);
    // write the message in red
    g.setColor(0x00ff0000);
    g.setFont(FONT);
    g.drawString(msg, (DISP_WIDTH - msgWidth)/2, 
		 (DISP_HEIGHT - FONT_HEIGHT)/2, g.TOP|g.LEFT);
    myGameOver = true;
  }

}

⌨️ 快捷键说明

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