📄 carniecanvas.java
字号:
package cn.org.matrix.gmatrix.practice.demo01;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.lcdui.*;
import javax.microedition.media.Player;
import javax.microedition.media.PlayerListener;
import cn.org.matrix.gmatrix.gameLab.engine.*;
import cn.org.matrix.gmatrix.gameLab.scene.*;
import cn.org.matrix.gmatrix.gameLab.engine.music.*;
import cn.org.matrix.gmatrix.gameLab.elements.biology.*;
import cn.org.matrix.gmatrix.gameLab.util.*;
import cn.org.matrix.gmatrix.gameLab.control.KeyManager;
/**
* 游乐场画布
* @author cleverpig
*
*/
public class CarnieCanvas extends GameCanvas implements Runnable,PlayerListener,CommandListener{
//边界对象:用于检测物体是否跃出边界
private Border border=null;
//图层管理器
private SimpleLayerManager lm=null;
//关卡
private SimpleLevel level=null;
//主角
private Actor actor=null;
//摄像机
private Camera camera=null;
//音乐家
private Musician musician=null;
//地图
private SimpleMap currentMap=null;
//当前玩家碰到的地图转换器
private MapTransformer hitTrans=null;
//游戏结束标志
private boolean gameOver=false;
//游戏过关标志
private boolean gamePass=false;
//退出游戏的command对象
private Command exitCmd=null;
//画面中显示主角状态的文字的颜色
private int fontColor=0x000000;
//画面中显示主角状态的文字的字体
private Font font=this.getGraphics().getFont();
//线程运行时间间隔
private int runInterval=10;
/**
* 构造方法
* @param suppressKeyEvent 是否屏蔽掉键盘事件
*/
public CarnieCanvas(boolean suppressKeyEvent){
super(suppressKeyEvent);
exitCmd=new Command("退回主菜单",Command.EXIT,-1);
this.addCommand(exitCmd);
this.setCommandListener(this);
}
/**
* 初始化
*/
public void init(GameParams params){
gameOver=false;
gamePass=false;
runInterval=MainMIDlet.gameLoader.getCarnieRunInterval();
initCarnia(params);
}
/**
* 初始化游乐场:装载关卡(若干地图/NPC/Actor/Camera)
* @param levelID 关卡ID
* @param mapID 地图ID
* @param ActorID 主角ID
* @param cameraID 摄像机ID
*/
public void initCarnia(String levelID,
String mapID,
String actorID,
String cameraID){
System.out.println("当前屏幕宽="+getWidth()+" 高="+getHeight());
lm=new SimpleLayerManager();
//装载主角
actor=(Actor)MainMIDlet.gameLoader.getGlobalActorTable().find(actorID);
System.out.println("装载主角");
//装载摄像机
camera=(Camera)MainMIDlet.gameLoader.getGlobalCameraTable().find(cameraID);
if (camera.getCustomSizeFlag()==Camera.CUSTOM_SIZE){
camera.setWidth(this.getWidth());
camera.setHeight(this.getHeight());
}
System.out.println("装载摄像机");
//装载音乐
musician=(Musician)MainMIDlet.gameLoader.getGlobalMusicTable();
System.out.println("装载音乐");
//装载关卡
level=(SimpleLevel)MainMIDlet.gameLoader.getGlobalLevelTable().find(levelID);
System.out.println("装载关卡");
//获得当前地图
if (mapID!=null){
currentMap=lm.constructMap(level,actor,mapID);
}
else{
currentMap=lm.constructMap(level,actor,level.getFirstMapID());
}
System.out.println("装载地图");
//设置边界
border=new Border(0,0,currentMap.getWidth()-actor.getAnimator().getWidth(),currentMap.getHeight()-actor.getAnimator().getHeight());
//随即设置NPC初始运动方向
Object[] npcSet=currentMap.getNpcSet().list();
for(int i=0;i<npcSet.length;i++){
NPC npc=(NPC)npcSet[i];
int direction=RandomNumber.genRandomlyNumber(5,null);
if (direction==0){
direction=1;
}
npc.getMovement().setMoveDirection(direction);
System.out.println("npc初始化随机方向:"+direction);
}
System.out.println("内存使用情况:"+Runtime.getRuntime().freeMemory()+"/"+Runtime.getRuntime().totalMemory());
}
/**
* 初始化游乐场:装载关卡(若干地图/NPC/Actor/Camera)
* @param params 游戏参数
*/
public void initCarnia(GameParams params){
System.out.println("当前屏幕宽="+getWidth()+" 高="+getHeight());
lm=new SimpleLayerManager();
//装载主角
actor=(Actor)MainMIDlet.gameLoader.getGlobalActorTable().find(params.getActorID());
System.out.println("装载主角");
System.out.println("主角的生命力="+actor.getLife());
//装载摄像机
camera=(Camera)MainMIDlet.gameLoader.getGlobalCameraTable().find(params.getCameraID());
if (camera.getCustomSizeFlag()==Camera.CUSTOM_SIZE){
camera.setWidth(this.getWidth());
camera.setHeight(this.getHeight());
}
System.out.println("装载摄像机");
//装载音乐
musician=(Musician)MainMIDlet.gameLoader.getGlobalMusicTable();
System.out.println("装载音乐");
//装载关卡
level=(SimpleLevel)MainMIDlet.gameLoader.getGlobalLevelTable().find(params.getLevelID());
System.out.println("装载关卡");
//获得当前地图
if (params.getMapID()!=null){
currentMap=lm.constructMap(level,actor,params.getMapID());
}
else{
currentMap=lm.constructMap(level,actor,level.getFirstMapID());
}
System.out.println("装载地图");
//设置边界
border=new Border(0,0,currentMap.getWidth()-actor.getAnimator().getWidth(),currentMap.getHeight()-actor.getAnimator().getHeight());
//随即设置NPC初始运动方向
Object[] npcSet=currentMap.getNpcSet().list();
for(int i=0;i<npcSet.length;i++){
NPC npc=(NPC)npcSet[i];
int direction=RandomNumber.genRandomlyNumber(5,null);
if (direction==0){
direction=1;
}
npc.getMovement().setMoveDirection(direction);
System.out.println("npc初始化随机方向:"+direction);
}
System.out.println("内存使用情况:"+Runtime.getRuntime().freeMemory()+"/"+Runtime.getRuntime().totalMemory());
}
/**
* 画出主角的状态
* @param g Graphics对象
*/
private void drawActorStatus(Graphics g){
String lifeValue="生命力:"+actor.getLife();
g.setColor(fontColor);
g.drawString(lifeValue,getWidth()-font.stringWidth(lifeValue),getHeight()-font.getHeight(),Graphics.TOP|Graphics.LEFT);
}
/**
* 画出主角的状态
* @param g Graphics对象
*/
private void drawGameStatus(Graphics g){
String levelName=level.getLevelName()+"-"+currentMap.getName();
g.setColor(fontColor);
g.drawString(levelName,0,getHeight()-font.getHeight(),Graphics.TOP|Graphics.LEFT);
}
/**
* 渲染器
* @param g Graphics对象
*/
private void render(Graphics g){
//将屏幕前面的图像擦去
g.setColor(0xffffff);
g.fillRect(0,0,this.getWidth(),this.getHeight());
if (actor.isAlive()){
if (gamePass==false){
camera.move(actor,currentMap.getWidth(),currentMap.getHeight());
//使用摄像机设置视窗
lm.setViewWindow(camera.getCoordinates().getX(),
camera.getCoordinates().getY(),
camera.getWidth(),camera.getHeight());
//播放npc的动画
Object[] npcSet=currentMap.getNpcSet().list();
for(int i=0;i<npcSet.length;i++){
NPC npc=(NPC)npcSet[i];
npc.getAnimator().PlayAnimation();
npc.move();
collidesHandlerForNPC(npc,npcSet);
borderDetectForNPC(npc);
}
//播放主角的动画
actor.getAnimator().PlayAnimation();
lm.paint(g,0,0);
//画出主角状态
drawActorStatus(g);
//画出游戏状态
drawGameStatus(g);
}
else{
// String passMessage="恭喜,你过关了!";
// g.setColor(fontColor);
// g.drawString(passMessage,getWidth()/2-font.stringWidth(passMessage)/2,getHeight()/2-font.getHeight(),Graphics.TOP|Graphics.LEFT);
gameOver=true;
}
}
else{
// String endMessage="游戏结束!";
// g.setColor(fontColor);
// g.drawString(endMessage,getWidth()/2-font.stringWidth(endMessage)/2,getHeight()/2-font.getHeight(),Graphics.TOP|Graphics.LEFT);
gameOver=true;
}
System.out.println("渲染完毕!");
}
/**
* 由键盘值获取运动方向
* @param keyValue 键盘值
* @return 运动方向(在Movement中定义的常量)
*/
private int keyToDirection(int keyValue){
int result=0;
switch(keyValue){
case KeyManager.LEFT_KEYPRESS:
result=Movement.LEFT_MOVE;
break;
case KeyManager.RIGHT_KEYPRESS:
result=Movement.RIGHT_MOVE;
break;
case KeyManager.UP_KEYPRESS:
result=Movement.UP_MOVE;
break;
case KeyManager.DOWN_KEYPRESS:
result=Movement.DOWN_MOVE;
break;
}
return result;
}
private void input(){
//获得键盘定义值
int keyValue=KeyManager.getKeyValue(this.getKeyStates(),actor.getGameModel());
if (keyValue>0){
System.out.println("获得键盘输入值:"+keyValue);
switch(actor.getGameModel().getModelType()){
case GameModel.FREEMOVE_MODEL:
//设置移动方向
actor.getMovement().setMoveDirection(keyToDirection(keyValue));
//移动主角
actor.move();
System.out.println("Player移动到:("+actor.getCoordinates().getX()+
","+actor.getCoordinates().getY()+")");
//碰撞处理
collidesHandler();
//边界检测
borderDetect();
break;
case GameModel.DIALOG_MODEL:
break;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -