📄 stage.java
字号:
package com.thinkenjoy.feitian;
import java.io.InputStream;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import com.thinkenjoy.control.Control;
import com.thinkenjoy.control.ThreadCanvas;
import com.thinkenjoy.tools.ImageSet;
import com.thinkenjoy.tools.Tools;
import com.thinkenjoy.feitian.screen.PlayScreen;
/**
* 关于地图数据以及背景地图的处理
* @author Administrator
*
*/
public class Stage {
private static final byte LEVEL_SCALE = 10;
public static final int MAX_STAGE = 4;
int tilesWide;
int tilesHigh;
int highSeperate;
byte[][] tileMap;
int scale;
static Image stageBackImg = null;
private int curStage;
private int timeCounter;
/**
* 背景星空的横纵坐标
*/
private int starLocX[] = { 5, 59, 32, 155, 80, 169, 54, 37, 83, 100, 131, 9 };
private int starLocY[] = { 106, 120, 40, 19, 22, 125, 155, 66, 82, 164, 23,
94 };
/**
* 敌人对应的初试位置种类
*/
private int[] starEnemy_type = {0, 1, 1, 2, 3, 1, 2, 1, 1, 1, 1,
2, 3, 3, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
/**
* 背景移动速度,图片类型
*/
private int backSpeed, backLeyerOffset;
/**
* 当打死BOSS后,将不会有新的敌人产生
*/
private boolean initialNewEnemy;
/**
* 是否能切换关卡
*/
private boolean changeStage;
protected int drawOffsetX;
protected int drawOffsetY;
public Enemy boss;
public MovingObjectPool treasurePool;
private PlayScreen playScreen;
private MovingObjectPool enemyPool;
public Stage(int curStage, String url, MovingObjectPool enemyPool,
Enemy boss, MovingObjectPool treasurePool) {
timeCounter = 0;
initialNewEnemy = true;
changeStage = false;
drawOffsetX = 0;
drawOffsetY = 0;
this.curStage = curStage;
this.enemyPool = enemyPool;
this.boss = boss;
this.treasurePool = treasurePool;
}
public void initial(int stageNum) {
// Image tempBossImage;
curStage = stageNum;
timeCounter = 0;
initialNewEnemy = true;
changeStage = false;
scale = 0;//200
backLeyerOffset = 0;
switch (stageNum) {
// TODO:载入关卡资源
case 1: // '\001'
default:
// backLeyerOffset = 0;
backSpeed = 1;
loadLevel("1");
// scale = 0;
stageBackImg = Tools.getImage("images/stage/stageBack1");
// Enemy.bossImageSet = null;
// Enemy.bossImageSet = new ImageSet(1);
// tempBossImage = Tools.getImage("images/stage/boss1");
// Enemy.bossImageSet.addState(ImageSet.extractFrames(tempBossImage,
// 0, 0, 2, 1, 84, 75), 5000);
break;
case 2:
// backLeyerOffset = 0;
backSpeed = 1;
loadLevel("2");
// scale = 0;
stageBackImg = Tools.getImage("images/stage/stageBack2");
break;
case 3:
// backLeyerOffset = 0;
backSpeed = 1;
loadLevel("3");
// scale = 0;
stageBackImg = Tools.getImage("images/stage/stageBack3");
break;
case 4:
// backLeyerOffset = 0;
backSpeed = 1;
loadLevel("4");
// scale = 0;
stageBackImg = Tools.getImage("images/stage/stageBack4");
break;
}
}
public boolean initialEnemy(int type, int locX, int locY) {
if (!initialNewEnemy)
return false;
Enemy enemy = (Enemy) enemyPool.getNextFree();
enemy.initial(type-1, locX, locY);
enemy.cycle(locX, locY);
return true;
}
public boolean initialBoss(int type, int locX, int locY) {
if (!initialNewEnemy)
return false;
boss.initial(type, locX, locY);
return true;
}
public void reset() {
Control.setStage(curStage);
timeCounter = 0;
initialNewEnemy = true;
changeStage = false;
}
public boolean canChangeStage() {
return changeStage;
}
public void cycle() {
//#if NOK_7210 || NOK_7260 || NOK_6101
//# if (--backSpeed <= -128) {
//#else
//#if NOK_7370 || MOT_E2
//# if (--backSpeed <= -240) {
//#else
//#if NOK_6230i
//# if (--backSpeed <= -208) {
//#else
if (--backSpeed <= -176) {
//#endif
//#endif
//#endif
backSpeed = 0;
}
if (playScreen == null) {
playScreen = PlayScreen.getInstance();
}
if (!initialNewEnemy && changeStage)
return;
timeCounter++;
switch (curStage) {
default:
if (timeCounter >= LEVEL_SCALE && timeCounter % LEVEL_SCALE == 0) {
if (scale >= tilesWide) {
// #ifdef debug
// #System.out.println("关卡数据越界");
// #endif
} else {
for (int i = 0; i < tilesHigh; i++) {
if (getTileIndex(i, scale) != 0) {
// TODO:根据关卡数据进行处理(根据敌人ID确定敌人的产生位置)
switch (starEnemy_type[getTileIndex(i, scale)]) {
case 1: // 从右边飞出
if (getTileIndex(i, scale) <= 30) {
if(i!=0)
{
//#if NOK_7260 || NOK_7210
//# initialEnemy(getTileIndex(i, scale), 130,12 * i);
//#else
//#if NOK_7370 || MOT_E2
//# initialEnemy(getTileIndex(i, scale), 240,40 * i);
//#else
//#if NOK_6230i
//# initialEnemy(getTileIndex(i, scale), 210,26 * i);
//#else
//#if NOK_6101
//# initialEnemy(getTileIndex(i, scale), 130,20 * i);
//#else
initialEnemy(getTileIndex(i, scale), 180,26 * i);
//#endif
//#endif
//#endif
//#endif
}else
{
initialEnemy(getTileIndex(i, scale), 180,50);
}
}
break;
case 2: // 从上方随机位置飞出
//#if NOK_7260 || NOK_7210 || NOK_6101
//# initialEnemy(getTileIndex(i, scale), Tools.getRand(50, 115), -10);
//#else
//#if NOK_7370 || MOT_E2
//# initialEnemy(getTileIndex(i, scale), Tools.getRand(50, 300), -10);
//#else
//#if NOK_6230i
//# initialEnemy(getTileIndex(i, scale), Tools.getRand(50, 200), -10);
//#else
initialEnemy(getTileIndex(i, scale), Tools.getRand(50, 150), -10);
//#endif
//#endif
//#endif
break;
case 3: // 从下方随机位置飞出
//#if NOK_7260 || NOK_7210
//# initialEnemy(getTileIndex(i, scale), Tools.getRand(50, 115), 128);
//#else
//#if NOK_7370 || MOT_E2
//# initialEnemy(getTileIndex(i, scale), Tools.getRand(50, 300), 320);
//#else
//#if NOK_6230i
//# initialEnemy(getTileIndex(i, scale), Tools.getRand(50, 200), 208);
//#else
//#if NOK_6101
//# initialEnemy(getTileIndex(i, scale), Tools.getRand(50, 115), 160);
//#else
initialEnemy(getTileIndex(i, scale), Tools.getRand(50, 150), 208);
//#endif
//#endif
//#endif
//#endif
break;
}
}
}
}
scale++;
}
break;
}
}
public void render(Graphics g) {
// TODO:绘制关卡背景
//#if NOK_7370 || MOT_E2
//# g.setClip(0, 0, 240, 320);
//# g.drawImage(stageBackImg, backSpeed, 0, 0);
//# g.setClip(0, 0, 240, 320);
//#else
//#if NOK_6230i
//# g.setClip(0, 0, 208, 208);
//# g.drawImage(stageBackImg, backSpeed, 0, 0);
//# g.setClip(0, 0, 208, 208);
//#else
g.setClip(0, 0, 176, 208);
g.drawImage(stageBackImg, backSpeed, 0, 0);
g.setClip(0, 0, 176, 208);
//#endif
//#endif
//#if NOK_7260 || NOK_7210 || NOK_6101
//# g.drawImage(stageBackImg, backSpeed + 129, 0, 0);
//#else
//#if NOK_7370 || MOT_E2
//# g.drawImage(stageBackImg, backSpeed + 241, 0, 0);
//#else
//#if NOK_6230i
//# g.drawImage(stageBackImg, backSpeed + 209, 0, 0);
//#else
g.drawImage(stageBackImg, backSpeed + 177, 0, 0);
//#endif
//#endif
//#endif
drawStar(g);
//#if MOT_E2 || NOK_7370
//# g.setClip(0, 0, 240, 320);
//#else
//#if NOK_6230i
//# g.setClip(0, 0, 208, 208);
//#else
g.setClip(0, 0, 176, 208);
//#endif
//#endif
}
/**
* 绘制背景上不断飞过的星星
*
* @param g
*/
public void drawStar(Graphics g) {
g.setColor(0xffffff);
for (int i = 0; i < starLocX.length; i++) {
g.drawLine(starLocX[i], starLocY[i], starLocX[i] + 1, starLocY[i]);
if (i < 4)
starLocX[i]--;
else if (i < 8)
starLocX[i] -= 3;
else
starLocX[i] -= 5;
if (starLocX[i] < 0)
starLocX[i] = ThreadCanvas.SCREEN_WIDTH;
}
}
/**
* 载入关卡数据
*
* @param 关卡等级
*/
public void loadLevel(String levelName) {
try {
InputStream is = null;
is = this.getClass().getResourceAsStream("/stage" + levelName + ".dat");
// 先载入关卡的长宽
tilesWide = is.read() & 0xff;
tilesHigh = is.read() & 0xff;
highSeperate = ThreadCanvas.SCREEN_HEIGHT / tilesHigh;
tileMap = new byte[tilesHigh][tilesWide];
// 载入关卡数据,范围为0-255
for (int ty = 0; ty < tilesHigh; ty++) {
for (int tx = 0; tx < tilesWide; tx++) {
tileMap[ty][tx] = (byte) is.read();
}
}
} catch (Exception e) {
System.out.println("载入关卡数据时出错 : " + e);
e.printStackTrace();
}
}
/**
* 得到地图格子的索引值,0-255
*
* @param tileX
* @param tileY
* @return
*/
private int getTileIndex(int tileX, int tileY) {
int tileIndex = tileMap[tileX][tileY];
// if (tileIndex < 0) {
// tileIndex &= 0xff;
// }
return tileIndex;
}
public void reCycle() {
stageBackImg = null;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -