📄 controlcenter.java
字号:
package pushbook.core;
import java.util.Vector;
import java.util.Hashtable;
import java.awt.*;
import javax.swing.*;
import pushbook.*;
import java.awt.image.ImageObserver;
/**
* <p>Title: 推箱子</p>
* <p>Description: 控制中心,控制游戏元素的移动</p>
* <p>Copyright: 无版权</p>
* <p>Company: 吉林省前郭尔罗斯蒙古族自治县第五高级中学</p>
* @author 郑雪
* @version 1.0
*/
public class ControlCenter
{
//窗口标题
public String gameTitle = "";
//背景音乐
public String gameMusic = "";
//过关提示
public String gameCelebrate = "";
//游戏元素表
public Vector gameElements = null;
//目的地元素列表
public Vector destinationElements = null;
//游戏元素模板列表
public Hashtable gameTemplet = null;
//关卡序列
public Vector gameSequence = null;
//数字图片数组
public Vector numberImage = null;
//积分区图片
public Image stepsImage = null;
//结束图片
public Image endImage = null;
//地图的宽度和高度
public int mapWidth = 0;
public int mapHeight = 0;
//有图片元素个数
public int haveImageElement = 0;
//活动元素个数
public int activeElement = 0;
//当前关编号
public int levelIndex = 0;
//步行计数器
public int stepConter = 0;
//总步数
public int stepSum = 0;
//游戏结束
public boolean gameover = false;
/**
* 默认构造函数
*/
public ControlCenter()
{
numberImage = new Vector();
gameElements = new Vector();
gameTemplet = new Hashtable();
destinationElements = new Vector();
gameSequence = new Vector();
haveImageElement = 0;
activeElement = 0;
LevelManager lm = new LevelManager();
ConfigManager cm = new ConfigManager();
gameSequence = cm.getSequence();
levelIndex = 0;
lm.loadLevelData(this,(String)gameSequence.get(levelIndex));
MidiPlayer.getInstance(gameMusic).start();
}
/**
* 根据参数指定的xml文件建立新一关的游戏环境
* @param xmlfile String
*/
public boolean jumpLevel(int index)
{
if(index < 0 || index >= gameSequence.size()){gameover = true; return false;}
gameElements = new Vector();
destinationElements = new Vector();
gameTemplet = new Hashtable();
haveImageElement = 0;
activeElement = 0;
LevelManager lm = new LevelManager();
lm.loadLevelData(this,(String)gameSequence.get(index));
MidiPlayer.getInstance(null).changeFile(gameMusic);
gameover = false;
return true;
}
/**
* 直接进入下一关
*/
public void nextLevel()
{
if(levelIndex+1 >= gameSequence.size()){gameover = true; return;}
levelIndex ++;
stepSum += stepConter;
stepConter = 0;
jumpLevel(levelIndex);
}
/**
* 直接进入上一关
*/
public void privLevel()
{
if(levelIndex-1 < 0) return;
levelIndex --;
stepSum += stepConter;
stepConter = 0;
jumpLevel(levelIndex);
gameover = false;
}
/**
* 判断能否过关
* @return boolean
*/
public boolean canPass()
{
boolean rev = true;
GameElement temp = null;
GameElement tempDes = null;
for(int i=0;i<destinationElements.size();i++)
{
tempDes = (GameElement)destinationElements.get(i);
temp = getElement(tempDes.x,tempDes.y);
if(temp == null || !temp.canMove || temp.canActive())
{
rev = false;
}
}
return rev;
}
/**
* 装入资源
* @param g Graphics
*/
public void loadResource(Frame mainframe)
{
GameElement temp = null;
for (int i = 0; i < gameElements.size(); i++)
{
temp = (GameElement) gameElements.get(i);
if(temp.img != null)
{
temp.trueimg = mainframe.getToolkit().createImage(getClass().getResource(temp.img));
}
}
for(int i=0;i<10;i++)
{
numberImage.add(mainframe.getToolkit().createImage(getClass().getResource("/resource/"+i+".jpg")));
}
stepsImage = mainframe.getToolkit().createImage(getClass().getResource("/resource/steps.jpg"));
endImage = mainframe.getToolkit().createImage(getClass().getResource("/resource/end.jpg"));
}
/**
* 将全部对象的位置入栈
*/
public void pushAllStep()
{
for(int i=0;i<gameElements.size();i++)
{
GameElement temp = null;
temp = (GameElement)gameElements.get(i);
if(temp.canMove()) temp.stepPushStack();
}
}
/**
* 回退全部对象
*/
public void popAllStep()
{
for(int i=0;i<gameElements.size();i++)
{
GameElement temp = null;
temp = (GameElement)gameElements.get(i);
if(temp.canMove()) temp.breakStep();
}
}
/**
* 处理键盘事件
* @param keycode int 键盘键值
* @return boolean 是否影响画面了
*/
public boolean pressKey(int keycode)
{
boolean rev = false;
GameElement temp = null;
if(keycode != Invariable.codeBareak) pushAllStep();
for(int i=0;i<gameElements.size();i++)
{
temp = (GameElement)gameElements.get(i);
if(temp.canMove() && temp.canActive())
{
if (keycode == Invariable.codeUp)
{
if (warmupMoveUp(temp)) rev = temp.moveUp();
if (rev){ stepConter++;}
}
if (keycode == Invariable.codeDown)
{
if (warmupMoveDown(temp)) rev = temp.moveDown();
if (rev){ stepConter++;}
}
if (keycode == Invariable.codeLeft)
{
if (warmupMoveLeft(temp)) rev = temp.moveLeft();
if (rev){ stepConter++;}
}
if (keycode == Invariable.codeRight)
{
if (warmupMoveRight(temp)) rev = temp.moveRight();
if (rev){ stepConter++;}
}
if (keycode == Invariable.codeBareak)
{
for(int j=0;j<gameElements.size();j++)
{
((GameElement)gameElements.get(j)).breakStep();
}
if(stepConter > 0) stepConter--;
rev = true;
}
}
}
if(rev == false && keycode != Invariable.codeBareak)
this.popAllStep();
return rev;
}
/**
* 取得指定坐标的游戏元素,如果指定坐标上有多个游戏元素则取得不可覆盖的那个元素
* @param x int 坐标X
* @param y int 坐标Y
* @return GameElement 取得的元素,未取得元素时则返回null
*/
public GameElement getElement(int x,int y)
{
GameElement rev = null;
GameElement temp = null;
for(int i=0;i<gameElements.size();i++)
{
temp = (GameElement)gameElements.get(i);
if(temp.x == x && temp.y == y)
{
rev = temp;
//如果取得的元素是不能覆盖的则直接将其返回,否则要保留结果继续判断
if(!temp.canOvercast()) return temp;
}
}
return rev;
}
/**
* 准备将指定游戏元素向上移动,将移动他相关的元素
* @param ge GameElement 指定的游戏元素
* @return boolean 如果指定元素不能移动则返回false
*/
public boolean warmupMoveUp(GameElement ge)
{
boolean rev = false;
GameElement temp = getElement(ge.x,ge.y-Invariable.unitSize);
if(temp != null)
{
if (temp.canOvercast())return true;
else if (!temp.canMove())return false;
else
{
GameElement temp1 = getElement(temp.x, temp.y - Invariable.unitSize);
if (temp1.canOvercast())
{
temp.moveUp();
return true;
}
else return false;
}
}
return false;
}
/**
* 准备将指定游戏元素向下移动,将移动他相关的元素
* @param ge GameElement 指定的游戏元素
* @return boolean 如果指定元素不能移动则返回false
*/
public boolean warmupMoveDown(GameElement ge)
{
boolean rev = false;
GameElement temp = getElement(ge.x,ge.y + Invariable.unitSize);
if(temp != null)
{
if (temp.canOvercast())return true;
else if (!temp.canMove())return false;
else
{
GameElement temp1 = getElement(temp.x, temp.y + Invariable.unitSize);
if (temp1.canOvercast())
{
temp.moveDown();
return true;
}
else return false;
}
}
return false;
}
/**
* 准备将指定游戏元素向左移动,将移动他相关的元素
* @param ge GameElement 指定的游戏元素
* @return boolean 如果指定元素不能移动则返回false
*/
public boolean warmupMoveLeft(GameElement ge)
{
boolean rev = false;
GameElement temp = getElement(ge.x - Invariable.unitSize,ge.y);
if(temp != null)
{
if (temp.canOvercast())return true;
else if (!temp.canMove())return false;
else
{
GameElement temp1 = getElement(temp.x - Invariable.unitSize, temp.y);
if (temp1.canOvercast())
{
temp.moveLeft();
return true;
}
else return false;
}
}
return false;
}
/**
* 准备将指定游戏元素向右移动,将移动他相关的元素
* @param ge GameElement 指定的游戏元素
* @return boolean 如果指定元素不能移动则返回false
*/
public boolean warmupMoveRight(GameElement ge)
{
boolean rev = false;
GameElement temp = getElement(ge.x + Invariable.unitSize,ge.y);
if(temp != null)
{
if (temp.canOvercast())return true;
else if (!temp.canMove())return false;
else
{
GameElement temp1 = getElement(temp.x + Invariable.unitSize, temp.y);
if (temp1.canOvercast())
{
temp.moveRight();
return true;
}
else return false;
}
}
return false;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -