📄 gamecenter.java
字号:
import java.io.IOException;
import java.io.InputStream;
import java.util.Random;
import java.util.TimerTask;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Font;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.lcdui.game.LayerManager;
import javax.microedition.lcdui.game.Sprite;
import javax.microedition.lcdui.game.TiledLayer;
import javax.microedition.media.Manager;
import javax.microedition.media.MediaException;
import javax.microedition.media.Player;
public class GameCenter extends GameCanvas implements Runnable, CommandListener {
private GameMain gameMain;
private Random rand;
private boolean isRunPlayGame;
private long currentGateTimes, startTimes;
private int mapWidth;// 保存地图的列数
private int mapHeight;// 保存地图的行数
private int screenW; // 手机屏幕宽度
private int screenH; // 手机屏幕高度
private DongSprite dongSprite; // 创建精灵对象
private Bomb[] bomb = new Bomb[30];// 创建炸弹精灵
private LayerManager layerManager; // 创建层管理器对象
private TiledLayer bombLayer;// 显示炸弹层
private Image img = null;
private int dDirection;// 保存精灵行走的方向
private int dDistance;// 保存精灵行走的距离
private int tollGateNum;// 关卡数
private int totalTollGate;// 总关卡数
private TiledLayer bgLayer; // 背景地图层
public static TiledLayer zaLayer;// 障碍层
private Sprite mb;// 目标精灵(下一关的触发器)
private int xView, yView;// 保存可视窗口的开始坐标
private Command usebomb1;// 创建使用炸弹的按钮
private Command returnGameMenu;// 创建返回游戏主菜单的按钮
private Command cancelMenu;// 清除菜单
private int[] down = { 0, 1, 2 };
private int[] left = { 6, 7, 8 };
private int[] right = { 3, 4, 5 };
private int[] up = { 9, 10, 11 };
private Player gameBgMusicPlayer;// 游戏背景音乐
private Player jBombMusicPlayer;// 捡炸弹的声音
private Player uBombMusicPlayer;// 使用炸弹的声音
private Score score;
private Settings settings;
private static MyTextBox myTextBox;
private byte bgMap[][] = { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 3, 3, 3, 3, 2, 2, 2, 0, 0, 0 },
{ 0, 2, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0 },
{ 0, 0, 2, 2, 2, 0, 0, 2, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0 },
{ 0, 0, 2, 2, 2, 1, 1, 0, 2, 2, 2, 0 },
{ 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 2, 2 },
{ 0, 0, 2, 0, 2, 2, 2, 2, 0, 0, 0, 2 },
{ 0, 0, 2, 0, 2, 2, 0, 2, 0, 3, 0, 1 },
{ 0, 0, 2, 0, 2, 0, 0, 3, 3, 3, 0, 2 },
{ 2, 0, 2, 0, 2, 0, 2, 2, 2, 0, 2, 2 },
{ 2, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0 },
{ 0, 3, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0 },
{ 0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 2, 2, 4, 0, 1, 1, 0, 2, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2 },
{ 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 2, 0, 0, 3, 3, 0, 0 },
{ 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3 },
{ 0, 0, 3, 3, 3, 0, 3, 3, 3, 3, 0, 3 },
{ 0, 0, 0, 0, 3, 3, 3, 0, 0, 0, 0, 0 } };
protected GameCenter(GameMain game, Score score, Settings settings) {
// 程序初始化
super(true);
gameMain = game;
this.score = score;
this.settings = settings;
this.setFullScreenMode(true);
rand = new Random();
layerManager = new LayerManager();
dDirection = 64;
dDistance = 2;
this.mapHeight = 16;
this.mapWidth = 8;
screenW = this.getWidth();
screenH = this.getHeight();
totalTollGate = 8;// 总关卡数
}
public void newGame(int tollGateNum1) {
// 音乐对象初始化
try {
this.settings.loadSettings();
} catch (Exception e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
gameMain.gameSound = this.settings.sound;
isRunPlayGame = true; // 启动RUN方法
InputStream is = getClass().getResourceAsStream("gamemusic.mid");
try {
gameBgMusicPlayer = Manager.createPlayer(is, "audio/midi");
gameBgMusicPlayer.prefetch();
gameBgMusicPlayer.setLoopCount(-1);
gameBgMusicPlayer.setMediaTime(0);
if (gameMain.gameSound == 1) {
gameBgMusicPlayer.start();
}
} catch (IOException e1) {
e1.printStackTrace();
} catch (MediaException e1) {
e1.printStackTrace();
}
is = getClass().getResourceAsStream("Mine.wav");
try {
jBombMusicPlayer = Manager.createPlayer(is, "audio/X-wav");
jBombMusicPlayer.prefetch();
} catch (IOException e1) {
e1.printStackTrace();
} catch (MediaException e1) {
e1.printStackTrace();
}
is = getClass().getResourceAsStream("BOMB3.WAV");
try {
uBombMusicPlayer = Manager.createPlayer(is, "audio/X-wav");
uBombMusicPlayer.prefetch();
} catch (IOException e1) {
e1.printStackTrace();
} catch (MediaException e1) {
e1.printStackTrace();
}
usebomb1 = new Command("使用炸弹", Command.OK, 0);
cancelMenu = new Command("清除菜单", Command.CANCEL, 0);
returnGameMenu = new Command("返回主菜单", Command.EXIT, 0);
this.addCommand(usebomb1);
this.addCommand(returnGameMenu);
this.addCommand(cancelMenu);
this.setCommandListener(this);
if (layerManager.getSize() > 2) {
layerManager.remove(dongSprite);
layerManager.remove(dongSprite.bomb);
layerManager.remove(mb);
for (int i = 0; i < 30; i++) {
layerManager.remove(bomb[i]);
}
layerManager.remove(zaLayer);
layerManager.remove(bgLayer);
}
this.tollGateNum = tollGateNum1;
dongSprite = new DongSprite(GameCenter.createImage("/dongsprite.png"),
38, 70);
if (this.tollGateNum == 1) {
dongSprite.bombNum = this.tollGateNum;
}
layerManager.append(dongSprite);// 加载精灵
layerManager.append(dongSprite.bomb);
mb = new Sprite(GameCenter.createImage("/mb.png"));
layerManager.append(mb);
int tempBomb = 2 * tollGateNum;
img = GameCenter.createImage("/bomb1.png");
for (int i = 0; i < 30; i++) {// 初始化地图上的炸弹
bomb[i] = new Bomb(img, 75, 80);
if (tempBomb > 0) {
layerManager.append(bomb[i]);
tempBomb--;
}
}
loadMap(tollGateNum);// 装载相应关卡地图
placeSprite(dongSprite, zaLayer);
placeMbSprite(dongSprite, mb, zaLayer);
for (int i = 0; i < 2 * tollGateNum; i++) {
placeSprite(bomb[i], zaLayer);
}
dongSprite.screenW = bgLayer.getWidth();
dongSprite.screenH = bgLayer.getHeight();
dongSprite.meetSprite.setPosition(dongSprite.getX()
+ (dongSprite.getWidth() - dongSprite.meetSprite.getWidth())
/ 2, dongSprite.getY()
+ (dongSprite.getHeight() - dongSprite.meetSprite.getHeight()));
xView = dongSprite.getX() - ((screenW - dongSprite.getWidth()) / 2);
yView = dongSprite.getY() - ((screenH - dongSprite.getHeight()) / 2);
if (xView < 0) {
xView = 0;
} else if (bgLayer.getWidth() - xView < screenW) {
xView = bgLayer.getWidth() - screenW;
}
if (yView < 0) {
yView = 0;
} else if (bgLayer.getHeight() - yView < screenH) {
yView = bgLayer.getHeight() - screenH;
}
layerManager.setViewWindow(xView, yView, screenW, screenH - 30);
Thread t = new Thread(this);
t.start();
}
private void placeSprite(Sprite sprite, TiledLayer barrier) {
// 把精灵放在一个随机的位置上,并且保证不与给定的层相碰撞
int x, y;
x = Math.abs(rand.nextInt() % barrier.getWidth()) - sprite.getWidth();
y = Math.abs(rand.nextInt() % barrier.getHeight()) - sprite.getHeight();
sprite.setPosition(x, y);
while (sprite.collidesWith(barrier, true) || x <= 0 || x > this.screenW
|| y <= 0 || y > this.screenH) {
x = Math.abs(rand.nextInt() % barrier.getWidth())
- sprite.getWidth();
y = Math.abs(rand.nextInt() % barrier.getHeight())
- sprite.getHeight();
sprite.setPosition(x, y);
}
}
private void placeMbSprite(Sprite dongSprite, Sprite sprite,
TiledLayer barrier) {
// 把精灵放在一个随机的恰当的位置上,并且保证不与给定的层相碰撞
String tempMap[];
tempMap = new String[108];
int i = 0;
for (int col = 0; col < 8; col++) {
for (int row = 1; row < 16; row++) {// 第一行不放
if ((bgMap[row][col] == 0)
&& (row * 40 - dongSprite.getY() > 100)
&& (col * 60 - dongSprite.getX() > 60)) {
tempMap[i] = Integer.toString(col) + "/"
+ Integer.toString(row);
i++;
}
}
}
int tempi, x, y;
tempi = rand.nextInt(i);
x = Integer.parseInt(tempMap[tempi].substring(0, tempMap[tempi]
.indexOf("/"))) * 60;
y = Integer.parseInt(tempMap[tempi].substring(tempMap[tempi]
.indexOf("/") + 1)) * 40;
sprite.setPosition(x + 3, y + 70); // 保证七仙女全部显示在屏幕上
}
private void nextTallGate(int tollGateNum) {
// 下一关
this.tollGateNum++;
// 得到本关最多的能用的时间
currentGateTimes = (8 - (this.tollGateNum - 2)) * 30 * 1000;
startTimes = System.currentTimeMillis(); // 当前关开始时间
dongSprite.bombNum = this.tollGateNum;
loadNextMap(tollGateNum);// 装载相应关卡地图
placeSprite(dongSprite, zaLayer);
placeMbSprite(dongSprite, mb, zaLayer);
for (int i = 0; i < 2 * tollGateNum; i++) {
placeSprite(bomb[i], zaLayer);
}
dongSprite.screenW = bgLayer.getWidth();
dongSprite.screenH = bgLayer.getHeight();
dongSprite.meetSprite.setPosition(dongSprite.getX()
+ (dongSprite.getWidth() - dongSprite.meetSprite.getWidth())
/ 2, dongSprite.getY()
+ (dongSprite.getHeight() - dongSprite.meetSprite.getHeight()));
xView = dongSprite.getX() - ((screenW - dongSprite.getWidth()) / 2);
yView = dongSprite.getY() - ((screenH - dongSprite.getHeight()) / 2);
if (xView < 0) {
xView = 0;
} else if (bgLayer.getWidth() - xView < screenW) {
xView = bgLayer.getWidth() - screenW;
}
if (yView < 0) {
yView = 0;
} else if (bgLayer.getHeight() - yView < screenH) {
yView = bgLayer.getHeight() - screenH;
}
layerManager.setViewWindow(xView, yView, screenW, screenH - 30);
}
private void nextTallGateMap(int tollGateNum, int width, int height) {
// 产生下一关的地图
// width 格子的列数,height 格子的行数 width*height 等于总格子数
long mapNum = width * height;
int Holdbackpercent = 20 + (tollGateNum - 1) * 5; // 根据关卡数决定有多少个没有障碍物的格子
long HolebackNum = (mapNum / 100) * Holdbackpercent
+ (mapNum / 10 - (mapNum / 100) * 10) * (Holdbackpercent / 10);
for (int col = 0; col < 8; col++) {
for (int row = 0; row < 16; row++) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -