📄 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.*;
public class HSCanvas extends GameCanvas implements Runnable
{
private Graphics bg;
private Random rand;
private int xView, yView; //视窗坐标
private TiledLayer waterLayer; //海水图层
private TiledLayer landLayer; //陆地图层
private LayerManager layers; //图层管理者
private int[] waterTile = { 1, 3 };
private Image infoBar; //信息条
private CorsairSprite playerSprite; //玩家精灵
private ChaseSprite enemyShipSprite; //敌船精灵
private DriftSprite[] pirateSprite = new DriftSprite[2]; //海盗精灵
private DriftSprite[] barrelSprite = new DriftSprite[2]; //木桶精灵
private DriftSprite[] mineSprite = new DriftSprite[5]; //水雷精灵
private DriftSprite[] squidSprite = new DriftSprite[5]; //章鱼精灵
private Player musicPlayer; //音效
private Player rescuePlayer;
private Player minePlayer;
private Player gameoverPlayer;
private boolean gameOver; //游戏结束标志
private int energy; //玩家生命值
private int piratesSaved; //救援海盗数量
public HSCanvas(boolean arg0)
{
super(arg0);
this.setFullScreenMode(true);
rand = new Random();
try
{
infoBar = Image.createImage("/InfoBar.png");
}
catch (IOException e)
{
}
createLandLayer();
createWaterLayer();
createSprite();
// 创建图层管理者
layers = new LayerManager();
layers.append(playerSprite);
layers.append(enemyShipSprite);
for (int i = 0; i < 2; i++)
{
layers.append(pirateSprite[i]);
layers.append(barrelSprite[i]);
}
for (int i = 0; i < 5; i++)
{
layers.append(mineSprite[i]);
layers.append(squidSprite[i]);
}
layers.append(landLayer);
layers.append(waterLayer);
// 初始化音效
try
{
InputStream is = getClass().getResourceAsStream("Music.mid");
musicPlayer = Manager.createPlayer(is, "audio/midi");
musicPlayer.setLoopCount(-1);
is = getClass().getResourceAsStream("Rescue.wav");
rescuePlayer = Manager.createPlayer(is, "audio/X-wav");
is = getClass().getResourceAsStream("Mine.wav");
minePlayer = Manager.createPlayer(is, "audio/X-wav");
is = getClass().getResourceAsStream("GameOver.wav");
gameoverPlayer = Manager.createPlayer(is, "audio/X-wav");
}
catch (Exception e)
{
}
// 开始新游戏
newGame();
Thread t = new Thread(this);
t.start();
}
//创建陆地图层
private void createLandLayer()
{
int[][] map={{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,32,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,26, 1, 1},
{1, 1,31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,27, 1, 1},
{1, 1,31, 0, 0, 0, 0, 0, 0, 0, 6, 7, 0, 0, 0, 0, 0, 0, 6, 7, 0,27, 1, 1},
{1, 1,31, 0, 0, 0, 0, 0, 0, 0,10,12, 0, 0, 0, 0, 0, 6,14,12, 0,27, 1, 1},
{1, 1,31, 0, 6,11,11,11,11,11,14,12, 0, 0, 0, 0, 0,10,16, 8, 0,27, 1, 1},
{1, 1,31, 0,10,16, 9, 9, 9, 9, 9, 8, 0, 0, 0, 0, 0, 5, 8, 0, 0,27, 1, 1},
{1, 1,31, 0,10,12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,27, 1, 1},
{1, 1,31, 0,10,15, 7, 0, 0, 6,11, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0,27, 1, 1},
{1, 1,31, 0,10,16, 8, 0, 6,14,16, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0,27, 1, 1},
{1, 1,31, 0,10,12, 0, 0,10, 1,12, 0, 0, 0, 0, 6,11,11, 7, 0, 0,27, 1, 1},
{1, 1,31, 0,10,15,11,11,14,16, 8, 0, 0, 0, 0,10, 1, 1,12, 0, 0,27, 1, 1},
{1, 1,31, 0, 5, 9, 9, 9, 9, 8, 0, 0, 0, 0, 0,10, 1, 1,12, 0, 0,27, 1, 1},
{1, 1,31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 9, 9, 8, 0, 0,27, 1, 1},
{1, 1,31, 0,17,18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,27, 1, 1},
{1, 1,31, 0,19,20,17,18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 0,27, 1, 1},
{1, 1,31, 0, 0, 0,19,20, 0,17,18, 0, 0, 0, 6,11, 7, 0, 5, 8, 0,27, 1, 1},
{1, 1,31, 0,17,18, 0, 0, 0,19,20, 0, 0, 0,10, 1,12, 0, 0, 0, 0,27, 1, 1},
{1, 1,31, 0,19,20, 0,17,18, 0,17,18, 0, 0, 5, 9, 8, 0, 0, 0, 0,27, 1, 1},
{1, 1,31, 0, 0, 0, 0,19,20, 0,19,20, 0, 0, 0, 0, 0, 0, 0, 0, 0,27, 1, 1},
{1, 1,30,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,28, 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}};
Image img = null;
try
{
img = Image.createImage("/land.png");
}
catch (IOException e)
{
e.printStackTrace();
}
landLayer = new TiledLayer(map[0].length, map.length, img, 32, 32);
for (int i = 0; i < map.length; i++)
{
for (int j = 0; j < map[0].length; j++)
{
landLayer.setCell(j, i, map[i][j]);
}
}
}
//创建海水图层
private void createWaterLayer()
{
int[][] map={ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0,-1, 1,-1, 1, 1,-1,-2, 1,-1, 1, 1,-1, 1, 1,-1, 1, 1,-1, 1,-2, 0, 0},
{0, 0, 1, 1,-1, 1,-1, 1, 1,-1, 1, 1,-2, 1,-1, 1, 1,-2, 1, 1,-1, 1, 0, 0},
{0, 0,-2,-1, 1,-1, 1,-2, 1, 1,-2, 1, 1,-1, 1,-2, 1, 1,-2, 1, 1,-1, 0, 0},
{0, 0,-1, 1,-1, 1,-1, 1, 1,-1, 1, 1,-1, 1,-1, 1,-1,-1, 1, 1,-1, 1, 0, 0},
{0, 0, 1,-1, 1,-1, 1, 1,-1, 1, 1,-1, 1,-2, 1,-1, 1, 1,-1, 1, 1, 1, 0, 0},
{0, 0,-1, 1,-1, 1, 1,-1, 1, 1,-1, 1, 1,-1, 1, 1,-1, 1, 1,-1, 1,-1, 0, 0},
{0, 0, 1,-1,-2, 1, 1, 1,-1, 1, 1,-2,-1, 1, 1,-2, 1, 1,-2, 1,-1,-2, 0, 0},
{0, 0,-2, 1, 1, 1,-1,-2, 1,-1, 1,-1, 1, 1,-1, 1,-1, 1,-1, 1, 1, 1, 0, 0},
{0, 0, 1, 1, 1,-1, 1, 1,-1, 1, 1, 1,-2,-1, 1, 1, 1,-1, 1,-1, 1,-1, 0, 0},
{0, 0, 1,-1,-2, 1,-1,-2, 1,-2,-1, 1,-1, 1,-1,-1,-1, 1,-1, 1,-1, 1, 0, 0},
{0, 0,-2, 1, 1, 1, 1, 1, 1, 1,-1,-1, 1,-1, 1, 1, 1,-2, 1, 1,-2,-1, 0, 0},
{0, 0,-1, 1,-1,-1, 1,-1,-2,-1, 1, 1,-2, 1,-1, 1,-1, 1, 1,-1, 1, 1, 0, 0},
{0, 0, 1,-2, 1, 1,-1, 1, 1, 1,-1,-1, 1,-1, 1, 1, 1, 1,-1, 1, 1,-1, 0, 0},
{0, 0,-1, 1, 1,-2, 1,-2,-1, 1,-1, 1,-1, 1, 1,-1,-2, 1,-1, 1,-2, 1, 0, 0},
{0, 0,-2, 1,-1, 1,-1, 1, 1,-1, 1,-1, 1,-2,-1, 1, 1,-1, 1,-1, 1, 1, 0, 0},
{0, 0, 1, 1,-1, 1, 1,-1, 1, 1,-2, 1,-1, 1, 1, 1,-1, 1,-1, 1,-1,-1, 0, 0},
{0, 0, 1,-1, 1,-2, 1,-2,-1, 1, 1,-1, 1,-1, 1,-1, 1,-1,-2,-1, 1, 1, 0, 0},
{0, 0,-1, 1,-1, 1, 1,-1, 1,-2,-1, 1,-2,-1,-2, 1,-1,-2, 1,-1,-2, 1, 0, 0},
{0, 0, 1,-1, 1,-1, 1,-1, 1,-1, 1, 1,-1, 1,-1, 1,-1, 1,-1, 1, 1,-1, 0, 0},
{0, 0,-2,-1, 1, 1,-2, 1,-1, 1,-1,-2, 1,-2, 1,-1,-2, 1, 1,-2,-1, 1, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
Image img = null;
try
{
img = Image.createImage("/water.png");
}
catch (IOException e)
{
e.printStackTrace();
}
waterLayer = new TiledLayer(map[0].length, map.length, img, 32, 32);
waterLayer.createAnimatedTile(1);
waterLayer.createAnimatedTile(3);
for (int i = 0; i < map.length; i++)
{
for (int j = 0; j < map[0].length; j++)
{
waterLayer.setCell(j, i, map[i][j]);
}
}
}
//创建精灵
private void createSprite()
{
try
{
//创建玩家精灵
playerSprite = new CorsairSprite(Image.createImage("/PlayerShip.png"), 43, 45, 3, landLayer);
//创建敌船精灵
enemyShipSprite = new ChaseSprite(Image.createImage("/EnemyShip.png"), 86, 70, 1, landLayer);
//创建海盗和木桶精灵
for (int i = 0; i < 2; i++)
{
pirateSprite[i] = new DriftSprite(Image.createImage("/Pirate.png"), 29, 29, 2, landLayer);
barrelSprite[i] = new DriftSprite(Image.createImage("/Barrel.png"), 24, 22, 1, landLayer);
}
//创建水雷和章鱼精灵
for (int i = 0; i < 5; i++)
{
mineSprite[i] = new DriftSprite(Image.createImage("/Mine.png"),27, 23, 1, landLayer);
squidSprite[i] = new DriftSprite(Image.createImage("/Squid.png"), 24, 35, 3, landLayer);
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
private void newGame()
{
// 初始化游戏相关参数
gameOver = false;
energy = 45;
piratesSaved = 0;
// 设置游戏主角
playerSprite.setVisible(true);
playerSprite.RandomPosition();
//设置视窗位置
xView = playerSprite.getX()-((this.getWidth() - playerSprite.getWidth()) / 2);
yView = playerSprite.getY()-((this.getHeight() - playerSprite.getHeight()) / 2);
layers.setViewWindow(xView, yView, getWidth(),getHeight()-infoBar.getHeight());
// 播放背景音乐
try
{
musicPlayer.start();
}
catch (MediaException e)
{
e.printStackTrace();
}
}
public void run()
{
bg = getGraphics();
while (true)
{
tick();
input();
render();
try
{
Thread.sleep(30);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
private void tick()
{
for (int i = 0; i < 2; i++)
{
// 使精灵漂流
pirateSprite[i].drift();
barrelSprite[i].drift();
// 检测玩家与海盗精灵碰撞
if (playerSprite.collidesWith(pirateSprite[i], true))
{
try
{
rescuePlayer.start();
}
catch (MediaException e)
{
e.printStackTrace();
}
piratesSaved++;
pirateSprite[i].RandomPosition();
}
//测玩家与木桶精灵碰撞
if (playerSprite.collidesWith(barrelSprite[i], true))
{
// 增长玩家生命
energy = Math.min(energy + 5, 45);
barrelSprite[i].RandomPosition();
}
}
for (int i = 0; i < 5; i++)
{
// 使精漂流
mineSprite[i].drift();
squidSprite[i].drift();
// 检测玩家与水雷精灵碰撞
if (playerSprite.collidesWith(mineSprite[i], true))
{
energy -= 10;
mineSprite[i].RandomPosition();
}
// 检测玩家与章鱼精灵碰撞
if (playerSprite.collidesWith(squidSprite[i], true))
{
energy -= 5;
}
}
// 敌人战舰追击玩家
enemyShipSprite.chase(playerSprite);
// 检测敌船与玩家碰撞
if (playerSprite.collidesWith(enemyShipSprite, true))
{
try
{
minePlayer.start();
}
catch (MediaException me)
{
}
energy -= 10;
}
// 检测游戏结束
if (energy <= 0)
{
try
{
musicPlayer.stop();
gameoverPlayer.start();
}
catch (MediaException me)
{
}
//隐藏玩家精灵
playerSprite.setVisible(false);
gameOver = true;
}
// 设置海水动画效果
if (++waterTile[0] > 3)
waterTile[0] = 1;
waterLayer.setAnimatedTile(-1, waterTile[0]);
if (--waterTile[1] < 1)
waterTile[1] = 3;
waterLayer.setAnimatedTile(-2, waterTile[1]);
}
private void input()
{
int keyState = getKeyStates();
if ((keyState & LEFT_PRESSED) != 0)
{
playerSprite.moveDirection(MainSprite.LEFT);
xView += playerSprite.getDx();
yView += playerSprite.getDy();
}
else if ((keyState & RIGHT_PRESSED) != 0)
{
playerSprite.moveDirection(MainSprite.RIGHT);
xView += playerSprite.getDx();
yView += playerSprite.getDy();
}
else if ((keyState & UP_PRESSED) != 0)
{
playerSprite.moveDirection(MainSprite.UP);
xView += playerSprite.getDx();
yView += playerSprite.getDy();
}
else if ((keyState & DOWN_PRESSED) != 0)
{
playerSprite.moveDirection(MainSprite.DOWN);
xView += playerSprite.getDx();
yView += playerSprite.getDy();
}
if (!playerSprite.isCollided())
{
layers.setViewWindow(xView, yView, getWidth(), getHeight() - infoBar.getHeight());
}
else
{
xView -= playerSprite.getDx();
yView -= playerSprite.getDy();
}
// 判断是否重新开始游戏
if (gameOver)
{
if ((keyState & FIRE_PRESSED) != 0)
{
newGame();
}
}
}
private void render()
{
// 绘制信息条
bg.drawImage(infoBar, 0, 0, Graphics.TOP | Graphics.LEFT);
bg.setColor(0, 0, 0);
bg.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN,Font.SIZE_MEDIUM));
bg.drawString("生命:", 2, 1, Graphics.TOP | Graphics.LEFT);
bg.drawString("拯救海盗数量: " + piratesSaved, 88, 1, Graphics.TOP| Graphics.LEFT);
bg.setColor(32, 32, 255);
bg.fillRect(40, 3, energy, 12);
// 绘制图层
layers.paint(bg, 0, infoBar.getHeight());
// 绘制游戏结束画面
if (gameOver)
{
bg.setColor(255, 255, 255); // white
bg.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD,Font.SIZE_LARGE));
bg.drawString("游戏结束", 110, 70, Graphics.TOP | Graphics.HCENTER);
bg.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD,Font.SIZE_MEDIUM));
bg.drawString("你拯救了 " + piratesSaved + " 个海盗.", 110, 100,Graphics.TOP | Graphics.HCENTER);
}
flushGraphics();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -