📄 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 + -