?? scenemodel.java
字號:
//package bushfighting;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.Graphics;
import java.util.Random;
/**
* 這個類用于統一處理游戲場景的行為
* 例如人物的動作等等
*/
public class SceneModel {
private Image[] mBackgroundImage = new Image[3]; //背景的圖片
private Image mPassImage = null; //過關的提示圖片
private Image mPlayerHPImage = null;
private Image mCockHPImage = null;
private Image[] mCabinetImage = new Image[2];//藥箱的圖片
private Image[] mSceneImages = new Image[4];//場景圖片
private Image[] mBulletImages = null;//子彈的圖片
private Image[] mFireBulletImages=null;//火箭圖片
private Image[] mFramesImage = new Image[2];//兩個框的圖片
private Image mBBImg=null;
private Image mBFImg=null;
private Image mNumImage = null;
private int mFramesPosiX = 0;
private int mFramesPosiY = 0;
private int mFramesCount = 0;
private boolean bShowFrames = false;
private Character[] mPawns = null;//其中第一個位置用于記錄敵兵頭目
private Character mPreCock=null;
private Character mCock = null;
private Character mPlayer = null;//場景中的游戲玩家
private Image[] mPlayerImages = null;//主角小愛的圖片
private int[] mPlayerFrames = {3,3,3,3,2,2,2,2,1};
private Image[][] mPawnImages = new Image[3][];//敵兵的圖片
private int[] mPawnFrames = {3,3,3,3,1,1,2,2};
private Image[] mCockImages = null;//頭目的圖片
private int[] mCockFrames = {3,3,3,3,1,1,2,2};
private SceneUnit[] mBullets = null;//場景中的子彈
private SceneUnit[] mEnemyBullets=null;//敵人的子彈
private SceneUnit[] mBBlood=null;
private SceneUnit[] mBFloor=null;
private SceneUnit[] mUpScenes = null;//場景上面一排中的物品,例如樹木,屋子等
private SceneUnit[] mDownScenes = null;//場景中下面一排的物品
private SceneUnit[] mCabinets = new SceneUnit[50];//場景中的藥箱
private int mSceneIndex = 0;//當前的場景號
private int mLevel = 3;//當前的關號
private static final int[] mSceneCounts = {14,16,18,20,22,24};//每一關的場景顯示屏數目
private static final int[] mPawnLife = {1,2,3,4,5,6};
private static final int[] mCockLife = {50,60,70,80,90,100};//每一關敵兵頭目的生命值
private static final int[] mAttackLife ={5,5,6,6,8,8};//敵兵頭目攻擊時候的消耗血的多少
private final int mSceneWidth,mSceneHeight;
protected static final int MAX_PAWN = 16 ;//場景中一次最多的敵兵數目
protected static final int MAX_BULLET = 6;//場景中最多的子彈數目
protected static final int MAX_ENEMY_BULLET=6;//場景中最多的敵人子彈數目
protected static final int MAX_SCENEUNIT = 10;//場景中的每一邊最多的物品個數
protected static final int HP_LENGTH = 35;//HP值條的長度
private Random mRandom = new Random(System.currentTimeMillis());
private Image mBufferImage = null;
private Graphics mBufferGraphics = null;
private Score mScore = null;//用于記錄玩家的得分情況
private int mKillPawn = 0;//殺死的敵兵個數
private static final int BORDER_UP = 123;//可以活動的區域的上邊界
private static final int BORDER_DOWN = 198;//可活動的下邊界
private int[][] background = {{0}};
private int[][] enemys = {{HF.DADAO,HF.CIKE,HF.GONGJIAN},{HF.CHANGMAO,HF.JIANDUN,HF.GONGJIAN},{HF.DADAO,HF.CIKE,HF.JIANDUN},{HF.JIANDUN,HF.GONGJIAN,HF.CHANGMAO},{HF.CIKE,HF.CHANGMAO,HF.DADAO}};
//public boolean isTalk=false;
public int fireNum=0;//火箭數量
public boolean fireEmpty=true;//火箭是否用完
public Media back = new Media("/sound/back.mid","audio/midi",true);
public Media win = new Media("/sound/win.mid","audio/midi",false);
public Media lose = new Media("/sound/lose.mid","audio/midi",false);
//加入的數據
public int hpSplashTime;//血槽閃動的幀數
public boolean beginLevel;
public boolean beginBoos;
//
public SceneModel(int width,int height,Score score) {
mSceneWidth = width;
mSceneHeight = height;
mScore = score;
mBufferImage = Image.createImage(width*2,height);
if(mBufferImage != null){
mBufferGraphics = mBufferImage.getGraphics();
}
init();
}
//初始化場景中的數據
private void init() {
try{
mPlayerImages = HF.loadImages("player",9);
mBulletImages = HF.loadImages("bullet",2);
mFireBulletImages = HF.loadImages("firearrow",2);
mCabinetImage[0] = HF.loadImage("cabinet.png");
mCabinetImage[1] = HF.loadImage("arrow.png");
mPlayerHPImage = HF.loadImage("playerHP.png");
//mCockHPImage = HF.loadImage("cockHP.png");
mPassImage = HF.loadImage("pass.png");
mFramesImage[0] = HF.loadImage("FightNameFrame.png");
mFramesImage[1] = HF.loadImage("FightPassFrame.png");
mNumImage = HF.loadImage("num.png");
mBBImg=HF.loadImage("bb.png");
mBFImg=HF.loadImage("bf.png");
} catch(Exception e){
System.out.println("Error loading scene imags");
//e.printStackTrace();
}
mPlayer = new Character(mPlayerFrames);
mPlayer.setImages(mPlayerImages);
//創建敵兵的數組
mPawns = new Character[MAX_PAWN];
//創建場景中的子彈數組
mBullets = new SceneUnit[MAX_BULLET];
mBBlood = new SceneUnit[MAX_ENEMY_BULLET+MAX_BULLET];
mBFloor = new SceneUnit[MAX_BULLET];
for(int i=0;i<MAX_BULLET;i++){
mBullets[i] = new SceneUnit();
}
mEnemyBullets = new SceneUnit[MAX_ENEMY_BULLET];
for(int i=0;i<MAX_ENEMY_BULLET;i++) {
mEnemyBullets[i] = new SceneUnit();
}
for(int i=0;i<MAX_ENEMY_BULLET+MAX_BULLET;i++){
mBBlood[i] = new SceneUnit();
mBBlood[i].mUsed=false;
}
for(int i=0;i<MAX_BULLET;i++){
mBFloor[i] = new SceneUnit();
mBFloor[i].mUsed=false;
}
//創建場景中的布景對象
mUpScenes = new SceneUnit[MAX_SCENEUNIT];
mDownScenes = new SceneUnit[MAX_SCENEUNIT];
for(int i=0;i<MAX_SCENEUNIT;i++){
mUpScenes[i] = new SceneUnit();
mDownScenes[i] = new SceneUnit();
}
//場景中的藥箱
for(int i=0;i<50;i++){
mCabinets[i] = new SceneUnit();
}
}
//重置場景的狀態
private void reset() {
mSceneIndex = 0;
mKillPawn = 0;
for(int i=0;i<MAX_BULLET;i++){
mBullets[i].reset();
}
for(int i=0;i<MAX_PAWN;i++){
mPawns[i].reset();
mPawns[i].setState(HF.STATE_MOVE_LEFT);
}
for(int i=0;i<MAX_SCENEUNIT;i++){
mDownScenes[i].reset();
mUpScenes[i].reset();
}
for(int i=0;i<2;i++){
mCabinets[i].reset();
}
}
//加載指定的關
private int[][] scene={{1,2,3,4},{5,6,7,3},{1,2,3,4},{11,6,9,8},{10,2,3,5}};
protected void loadLevel(int level) {
//reset();//重置場景的數據信息
try{
if (level==3) level=4;
mLevel = level;
for(int i=0;i<3;i++)
mPawnImages[i] = HF.loadImages("enemy"+enemys[level-1][i]+"_", 8); //加載敵兵的圖片
mCockImages = HF.loadImages("cock"+level+"_", 8);
mCockHPImage = HF.loadImage("cockHP_"+level+".png");
mPawns = new Character[MAX_PAWN];
switch(mLevel) {
case 1:
mPawns[0] = new Character(mCockFrames);//創建敵兵頭目,讓其指向第一個敵兵數組的位置
mPawns[1] = new Character(mCockFrames);//創建敵兵小頭目,讓其指向第二個敵兵數組的位置
mPawns[0].setImages(mCockImages);
mPawns[1].setImages(mCockImages);
mCock = mPawns[0];
mPreCock=mPawns[1];
break;
case 2:
int [] t = {3,3,3,3,1,1,3,3};
mPawns[0] = new Character(t);//創建敵兵頭目,讓其指向第一個敵兵數組的位置
mPawns[1] = new Character(mCockFrames);//創建敵兵小頭目,讓其指向第二個敵兵數組的位置
mPawns[1].setImages(mCockImages);
mPawns[0].setImages(mPawnImages[0]);
mCock = mPawns[0];
mPreCock=mPawns[1];
break;
case 3:
case 4:
case 5:
mPawns[0] = new Character(mCockFrames);//創建敵兵頭目,讓其指向第一個敵兵數組的位置
mPawns[1] = new Character(mCockFrames);//創建敵兵小頭目,讓其指向第二個敵兵數組的位置
mPawns[0].setImages(mCockImages);
mPawns[1].setImages(mCockImages);
mCock = mPawns[0];
mPreCock = mPawns[1];
break;
}
for(int i=2;i<MAX_PAWN;i++){
mPawns[i] = new Character(mPawnFrames);
}
System.out.println("在導入diren 之前");
int x = mSceneWidth+30;//mSceneWidth/2+Math.abs(mRandom.nextInt()%60);
int y = BORDER_UP+BORDER_DOWN>>1;//BORDER_UP +Math.abs(mRandom.nextInt()%50);
mPreCock.create(HF.COCK,mCockLife[mLevel-1],x,y);
mPreCock.mUsed = false;
mCock.create(HF.COCK,mCockLife[mLevel-1],x,y);
mCock.mUsed = false;
System.out.println("在kongkong之前");
reset();
mPlayer.create(HF.PLAYER,100,30,120);
mPlayer.setState(HF.STATE_MOVE_RIGHT);
mPlayer.setState(HF.STATE_STILL);//默認的靜止面朝向右
mBufferGraphics.translate(-mBufferGraphics.getTranslateX(),0);
System.out.println("在導入背景之前");
loadBackground(level);
//mBackgroundImage = HF.loadImage("background"+level+".png");
//for(int i=0;i<mSceneImages.length;i++)
// mSceneImages[i] = HF.loadImage("scene"+scene[level][i]+".png");
for(int i=0;i<sceneCount.length;i++)
sceneCount[i]=0;
createScene(0,0);
createScene(mSceneWidth,0);
if(HF.sound) {
win.stop();
lose.stop();
back.play();
}
} catch(Exception e){
System.out.println("Error loading level"+e);
}
beginLevel=true;
switch(mLevel){
case 1:
break;
case 2:
break;
case 4:
break;
case 5:
break;
}
}
public void loadBackground(int level)//讀取背景和場景的圖片
{
try{
switch(level) {
case 1:
case 2:
case 4:
case 5:
mBackgroundImage[0] = HF.loadImage("background"+level+"_"+0+".png");
break;
case 3:
mBackgroundImage[0] = HF.loadImage("background"+level+"_"+0+".png");
mBackgroundImage[1] = HF.loadImage("background"+level+"_"+1+".png");
break;
}
for(int i=0;i<mSceneImages.length;i++)
mSceneImages[i] = HF.loadImage("scene"+scene[level-1][i]+".png");
} catch(Exception e) {}
}
//設置主角小愛的狀態
public void setPlayerState(int state) {
if(mPlayer.mUsed==false||mPlayer.mState == HF.STATE_DIE)
return;//已經死亡了,不能再行動
if(mPlayer.mState != HF.STATE_ATTACK){
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -