📄 jumpcanvas.java
字号:
import javax.microedition.lcdui.*;import javax.microedition.lcdui.game.*;public class JumpCanvas extends javax.microedition.lcdui.game.GameCanvas { static int GROUND_HEIGHT = 32; // 离地的高度 static int CORNER_X; //屏幕位置及宽度及高度 static int CORNER_Y; static int DISP_WIDTH; static int DISP_HEIGHT; static Font FONT; //字体 static int FONT_HEIGHT; // 字体高度 static int SCORE_WIDTH; // 分数所占宽度 static int TIME_WIDTH; // 显示时间所占宽度 Display myDisplay; // 显示设备 Jump myJump; // 所处的MIDlet 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; // 时间串 /** * 结束游戏 */ static void setGameOver() { myGameOver = true; GameThread.requestStop(); } /** * 是否结束 */ static boolean getGameOver() { return(myGameOver); } /** * 构造方法 */ 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(); } /** * 清除以前的按键,这里调用了getKeyStates() */ void flushKeys() { getKeyStates(); } /** * 绘制 */ 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); // 创建图层管理器,即JumpManager对象 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(); // 清除上面一块区域 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); } } /** * 对时间信息表达为"分和秒的字符串 */ 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); } /** * 调用图层管理器的步进(advance)并刷新屏幕 */ void advance() { myGameTicks--; myScore += myManager.advance(myGameTicks); if(myGameTicks == 0) { setGameOver(); } // 调用paint()进行绘制,并刷新到屏幕上 try { paint(getGraphics()); flushGraphics(); } catch(Exception e) { errorMsg(e); } // 等待一个短暂的时间,以便其他线程能更新有关按键的消息 // to update the information about which keys are pressed: synchronized(this) { try { wait(1); } catch(Exception e) {} } } /** * 处理键盘事件 */ 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(); } } } /** * 显示错误消息 */ void errorMsg(Exception e) { errorMsg(getGraphics(), e); flushGraphics(); } /** * 错误消息的信息 */ void errorMsg(Graphics g, Exception e) { if(e.getMessage() == null) { errorMsg(g, e.getClass().getName()); } else { errorMsg(g, e.getClass().getName() + ":" + e.getMessage()); } } /** * 显示错误消息 */ 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; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -