📄 hscanvas.java
字号:
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;
import java.util.*;
import java.io.*;
import javax.microedition.media.*;
import javax.microedition.media.control.*;
import javax.microedition.rms.*;
import java.io.InputStream;
import java.io.PrintStream;
public class HSCanvas extends GameCanvas implements Runnable {
private Random rand;
private Display display;
private boolean sleeping;
private long frameDelay;
private LayerManager layers;
private int xView, yView;
private TiledLayer waterLayer;
private TiledLayer landLayer;
private int waterDelay;
private int[] waterTile = { 1, 3 };
private Image infoBar;
private Image screen;
private Sprite playerSprite;
private RunSprite[] unicornSprite = new RunSprite[2];
private DriftSprite[] boxlSprite = new DriftSprite[2];
private DriftSprite[] ballSprite = new DriftSprite[5];
private DriftSprite[] flowerSprite = new DriftSprite[5];
private ChaseSprite[] ghostSprite = new ChaseSprite[5];
private Player musicPlayer;
private Player rescuePlayer;
private Player ballPlayer;
private Player gameoverPlayer;
private boolean gameOver;
private int energy, unicornSaved;
int lastCollide = -1;
private int score;
private int[] hiScores = new int[5];
public HSCanvas(Display d)
{
super(true);
display = d;
// 初始化随机数生成器
rand = new Random();
// 设置帧率
frameDelay = 33;
}
public void start() {
display.setCurrent(this);
// 读取最高得分
readHiScores();
// 新建信息栏图像、水域图层和陆地图层
try {
infoBar = Image.createImage("/InfoBar.png");
waterLayer = new TiledLayer(24, 24, Image.createImage("/Water.png"), 32, 32);
landLayer = new TiledLayer(24, 24, Image.createImage("/plants.png"), 32, 32);
screen = Image.createImage("/screen.png");
} catch (IOException e) {}
// 初始化水域图层
waterLayer.createAnimatedTile(1);
waterLayer.createAnimatedTile(3);
int[] waterMap = {
0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, -1, 1, -1, 1, 1, -1, -2, 1, -1, 1, 1, -1, 1, 1, -1, 1, 1, -1, 1, -2, 1, 1,
1, 1, 1, 1, -1, 1, -1, 1, 1, -1, 1, 1, -2, 1, -1, 1, 1, -2, 1, 1, -1, 1, 1, 1,
1, 1, -2, -1, 1, -1, 1, -2, 1, 1, -2, 1, 1, -1, 1, -2, 1, 1, -2, 1, 1, -1, 1, 1,
1, 1,-1, 1, -1, 1, -1, 1, 1, -1, 1, 1, -1, 1, -1, 1, -1, -1, 1, 1, -1, 1, 1, 1,
1, 1, 1, -1, 1, -1, 1, 1, -1, 1, 1, -1, 1, -2, 1, -1, 1, 1, -1, 1, 1, 1, 1, 1,
1, 1, -1, 1, -1, 1, 1, -1, 1, 1, -1, 1, 1, -1, 1, 1, -1, 1, 1, -1, 1, -1, 1, 1,
1, 1, 1, -1, -2, 1, 1, 1, -1, 1, 1, -2, -1, 1, 1, -2, 1, 1, -2, 1, -1, -2, 1, 1,
1, 1, -2, 1, 1, 1, -1, -2, 1, -1, 1, -1, 1, 1, -1, 1, -1, 1, -1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, -1, 1, 1, -1, 1, 1, 1, -2, -1, 1, 1, 1, -1, 1, -1, 1, -1, 1, 1,
1, 1, 1, -1, -2, 1, -1, -2, 1, -2, -1, 1, -1, 1, -1, -1, -1, 1, -1, 1, -1, 1, 1, 1,
1, 1, -2, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, -1, 1, 1, 1, -2, 1, 1, -2, -1, 1, 1,
1, 1, -1, 1, -1, -1, 1, -1, -2, -1, 1, 1, -2, 1, -1, 1, -1, 1, 1, -1, 1, 1, 1, 1,
1, 1, 1, -2, 1, 1, -1, 1, 1, 1, -1, -1, 1, -1, 1, 1, 1, 1, -1, 1, 1, -1, 1, 1,
1, 1, -1, 1, 1, -2, 1, -2, -1, 1, -1, 1, -1, 1, 1, -1, -2, 1, -1, 1, -2, 1, 1, 1,
1, 1, -2, 1, -1, 1, -1, 1, 1, -1, 1, -1, 1, -2, -1, 1, 1, -1, 1, -1, 1, 1, 1, 1,
1, 1, 1, 1, -1, 1, 1, -1, 1, 1, -2, 1, -1, 1, 1, 1, -1, 1, -1, 1, -1, -1, 1, 1,
1, 1, 1, -1, 1, -2, 1, -2, -1, 1, 1, -1, 1, -1, 1, -1, 1, -1, -2, -1, 1, 1, 1, 1,
1, 1, -1, 1, -1, 1, 1, -1, 1, -2, -1, 1, -2, -1, -2, 1, -1, -2, 1, -1, -2, 1, 1, 1,
1, 1, 1, -1, 1, -1, 1, -1, 1, -1, 1, 1, -1, 1, -1, 1, -1, 1, -1, 1, 1, -1, 1, 1,
1, 1, -2, -1, 1, 1, -2, 1, -1, 1, -1, -2, 1, -2, 1, -1, -2, 1, 1, -2, -1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
};
for (int i = 0; i < waterMap.length; i++) {
int column = i % 24;
int row = (i - column) / 24;
waterLayer.setCell(column, row, waterMap[i]);
}
// 初始化水域动画延迟
waterDelay = 0;
// 初始化陆地图层
int[] landMap = { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20 ,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20 ,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20 ,
20, 20, 20, 0, 20, 0, 0, 0, 20, 0, 20, 0, 0, 0, 20, 20,
20, 0, 20, 20, 20, 20, 20, 20 ,
20, 20, 20, 0, 20, 20, 0, 20, 20, 0, 20, 0, 0, 0, 20, 0,
0, 0, 20, 0, 0, 20, 20, 20 ,
20, 20, 20, 0, 0, 20, 0, 0, 0, 0, 20, 0, 20, 20, 20, 20,
20, 0, 20, 20, 20, 20, 20, 20 ,
20, 20, 20, 0, 20, 20, 0, 20, 20, 20, 20, 0, 20, 0, 0, 20,
0, 0, 20, 0, 0, 20, 20, 20 ,
20, 20, 20, 0, 20, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0,
0, 0, 0, 0, 20, 20, 20, 20 ,
20, 20, 20, 0, 20, 20, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20,
20, 0, 20, 0, 20, 20, 20, 20 ,
20, 20, 20, 0, 0, 20, 0, 0, 0, 0, 20, 0, 1, 2, 3, 0,
0, 0, 20, 0, 20, 0, 0, 20 ,
20, 20, 20, 0, 0, 20, 0, 20, 0, 0, 0, 0, 5, 6, 7, 0,
0, 0, 0, 0, 0, 20, 20, 20 ,
20, 20, 20, 0, 0, 0, 0, 20, 0, 20, 20, 0, 9, 10, 11, 20,
20, 0, 0, 20, 0, 20, 20, 20 ,
20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0,
20, 0, 0, 20, 0, 20, 20, 20 ,
20, 20, 20, 0, 0, 0, 0, 0, 0, 20, 20, 20, 20, 20, 0, 0,
20, 0, 0, 20, 0, 20, 20, 20 ,
20, 20, 20, 20, 20, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0,
20, 0, 0, 20, 0, 20, 20, 20 ,
20, 20, 20, 0, 0, 0, 20, 20, 20, 20, 20, 20, 0, 0, 20, 0,
20, 0, 20, 20, 20, 20, 20, 20 ,
20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 20, 0,
20, 0, 0, 0, 0, 20, 20, 20 ,
20, 20, 20, 20, 20, 20, 0, 20, 0, 0, 0, 20, 20, 20, 20, 0,
20, 0, 0, 20, 20, 20, 20, 20 ,
20, 20, 20, 0, 0, 0, 0, 20, 0, 20, 0, 0, 0, 0, 0, 0,
20, 0, 0, 0, 0, 20, 20, 20 ,
20, 20, 20, 20, 20, 0, 20, 20, 20, 20, 0, 20, 20, 20, 20, 20,
20, 0, 0, 0, 0, 20, 20, 20 ,
20, 20, 20, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0,
20, 20, 20, 20, 0, 20, 20, 20,
20, 20, 20, 0, 20, 20, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20,
20, 0, 0, 0, 0, 20, 20, 20 ,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20 ,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20 ,
};
for (int i = 0; i < landMap.length; i++) {
int column = i % 24;
int row = (i - column) / 24;
landLayer.setCell(column, row, landMap[i]);
}
// 初始化精灵
try {
playerSprite = new Sprite(Image.createImage("/Player.png"), 32, 33);
int sequence2[] = { 0, 0, 0, 1, 1, 1 };
int sequence4[] = { 0, 0, 1, 1, 2, 2, 3, 3 };
for (int i = 0; i < 2; i++) {
unicornSprite[i] = new RunSprite(Image.createImage("/unicorn.png"), 35, 35, 3, landLayer, playerSprite, 3);
unicornSprite[i].setFrameSequence(sequence2);
placeSprite(unicornSprite[i], landLayer);
}
for (int i = 0; i < 2; i++) {
boxlSprite[i] = new DriftSprite(Image.createImage("/box.png"), 48, 48, 1, landLayer);
boxlSprite[i].setFrameSequence(sequence4);
placeSprite(boxlSprite[i], landLayer);
}
for (int i = 0; i < 5; i++) {
ballSprite[i] = new DriftSprite(Image.createImage("/ball.png"), 40, 40, 1, landLayer);
ballSprite[i].setFrameSequence(sequence2);
placeSprite(ballSprite[i], landLayer);
}
for (int i = 0; i < 5; i++) {
flowerSprite[i] = new DriftSprite(Image.createImage("/flower.png"), 32, 32, 1, landLayer);
flowerSprite[i].setFrameSequence(sequence4);
placeSprite(flowerSprite[i], landLayer);
}
for (int i = 0; i < 5; i++) {
ghostSprite[i] = new ChaseSprite(
Image.createImage("/ghost.png"),
40, 40, 3, landLayer, playerSprite, 3);
ghostSprite[i].setFrameSequence(sequence4);
placeSprite(ghostSprite[i], landLayer);
}
} catch (IOException e) { }
// 建立图层管理器
layers = new LayerManager();
layers.append(playerSprite);
for (int i = 0; i < 2; i++) {
layers.append(unicornSprite[i]);
layers.append(boxlSprite[i]);
}
for (int i = 0; i < 5; i++) {
layers.append(ballSprite[i]);
layers.append(ghostSprite[i]);
layers.append(flowerSprite[i]);
}
layers.append(landLayer);
layers.append(waterLayer);
// 初始化音乐播放器
try {
InputStream is = getClass().getResourceAsStream("Music.mid");
musicPlayer = Manager.createPlayer(is, "audio/midi");
musicPlayer.prefetch();
musicPlayer.setLoopCount(-1);
is = getClass().getResourceAsStream("1.wav");
rescuePlayer = Manager.createPlayer(is, "audio/X-wav");
rescuePlayer.prefetch();
is = getClass().getResourceAsStream("2.wav");
ballPlayer = Manager.createPlayer(is, "audio/X-wav");
ballPlayer.prefetch();
is = getClass().getResourceAsStream("3.wav");
gameoverPlayer = Manager.createPlayer(is, "audio/X-wav");
gameoverPlayer.prefetch();
}catch (IOException ioe) {
}catch (MediaException me) {}
// 开始新游戏
newGame();
// 开始动画线程
sleeping = false;
Thread t = new Thread(this);
t.start();
}
public void stop() {
// 关闭音乐播放器
musicPlayer.close();
rescuePlayer.close();
ballPlayer.close();
gameoverPlayer.close();
//停止动画
sleeping = true;
// 记录最高得分
writeHiScores();
}
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)
// 如果按下FIRE键,则开始新游戏
newGame();
// 游戏已经结束,不用继续更新
return;
}
// 处理用户输入,计算移动距离,船只进行精灵动画
int keyState = getKeyStates();
int xMove = 0, yMove = 0;
int sequence0[] = { 4, 4,5, 5,6,6,7, 7,};
int sequence1[] = { 8, 8, 9, 9, 10, 10, 11, 11 };
int sequence2[] = { 12, 12, 13, 13, 14, 14, 15, 15 };
int sequence3[] = { 0, 0, 1, 1, 2, 2, 3, 3 };
if ((keyState & LEFT_PRESSED) != 0) {
xMove = -5;
playerSprite.nextFrame();
int nCurrentFrame = playerSprite.getFrame();
playerSprite.setFrameSequence(sequence0);
playerSprite.setFrame(nCurrentFrame);
}else if ((keyState & RIGHT_PRESSED) != 0) {
xMove = 5;
playerSprite.nextFrame();
int nCurrentFrame = playerSprite.getFrame();
playerSprite.setFrameSequence(sequence1);
playerSprite.setFrame(nCurrentFrame);
}
if ((keyState & UP_PRESSED) != 0) {
yMove = -5;
playerSprite.nextFrame();
int nCurrentFrame = playerSprite.getFrame();
playerSprite.setFrameSequence(sequence2);
playerSprite.setFrame(nCurrentFrame);
} else if ((keyState & DOWN_PRESSED) != 0) {
yMove = 5;
playerSprite.nextFrame();
int nCurrentFrame = playerSprite.getFrame();
playerSprite.setFrameSequence(sequence3);
playerSprite.setFrame(nCurrentFrame);
}
// 如果发生移动,重新定位视图窗口
// 精灵也要随之移动
if (xMove != 0 || yMove != 0) {
layers.setViewWindow(xView + xMove, yView + yMove, getWidth(),
getHeight() - infoBar.getHeight());
playerSprite.move(xMove, yMove);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -