📄 jumpcanvas.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 + -