?? 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;
/**
* 關于地圖數(shù)據(jù)以及背景地圖的處理
* @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后,將不會有新的敵人產(chǎn)生
*/
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("關卡數(shù)據(jù)越界");
// #endif
} else {
for (int i = 0; i < tilesHigh; i++) {
if (getTileIndex(i, scale) != 0) {
// TODO:根據(jù)關卡數(shù)據(jù)進行處理(根據(jù)敵人ID確定敵人的產(chǎn)生位置)
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);
//#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;
}
}
/**
* 載入關卡數(shù)據(jù)
*
* @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];
// 載入關卡數(shù)據(jù),范圍為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("載入關卡數(shù)據(jù)時出錯 : " + 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 + -