/*
* 游戏执行中的暂停和重新开始功能,暂停时既要暂停计时,也要暂停计步,
* 开始后两个计数器同时开启,并不要影响暂停之前的状态,除了应用程序命令按键和退出按键外,其余键都不起作用
* 如各个图片精灵的位置,各个图片精灵索引的数组,及游戏的选项设置
*/
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;
import javax.microedition.rms.*;
import java.util.*;
import java.lang.Math;
import java.io.*;
import javax.microedition.media.*;
public class StartCanvas extends GameCanvas implements Runnable,
CommandListener{
private Pintu midlet;
private Image imgGame, imgDigit, imgClock, imgStep, imgWin;
public Command pauseCmd, restartCmd, backCmd;
private int rowCol;
private final int BLOCKWH, STARTX, STARTY;
private int outLineWidth, outLineHeight;
protected boolean stoped = false, successed = false;
private int delay = 200;// 定义线程休眠时间间隔
protected final int WIDTH, HEIGHT;
private final int LEN = 6;// 时间计数器和步骤计数器的位数,预设6位,太长无意义
public long startTime, PlayTime;// 游戏开始时间,结束时间,总共用时;
public int stepNum = 0;// 行走步数
private int index, upIndex, downIndex, leftIndex, rightIndex;
private Sprite upSprite, downSprite, leftSprite, rightSprite;
public Sprite sClock, sStep, sImagePreview, sWin;// 计时,计步标识的图片精灵
private Sprite[] spriteArray, spriteTime, spriteStep;
private int[] sequenceArray;
protected LayerManager startLayer;
private Thread t;
public StartCanvas(Pintu m) {
super(true);
midlet = m;
try {
imgGame = Image.createImage(midlet.imgPath+ midlet.nameArray[midlet.selectedPicIndex]);
imgDigit = Image.createImage(midlet.imgPath + "digit.png");
imgClock = Image.createImage(midlet.imgPath + "clock.png");
imgStep = Image.createImage(midlet.imgPath + "step.png");
} catch (IOException e) {
e.printStackTrace();
}
pauseCmd = new Command("暂停", Command.SCREEN, 1);
restartCmd = new Command("开始", Command.SCREEN, 1);
backCmd = new Command("返回", Command.BACK, 1);
this.addCommand(pauseCmd);
this.addCommand(backCmd);
this.setCommandListener(this);
WIDTH = getWidth();
HEIGHT = getHeight();
rowCol = midlet.selectedLevelIndex;// 级别数表示每行每列的块数
index = rowCol * (rowCol + 1) - 1;
outLineWidth = Pintu.G_WIDTH;// 外边框的高等于WIDTHHEIGHT
BLOCKWH = outLineWidth / rowCol;
outLineHeight = Pintu.G_HEIGHT + BLOCKWH;// 外边框的高等于WIDTHHEIGHT和一个块的高度
spriteArray = new Sprite[rowCol * rowCol];// 动态创建精灵数组
STARTX = (WIDTH - outLineWidth) / 2;
STARTY = (HEIGHT - outLineHeight) / 2;
// //////////////////////////////////////////////////////////////
sequenceArray = new int[rowCol * (rowCol + 1)];
for (int i = 0; i < rowCol * rowCol; i++) {
sequenceArray[i] = i;// 将整形数组与精灵数组绑定
}
for (int i = rowCol * rowCol; i < rowCol * (rowCol + 1) - 1; i++) {
sequenceArray[i] = -2;// 最后一行的前(rowCol-1)块作为不动块
}
sequenceArray[rowCol * (rowCol + 1) - 1] = -1;// 最后一块做为图片移动的缓冲块
initGameInfo();
}
public void start() {
extractImg(imgGame, BLOCKWH, BLOCKWH);
randomSequence();
//testSequence();
setPosition();
startTime = System.currentTimeMillis();
//如果游戏开始时,玩家昵称没有设置,则随机生成一个player加一个随机数的昵称
if(midlet.playerNickName == null){
Random rand = new Random();
midlet.playerNickName = "player" + rand.nextInt(100) ;
}
t = new Thread(this);
t.start();
}
// 定期更新时间,时间每隔1秒更新一次
public void updatePlayTime() {
if (!stoped) {
PlayTime = (System.currentTimeMillis() - startTime) / 1000;
String map = Long.toString(PlayTime);
int mapLen = map.length();
for (int i = 0; i < LEN; i++) {
if (i < LEN - mapLen)
spriteTime[i].setFrame(0);
else {
int t = Integer.parseInt((String.valueOf(map.charAt(i - (LEN - mapLen)))));
spriteTime[i].setFrame(t);
}
}
}
}
// 步数每走一步更新一次
public void updateStepNum() {
if (!stoped) {
String map = Integer.toString(stepNum);
int mapLen = map.length();
for (int i = 0; i < LEN; i++) {
if (i < LEN - mapLen)
spriteStep[i].setFrame(0);
else {
int t = Integer.parseInt((String.valueOf(map.charAt(i - (LEN - mapLen)))));
spriteStep[i].setFrame(t);
}
}
}
}
// 初始化游戏控制及显示信息
public void initGameInfo() {
startLayer = new LayerManager();
spriteTime = new Sprite[LEN];
spriteStep = new Sprite[LEN];
for (int i = 0; i < LEN; i++) {
spriteTime[i] = new Sprite(imgDigit, 9, 12);
spriteTime[i].setPosition(22 + i * 8, 6);
startLayer.append(spriteTime[i]);
spriteStep[i] = new Sprite(imgDigit, 9, 12);
spriteStep[i].setPosition(WIDTH - 64 + i * 8, 6);
startLayer.append(spriteStep[i]);
}
sImagePreview = new Sprite(resizeImage(imgGame, BLOCKWH - 4,
BLOCKWH - 4));
sImagePreview.setPosition(STARTX + 2, STARTY + rowCol * BLOCKWH + 3);
startLayer.append(sImagePreview);
sClock = new Sprite(imgClock);
sClock.setPosition(5, 6);
startLayer.append(sClock);
sStep = new Sprite(imgStep);
sStep.setPosition(WIDTH - 80, 6);
startLayer.append(sStep);
}
// 绘制背景网格
public void drawGrids(Graphics g) {
g.setColor(0, 0, 255);
g.setStrokeStyle(Graphics.SOLID);
for (int i = STARTX; i < STARTX + outLineWidth - 3; i += BLOCKWH)
g.drawLine(i, STARTY, i, STARTY + outLineHeight - BLOCKWH);
for (int j = STARTY; j < STARTY + outLineWidth - 3; j += BLOCKWH)
g.drawLine(STARTX, j, STARTX + outLineWidth, j);
}
// 将预览图片压缩到合适大小,更多图片缩放函数参考:http://ajava.org/course/j2me/8503.html
public Image resizeImage(Image src, int desW, int desH) {
Image desImg = null;
int srcW = src.getWidth(); // 原始图像宽
int srcH = src.getHeight(); // 原始图像高
int[] srcBuf = new int[srcW * srcH]; // 原始图片像素信息缓存
src.getRGB(srcBuf, 0, srcW, 0, 0, srcW, srcH);
// 计算插值表
int[] tabY = new int[desH];
int[] tabX = new int[desW];
int sb = 0;
int db = 0;
int tems = 0;
int temd = 0;
int distance = srcH > desH ? srcH : desH;
for (int i = 0; i <= distance; i++) { /* 垂直方向 */
tabY[db] = sb;
tems += srcH;
temd += desH;
if (tems > distance) {
tems -= distance;
sb++;
}
if (temd > distance) {
temd -= distance;
db++;
}
}
sb = 0;
db = 0;
tems = 0;
temd = 0;
distance = srcW > desW ? srcW : desW;
for (int i = 0; i <= distance; i++) { /* 水平方向 */
tabX[db] = (short) sb;
tems += srcW;
temd += desW;
if (tems > distance) {
tems -= distance;
sb++;
}
if (temd > distance) {
temd -= distance;
db++;
}
}
// 生成放大缩小后图形像素buf
int[] desBuf = new int[desW * desH];
int dx = 0;
int dy = 0;
int sy = 0;
int oldy = -1;
for (int i = 0; i < desH; i++) {
if (oldy == tabY[i]) {
System.arraycopy(desBuf, dy - desW, desBuf, dy, desW);
} else {
dx = 0;
for (int j = 0; j < desW; j++) {
desBuf[dy + dx] = srcBuf[sy + tabX[j]];
dx++;
}
sy += (tabY[i] - oldy) * srcW;
}
oldy = tabY[i];
dy += desW;
}
// 生成图片
desImg = Image.createRGBImage(desBuf, desW, desH, false);
return desImg;
}
// 保存完成任务的玩家的游戏信息--所用时间和步数,将其加入用久存储RMS,
// 并对前10名进行排序,用时最少,且步数最少的排最前
public void savePlayerInfo() {
try {
RecordStore rs = RecordStore.openRecordStore("Rank", true);
if(rs.getNumRecords()>=9){
rs.closeRecordStore();
return;
}
else{
Player player = new Player(midlet.playerNickName, PlayTime, stepNum);
byte[] result = player.toBytes();
rs.addRecord(result, 0, result.length);
rs.closeRecordStore();
}
} catch (RecordStoreFullException rsfe) {
} catch (Recor
- 1
- 2
前往页