?? hcanvas.java
字號:
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;
import java.io.*;
import javax.microedition.media.*;
public class HCanvas extends GameCanvas implements Runnable {
private Display display;
private boolean sleeping;
private long frameDelay;
private int inputDelay;
private Image background;
private Image chickenHead;
private Sprite chickenSprite;
private Sprite[] carSprite = new Sprite[4];
private int[] carYSpeed = new int[4];
private boolean gameOver;
private int numLives;
private int score;
private Player musicPlayer;
private Player celebratePlayer;
private Player squishPlayer;
private Player gameoverPlayer;
public HCanvas(Display d) {
super(true);
display = d;
// 設置流速率為20
frameDelay = 10;
// 設置輸入延時
inputDelay = 0;
}
public void start() {
// 設置顯示界面
display.setCurrent(this);
// 初始化游戲
gameOver = false;
numLives = 3;
score = 0;
// 設置背景圖片和小車的圖片
try {
background = Image.createImage("/Highway.png");
chickenHead = Image.createImage("/ChickenHead.png");
chickenSprite = new Sprite(Image.createImage("/Chicken.png"), 22, 22);
chickenSprite.setPosition(2, 77);
carSprite[0] = new Sprite(Image.createImage("/Car1.png"));
carSprite[0].setPosition(40, 0);
carYSpeed[0] = 3;
carSprite[1] = new Sprite(Image.createImage("/Car2.png"));
carSprite[1].setPosition(85, 0);
carYSpeed[1] = 1;
carSprite[2] = new Sprite(Image.createImage("/Car3.png"));
carSprite[2].setPosition(130, 67);
carYSpeed[2] = -2;
carSprite[3] = new Sprite(Image.createImage("/Car4.png"));
carSprite[3].setPosition(170, 64);
carYSpeed[3] = -5;
}
catch (IOException e) {
System.err.println("Failed loading images!");
}
// 設置音樂為WAV格式播放
try {
InputStream is = getClass().getResourceAsStream("Music.mid");
musicPlayer = Manager.createPlayer(is, "audio/midi");
musicPlayer.prefetch();
is = getClass().getResourceAsStream("Celebrate.wav");
celebratePlayer = Manager.createPlayer(is, "audio/X-wav");
celebratePlayer.prefetch();
is = getClass().getResourceAsStream("Squish.wav");
squishPlayer = Manager.createPlayer(is, "audio/X-wav");
squishPlayer.prefetch();
is = getClass().getResourceAsStream("GameOver.wav");
gameoverPlayer = Manager.createPlayer(is, "audio/X-wav");
gameoverPlayer.prefetch();
}
catch (IOException ioe) {
}
catch (MediaException me) {
}
// 開始音樂播放的條件
try {
musicPlayer.setLoopCount(-1);
musicPlayer.start();
}
catch (MediaException me) {
}
// 啟動動畫線程
sleeping = false;
Thread t = new Thread(this);
t.start();
}
public void stop() {
// 關閉音樂播放器
musicPlayer.close();
celebratePlayer.close();
squishPlayer.close();
gameoverPlayer.close();
// 停止動畫
sleeping = true;
}
public void run() {
Graphics g = getGraphics();
// 主游戲循環
while (!sleeping) {
update();
draw(g);
try {
Thread.sleep(frameDelay);
}
catch (InterruptedException ie) {}
}
}
private void update() {
// 游戲是否重新開始
if (gameOver) {
int keyState = getKeyStates();
if ((keyState & FIRE_PRESSED) != 0) {
//重新開始
try {
musicPlayer.setMediaTime(0);
musicPlayer.start();
}
catch (MediaException me) {
}
chickenSprite.setPosition(2, 77);
gameOver = false;
score = 0;
numLives = 3;
}
// 游戲結束,不要任何更新
return;
}
// 使用者移動小雞
if (++inputDelay > 2) {
int keyState = getKeyStates();
if ((keyState & LEFT_PRESSED) != 0) {
chickenSprite.move(-6, 0);
chickenSprite.nextFrame();
}
else if ((keyState & RIGHT_PRESSED) != 0) {
chickenSprite.move(6, 0);
chickenSprite.nextFrame();
}
if ((keyState & UP_PRESSED) != 0) {
chickenSprite.move(0, -6);
chickenSprite.nextFrame();
}
else if ((keyState & DOWN_PRESSED) != 0) {
chickenSprite.move(0, 6);
chickenSprite.nextFrame();
}
checkBounds(chickenSprite, false);
// 重新設置輸入延遲
inputDelay = 0;
}
// 小雞是否通過
if (chickenSprite.getX() >200) {
// 安全通過后的聲音
try {
celebratePlayer.start();
}
catch (MediaException me) {
}
// 重新設定小雞位置
chickenSprite.setPosition(2, 77);
score += 25;
}
// 更新小車的速度
for (int i = 0; i < 4; i++) {
// Move the car sprites
carSprite[i].move(0, carYSpeed[i]);
checkBounds(carSprite[i], true);
// 檢查為小雞和汽車之間的碰撞
if (chickenSprite.collidesWith(carSprite[i], true)) {
// 小雞死后的聲音
try {
squishPlayer.start();
}
catch (MediaException me) {
}
// 游戲結束
if (--numLives == 0) {
// 停止游戲和播放聲音
try {
musicPlayer.stop();
gameoverPlayer.start();
}
catch (MediaException me) {
}
gameOver = true;
} else {
//重新設置小雞位置
chickenSprite.setPosition(2, 77);
}
// 停止更新
break;
}
}
}
private void draw(Graphics g) {
// 繪制公路背景
g.drawImage(background, 0, 0, Graphics.TOP | Graphics.LEFT);
// 設置小雞的新位置
for (int i = 0; i < numLives; i++)
g.drawImage(chickenHead, 180 - ((i + 1) * 8), 190, Graphics.TOP | Graphics.LEFT);
// 畫小雞精靈
chickenSprite.paint(g);
//畫小車精靈
for (int i = 0; i < 4; i++)
carSprite[i].paint(g);
if (gameOver) {
// 畫游戲結束是所得分數
g.setColor(255, 255, 255); // white
g.setFont(Font.getFont(Font.FACE_MONOSPACE, Font.STYLE_BOLD, Font.SIZE_LARGE));
g.drawString("游戲終結", 90, 40, Graphics.TOP | Graphics.HCENTER);
g.setFont(Font.getFont(Font.FACE_MONOSPACE, Font.STYLE_BOLD, Font.SIZE_MEDIUM));
g.drawString("你的成績是: " + score + " 分", 90, 70, Graphics.TOP |
Graphics.HCENTER);
}
flushGraphics();
}
private void checkBounds(Sprite sprite, boolean wrap) {
// 如果有需要的話停止精靈
if (wrap) {
// 畫一個精靈在邊框位置
if (sprite.getX() < -sprite.getWidth())
sprite.setPosition(getWidth(), sprite.getY());
else if (sprite.getX() > getWidth())
sprite.setPosition(-sprite.getWidth(), sprite.getY());
if (sprite.getY() < -sprite.getHeight())
sprite.setPosition(sprite.getX(), getHeight());
else if (sprite.getY() > getHeight())
sprite.setPosition(sprite.getX(), -sprite.getHeight());
}
else {
// 停止精靈在邊框位置
if (sprite.getX() < 0)
sprite.setPosition(0, sprite.getY());
else if (sprite.getX() > (getWidth() - sprite.getWidth()))
sprite.setPosition(getWidth() - sprite.getWidth(), sprite.getY());
if (sprite.getY() < 0)
sprite.setPosition(sprite.getX(), 0);
else if (sprite.getY() > (getHeight() - sprite.getHeight()))
sprite.setPosition(sprite.getX(), getHeight() - sprite.getHeight());
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -