📄 gamecanvas.java
字号:
import javax.microedition.lcdui.*;
import java.util.*;
class GameCanvas extends Canvas implements Runnable, CommandListener {
private int screenWidth;
private int screenHeight;
private SpaceShooter spaceShooter;
private Image titleImg;
private MyShip myShip = new MyShip();
private MyMissile[] myMissiles = new MyMissile[] {
new MyMissile(),
new MyMissile(),
new MyMissile(),
new MyMissile(),
new MyMissile()
};
private int myMissileCount;
private UFO[] ufos = new UFO[] {
new UFO(myShip),
new UFO(myShip),
new UFO(myShip),
new UFO(myShip),
new UFO(myShip),
new UFO(myShip),
new UFO(myShip)
};
private int ufoCount;
private UFOMissile[] ufoMissiles = new UFOMissile[] {
new UFOMissile(),
new UFOMissile(),
new UFOMissile(),
new UFOMissile(),
new UFOMissile(),
new UFOMissile(),
new UFOMissile(),
new UFOMissile(),
new UFOMissile(),
new UFOMissile()
};
private int ufoMissileCount;
private static final long DRAW_INTERVAL = 100;
private boolean isPaused;
private boolean isStopped;
private int tickCount4UFO;
private Random random = new Random();
private Command startCmd = new Command("Start", Command.SCREEN, 5);
private Command exitCmd = new Command("Exit", Command.SCREEN, 1);
private Command pauseCmd = new Command("Pause", Command.SCREEN, 5);
private Command resumeCmd = new Command("Resume", Command.SCREEN, 5);
private Command quitCmd = new Command("Quit", Command.SCREEN, 1);
private long score;
private long highScore = 0;
private static final long DEFAULT_SCORE = 100;
/** 储存生命点数的变量 */
private int lives;
private int livesup=1;
private static final int DEFAULT_LIVES = 9;
private Font defFont = Font.getDefaultFont();
private static final int SCORE_AREA = Font.getDefaultFont().getHeight();
private static final short TITLE = 0;
private static final short GAME_START = 1;
private static final short GAME_PLAYING = 2;
private static final short GAME_END = 5;
private short gameState;
/** 构造函数 */
GameCanvas(SpaceShooter spaceShooter) {
this.spaceShooter = spaceShooter;
screenWidth = getWidth();
screenHeight = getHeight();
try {
titleImg = Image.createImage("/title.png");
}catch(Exception e) {}
setCommandListener(this);
gameState = TITLE;
}
/** 进行游戏之初始化的方法 */
private void doGameInit() {
score = 0;
myShip.setX((screenWidth - myShip.getWidth()) /2);
myShip.setY(screenHeight - myShip.getHeight());
myShip.setHit(false);//清除Hit状态
lives = DEFAULT_LIVES;
for(int i=0; i < myMissiles.length; i++) {
myMissiles[i].setAlive(false);
}
myMissileCount = 0;
for(int i=0; i < ufos.length; i++) {
ufos[i].setAlive(false);
}
ufoCount = 0;
for(int i=0; i < ufoMissiles.length; i++) {
ufoMissiles[i].setAlive(false);
}
ufoMissileCount = 0;
tickCount4UFO = 0;
isStopped = false;
isPaused = false;
}
void doStartApp() {
switch(gameState) {
case TITLE:
doTitle();
break;
case GAME_START:
case GAME_PLAYING:
isPaused = true;
isStopped = true;
removeCommand(pauseCmd);
removeCommand(resumeCmd);
addCommand(resumeCmd);
break;
default:
isPaused = false;
break;
}
}
void doPauseApp() {
switch(gameState) {
case TITLE:
break;
default:
isPaused = true;
isStopped = true;
break;
}
}
private void doTitle() {
gameState = TITLE;
removeCommand(pauseCmd);
removeCommand(resumeCmd);
removeCommand(quitCmd);
repaint();
addCommand(exitCmd);
addCommand(startCmd);
}
private void doThreadStart() {
new Thread(this).start();
}
private void doGameStop() {
isStopped = true;
setHighScore(score);
}
private void doPauseOrResume() {
if(isPaused) {
isPaused = false;
isStopped = false;
doThreadStart();
}else {
isPaused = true;
doGameStop();
}// end if
repaint();
}
protected void paint(Graphics g) {
g.setColor(0x00000000);
g.fillRect(0, 0, screenWidth, screenHeight);
g.setFont(defFont);
String drawSt;
int drawX, drawY, stWidth;
int stHeight = defFont.getHeight();
switch(gameState) {
case TITLE:
drawX = (screenWidth - titleImg.getWidth()) /2;
g.drawImage(titleImg, drawX, 0, Graphics.TOP|Graphics.LEFT);
g.setColor(0x00FFFFFF);
g.setFont(defFont);
drawSt = "High Score";
drawX = (screenWidth - defFont.stringWidth(drawSt)) / 2;
drawY = titleImg.getHeight() -5;
g.drawString(drawSt, drawX, drawY, Graphics.TOP|Graphics.LEFT);
drawX = drawX + defFont.stringWidth(drawSt) - defFont.stringWidth(String.valueOf(highScore));
drawY = drawY + stHeight;
g.drawString(String.valueOf(highScore), drawX, drawY, Graphics.TOP|Graphics.LEFT);
drawSt = "xinlei";
drawX = (screenWidth - defFont.stringWidth(drawSt)) / 2;
drawY = getHeight() - stHeight *2;
g.drawString(drawSt, drawX, drawY, Graphics.TOP|Graphics.LEFT);
drawSt = "sallon-hhh.com";
drawX = (screenWidth - defFont.stringWidth(drawSt)) / 2;
drawY = drawY + stHeight;
g.drawString(drawSt, drawX, drawY, Graphics.TOP|Graphics.LEFT);
return;
case GAME_START:
g.setColor(0x00FFFFFF);
drawSt = "Ready go !";
stWidth = defFont.stringWidth(drawSt);
drawX = (screenWidth - stWidth) / 2;
drawY = (screenHeight - stHeight) / 2;
g.drawString(drawSt, drawX, drawY, Graphics.TOP|Graphics.LEFT);
return;
case GAME_PLAYING:
case GAME_END:
g.setColor(0x00FFFFFF);
drawSt = "S:" + String.valueOf(score);
g.drawString(drawSt, 0, 0, Graphics.TOP|Graphics.LEFT);
drawSt = "L:" + String.valueOf(lives);
g.drawString(drawSt, screenWidth- defFont.stringWidth(drawSt), 0, Graphics.TOP|Graphics.LEFT);
myShip.doDraw(g);
for(int i=0; i < ufos.length; i++) {
ufos[i].doDraw(g);
}
for(int i=0; i < myMissiles.length; i++) {
myMissiles[i].doDraw(g);
}
for(int i=0; i < ufoMissiles.length; i++) {
ufoMissiles[i].doDraw(g);
}
switch(gameState) {
case GAME_PLAYING:
if(isPaused) {
drawSt = "Pause";
}else {
return;
}
break;
case GAME_END:
drawSt = "Game over";
break;
default:
return;
}
stWidth = defFont.stringWidth(drawSt);
drawX = (screenWidth-stWidth) / 2;
drawY = (screenHeight - (stHeight)) / 2;
g.setColor(0x00BBBBBB);
g.fillRoundRect(drawX-2, drawY+2, stWidth+9, stHeight+2, 5, 5);
g.setColor(0x00000000);
g.fillRoundRect(drawX-6, drawY-2, stWidth+11, stHeight+4, 5, 5);
g.setColor(0x00FFFFFF);
g.fillRoundRect(drawX-4, drawY, stWidth+7, stHeight, 5, 5);
g.setColor(0x00000000);
g.drawString(drawSt, drawX, drawY, Graphics.TOP|Graphics.LEFT);
break;
}
}
public void commandAction(Command c, Displayable s) {
if(c == startCmd) {
doGameInit();
gameState = GAME_START;
doThreadStart();
}else if(c == exitCmd) {
spaceShooter.doExit();
}else if(c == pauseCmd) {
removeCommand(pauseCmd);
addCommand(resumeCmd);
doPauseOrResume();
}else if(c == resumeCmd) {
removeCommand(resumeCmd);
addCommand(pauseCmd);
doPauseOrResume();
}else if(c == quitCmd) {
doGameStop();
removeCommand(pauseCmd);
removeCommand(resumeCmd);
removeCommand(quitCmd);
doTitle();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -