📄 hscanvas.java
字号:
}
// 检查船只和陆地图层是否碰撞
if (playerSprite.collidesWith(landLayer, true)) {
// 恢复视图窗口位置和船只精灵的位置
layers.setViewWindow(xView, yView, getWidth(),
getHeight() - infoBar.getHeight());
playerSprite.move(-xMove, -yMove);
}else if(xView + xMove < 0
|| yView + yMove < infoBar.getHeight()
|| landLayer.getWidth() - (xView + xMove) < getWidth()
|| landLayer.getHeight() - (yView + yMove) < (getHeight() - infoBar.getHeight())
) {
// 检测视图的边界问题,如果超出边界
// 恢复最初的视图窗口位置
layers.setViewWindow(xView, yView, getWidth(), getHeight() - infoBar.getHeight());
} else {
// 否则,提交对视图窗口位置的改变
xView += xMove;
yView += yMove;
}
for (int i = 0; i < 2; i++) {
// 更新海盗精灵
unicornSprite[i].update();
// 检查船只是否和海盗遇上
if (playerSprite.collidesWith(unicornSprite[i], true)) {
// 播放营救海盗的声音
try {
rescuePlayer.start();
}catch (MediaException me) {}
// 递增营救海盗数目
unicornSaved++;
score += 100;
// 随机地将海盗放置在另一个地方
placeSprite(unicornSprite[i], landLayer);
}
}
for (int i = 0; i < 2; i++) {
// 更新箱子精灵
boxlSprite[i].update();
// 检查船只是否和箱子遇上
if (playerSprite.collidesWith(boxlSprite[i], true)) {
// 播放从浮桶得到能量的声音
try {
Manager.playTone(ToneControl.C4 + 12, 250, 100);
}catch (MediaException me) {}
// 增加船只的能量
energy = Math.min(energy + 20, 80);
// 随机地将箱子放置在另一个地方
placeSprite(boxlSprite[i], landLayer);
}
}
for (int i = 0; i <5; i++) {
// 更新花精灵
flowerSprite[i].update();
// 检查船只是否和花遇上
if (playerSprite.collidesWith(flowerSprite[i], true)) {
try {
Manager.playTone(ToneControl.C4 + 12, 250, 100);
}catch (MediaException me) {}
score += 10;
placeSprite(flowerSprite[i], landLayer);
}
}
for (int i = 0; i < 5; i++) {
// 更新球精灵
ballSprite[i].update();
// 检查船只是否和球遇上
if (playerSprite.collidesWith(ballSprite[i], true)) {
// 播放碰撞到球的声音
try {
ballPlayer.start();
}catch (MediaException me) {}
// 减少船只的能量
energy -= 5;
// 随机地将球放置在另一个地方
placeSprite(ballSprite[i], landLayer);
}
}
for (int i = 0; i < 5; i++) {
// 更新鬼精灵
ghostSprite[i].update();
//如果上次遇到的就是这只鬼则不检测
if (lastCollide != i){
// 检查船只是否和鬼遇上
if (playerSprite.collidesWith(ghostSprite[i], true)) {
// 播放碰撞到鬼的声音
try {
Manager.playTone(ToneControl.C4, 250, 100);
}catch (MediaException me) {}
// 减少能量
energy -= 5;
score -= 15;
// 记录遇到的这次鬼的编号
lastCollide = i;
}
}
}
// 如果能量小于0,则游戏结束
if (energy <= 0) {
// 停止背景音乐
try {
musicPlayer.stop();
}catch (MediaException me) {}
// 播放沉船的音乐
try {
gameoverPlayer.start();
}catch (MediaException me) {}
// 隐藏船只
playerSprite.setVisible(false);
// 更新高分列表
updateHiScores();
gameOver = true;
return;
}
// 更新水域动画贴砖
if (++waterDelay > 3) {
if (++waterTile[0] > 3)
waterTile[0] = 1;
waterLayer.setAnimatedTile(-1, waterTile[0]);
if (--waterTile[1] < 1)
waterTile[1] = 3;
waterLayer.setAnimatedTile(-2, waterTile[1]);
waterDelay = 0;
}
}
private void draw(Graphics g) {
// 画状态栏图片,如果屏幕太宽,重复状态栏图片
int nBlankLeft = getWidth();
do {
g.drawImage(infoBar, getWidth() - nBlankLeft,
0, Graphics.TOP | Graphics.LEFT);
nBlankLeft -= infoBar.getWidth();
}while(nBlankLeft > 0);
// 输出状态栏上的能量和营救的海盗数目
g.setColor(0, 0, 0); // black
g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_MEDIUM));
g.drawString("energe:", 2, 1, Graphics.TOP | Graphics.LEFT);
g.drawString("unicorn num: " + unicornSaved, 115, 1, Graphics.TOP | Graphics.LEFT);
g.setColor(32, 32, 255); // blue
g.fillRect(40, 3, energy, 12);
// 绘制图层管理器
layers.paint(g, 0, infoBar.getHeight());
if (gameOver) {
// 输出游戏结束消息和营救的伙伴数目,绘制闪屏和高分列表
g.drawImage(screen, 90, 30, Graphics.TOP | Graphics.HCENTER);
g.setColor(255, 255, 0); // white
g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD, Font.SIZE_LARGE));
g.drawString("GAME OVER",95, 50, Graphics.TOP | Graphics.HCENTER);
g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD, Font.SIZE_MEDIUM));
if (unicornSaved == 0)
g.drawString("你太笨了!", 91, 70, Graphics.TOP | Graphics.HCENTER);
else if (unicornSaved == 1)
g.drawString("才找到一个!!", 90, 70, Graphics.TOP | Graphics.HCENTER);
else
g.drawString("你找到了 " + unicornSaved + "独角兽", 93, 70, Graphics.TOP |
Graphics.HCENTER);
g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD, Font.SIZE_LARGE));
for (int i = 0; i < 5; i++)
g.drawString(Integer.toString(hiScores[i]), 90, 90 + (i * 15), Graphics.TOP | Graphics.HCENTER);
}
flushGraphics();
}
private void newGame() {
// 初始化游戏变量
gameOver = false;
energy = 80;
score = 0;
unicornSaved = 0;
// 显示海盗船
playerSprite.setVisible(true);
// 随机地放置海盗,并合理设置视图窗口位置
placeSprite(playerSprite, landLayer);
xView = playerSprite.getX() - ((getWidth() - playerSprite.getWidth()) / 2);
yView = playerSprite.getY() - ((getHeight() - playerSprite.getHeight()) / 2);
layers.setViewWindow(xView, yView, getWidth(), getHeight() - infoBar.getHeight());
// 开始背景音乐
try {
musicPlayer.setMediaTime(0);
musicPlayer.start();
}catch (MediaException me) {}
}
private void placeSprite(Sprite sprite, TiledLayer barrier) {
// 尝试一个随机位置
sprite.setPosition(Math.abs(rand.nextInt() % barrier.getWidth()) -
sprite.getWidth(), Math.abs(rand.nextInt() % barrier.getHeight()) -
sprite.getHeight());
// 重新置位直到没有冲突
// 不要太靠近边界
int nLeft = (getWidth() - playerSprite.getWidth()) / 2;
int nTop = (getHeight() - playerSprite.getHeight()) / 2;
int nRight = landLayer.getWidth() - getWidth() + nLeft;
int nBottom = landLayer.getHeight() - getHeight() + nTop;
while (sprite.collidesWith(barrier, true)
|| sprite.getX() < nLeft || sprite.getX() > nRight
|| sprite.getY() < nTop || sprite.getY() > nBottom) {
sprite.setPosition(Math.abs(rand.nextInt() % barrier.getWidth()) -
sprite.getWidth(), Math.abs(rand.nextInt() % barrier.getHeight()) -
sprite.getHeight());
}
}
private void updateHiScores() {
// 察看当前得分是否需要进入最高得分列表
int i;
for (i = 0; i < 5; i++)
if (score > hiScores[i])
break;
// 把当前得分载入到最高得分列表中
if (i < 5) {
for (int j = 4; j > i; j--) {
hiScores[j] = hiScores[j - 1];
}
hiScores[i] = score;
}
}
private void readHiScores()
{
// 打开HiScores记录存储
RecordStore rs = null;
try {
rs = RecordStore.openRecordStore("HiScores", false);
}catch (Exception e) {}
if (rs != null) {
// 读出最高得分记录
try {
int len;
byte[] recordData = new byte[8];
for (int i = 1; i <= rs.getNumRecords(); i++) {
// 如果需要,重新分配记录保存变量
if (rs.getRecordSize(i) > recordData.length)
recordData = new byte[rs.getRecordSize(i)];
// 读取记录,并把它保存到hiScores数组中
len = rs.getRecord(i, recordData, 0);
hiScores[i - 1] =
(Integer.parseInt(new String(recordData, 0, len)));
}
}catch (Exception e) {}
// 关闭记录存储
try {
rs.closeRecordStore();
}catch (Exception e) {}
}
else {
// 记录存储不存在,初始化最高得分列表
for (int i = 0; i < 5; i++)
hiScores[i] = 0;
}
}
private void writeHiScores()
{
// 删除HiScore记录存储
try {
RecordStore.deleteRecordStore("HiScores");
}catch (Exception e) {}
// 创建一个新的HiScore记录存储
RecordStore rs = null;
try {
rs = RecordStore.openRecordStore("HiScores", true);
}catch (Exception e) {}
// 写入得分
for (int i = 0; i < 5; i++) {
// 格式化每个得分以便写入
byte[] recordData =
Integer.toString(hiScores[i]).getBytes();
try {
// 把得分作为记录写入
rs.addRecord(recordData, 0, recordData.length);
}catch (Exception e) {}
}
// 关闭记录存储
try {
rs.closeRecordStore();
}catch (Exception e) {}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -