⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 carniecanvas.java

📁 j2me游戏引擎 j2me游戏引擎
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
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 + -