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

📄 carniecanvas.java

📁 j2me游戏引擎 j2me游戏引擎
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
		}
	}
	
	/**
	 * 碰撞处理:首先检测与非行走图层的碰撞,然后检测与NPC的碰撞
	 *
	 */
	private void collidesHandler(){
		Object[] layerSet=currentMap.getLayerSet().list();
		Object[] npcSet=currentMap.getNpcSet().list();
		
		for(int i=0;i<layerSet.length;i++){
			SimpleLayer layer=(SimpleLayer)layerSet[i];
			if (layer.getType()==SimpleLayer.NO_WALKARENA){
				//如果主角与非行走图层碰撞,则主角将返回碰撞前的位置
				if (actor.getAnimator().collidesWith(layer.getLayer(),false)){
					actor.undoMove();
					System.out.println("Player与非行走图层发生碰撞!");
					break;
				}
				
			}
		}
		
		for(int i=0;i<npcSet.length;i++){
			NPC npc=(NPC)npcSet[i];
			if (actor.getAnimator().collidesWith(npc.getAnimator(),false)){
				actor.decreaseLife(npc.getAttack());
				actor.undoMove();
				System.out.println("Player与NPC["+npc.getName()+"]发生碰撞!");
				break;
			}
		}
		
		Object[] transSet=currentMap.getMapLink().list();
		for(int i=0;i<transSet.length;i++){
			MapTransformer trans=(MapTransformer)transSet[i];
			if (actor.getAnimator().collidesWith(trans.getSprite(),false)){
				System.out.println("Player过关了!");
				gamePass=true;
				hitTrans=trans;
				break;
			}
		}
	}
	
	/**
	 * NPC撞到物体(非行走路径、主角、其它NPC)时修改自己运动方向
	 * @param npc 撞到物体的NPC
	 */
	private void reflectDirection(NPC npc){
		int[] wrongDirection=new int[npc.getMovement().getMoveDirection()];
		int genDirection=RandomNumber.genRandomlyNumber(5,wrongDirection);
		npc.getMovement().setMoveDirection(genDirection);
		System.out.println("npc:"+npc.getName()+" 修正方向为:"+genDirection);
		
	}
	
	private void collidesHandlerForNPC(NPC npc,Object[] npcSet){
		Object[] layerSet=currentMap.getLayerSet().list();
		for(int i=0;i<layerSet.length;i++){
			SimpleLayer layer=(SimpleLayer)layerSet[i];
			if (layer.getType()==SimpleLayer.NO_WALKARENA){
				//如果NPC与非行走图层碰撞,则NPC将返回碰撞前的位置
				if (npc.getAnimator().collidesWith(layer.getLayer(),false)){
					npc.undoMove();
					reflectDirection(npc);
					System.out.println("npc:"+npc.getName()+"与非行走图层发生碰撞!");
					break;
				}
				for(int j=0;j<npcSet.length;j++){
					NPC npcSetElement=(NPC)npcSet[j];
					if ((npc.getId()!=npcSetElement.getId())
						&&(npc.getAnimator().collidesWith(npcSetElement.getAnimator(),false))){
						npc.undoMove();
						reflectDirection(npc);
						System.out.println("npc:"+npc.getName()+"与其它npc发生碰撞!");
						break;
					}
				}
				if (npc.getAnimator().collidesWith(actor.getAnimator(),false)){
					actor.decreaseLife(npc.getAttack());
					npc.undoMove();
					System.out.println("Player与NPC["+npc.getName()+"]发生碰撞!");
					break;
				}
			}
		}
	}
	/**
	 * 边界检测,如果超过了边界,则退回到越界前的位置
	 *
	 */
	private void borderDetect(){
		if (Measure.isOutOfBorder(actor.getAnimator().getX(),
				actor.getAnimator().getY(),
				border,Measure.RECTANGLE_MEASURE,true)){
			System.out.println("主角 x="+actor.getAnimator().getX()+" y="+actor.getAnimator().getY());
			
			actor.undoMove();
			System.out.println("主角走出了边界,又被拽了回来!");
		}
	}
	
	/**
	 * 边界检测,如果超过了边界,则退回到越界前的位置
	 *
	 */
	private void borderDetectForNPC(NPC npc){
		if (Measure.isOutOfBorder(npc.getAnimator().getX(),
				npc.getAnimator().getY(),
				border,Measure.RECTANGLE_MEASURE,true)){
			System.out.println("NPC:"+npc.getName()+" x="+npc.getAnimator().getX()+" y="+npc.getAnimator().getY());
			
			npc.undoMove();
			reflectDirection(npc);
			System.out.println("NPC:"+npc.getName()+"走出了边界,又被拽了回来!");
		}
	}
	
	public void run(){
		System.out.println("游乐场启动");
		//播放背景音乐
		playSound("bgmusic");
		Graphics g=this.getGraphics();
		
		while(gameOver!=true){
			try{
				Thread.sleep(runInterval);
			}
			catch(Exception ex){
				ex.printStackTrace();
			}
			render(g);
			input();
			this.flushGraphics();
		}
		//停止播放音乐
		stopSound("bgmusic");
		
		//如果主角过关,播放过关音乐,否则播放游戏结束音乐
		if (actor.isAlive()){
			if (gamePass){
				playSound("levelUp");
//				MainMIDlet.dialog.getDescription().setContent("恭喜你过关了!");
//				MainMIDlet.gameNavigator.switchSomething(GameNavigator.DIALOG_CANVAS);
				MainMIDlet.params.setLevelID(hitTrans.getNextLevelID());
				MainMIDlet.params.setMapID(hitTrans.getNextMapID());
				System.out.println("下一关为:"+hitTrans.getNextLevelID()+"-"+hitTrans.getNextMapID());
				if (MainMIDlet.params.getMapID()!=null){
					MainMIDlet.gameNavigator.switchSomething(GameNavigator.GAMELOADER_CANVAS);
				}
				else{
					MainMIDlet.dialog.getDescription().setContent("THE END");
					MainMIDlet.gameNavigator.switchSomething(GameNavigator.DIALOG_CANVAS);
				}
			}
		}
		else{
			playSound("gameOver");
			MainMIDlet.dialog.getDescription().setContent("游戏结束!");
			MainMIDlet.gameNavigator.switchSomething(GameNavigator.DIALOG_CANVAS);
		}
		System.out.println("游乐场退出");
	}
	
	/**
	 * 播放音乐
	 * @param musicID 音乐ID
	 */
	private void playSound(String musicID){
		Music music=musician.takeMusicFromMusicBox(musicID);
		if (music!=null){
			try{
				if (music.getMusicPlayer().getState()==Player.UNREALIZED){
					music.getMusicPlayer().realize();
				}
				music.getMusicPlayer().start();
				music.getMusicPlayer().addPlayerListener(this);
			}
			catch(Exception ex){
				ex.printStackTrace();
			}
		}
		else{
			System.out.println("没有找到相应的音乐");
		}
	}
	
	/**
	 * 停止播放音乐
	 * @param musicID 音乐ID
	 */
	private void stopSound(String musicID){
		Music music=musician.takeMusicFromMusicBox(musicID);
		if (music!=null){
			try{
				music.getMusicPlayer().removePlayerListener(this);
//				music.getMusicPlayer().close();
			}
			catch(Exception ex){
				ex.printStackTrace();
			}
		}
	}
	
	/**
	 * 暂停播放音乐
	 * @param musicID 音乐ID
	 */
	private void pauseSound(String musicID){
		Music music=musician.takeMusicFromMusicBox(musicID);
		if (music!=null){
			try{
				music.getMusicPlayer().stop();
			}
			catch(Exception ex){
				ex.printStackTrace();
			}
		}
	}
	
	/**
	 * 实现PlayerLitener的playerUpdate方法
	 */
	public void playerUpdate(Player player,String event,Object eventData){
		System.out.println("触发事件:"+event+"发生!");
		
		if (event.equals(PlayerListener.END_OF_MEDIA)){
			//查找与player相应的music对象
			Music music=musician.takeMusicFromMusicBox(player);
			if (music!=null){
				System.out.println("已查找到与player相应的music对象");
				switch(music.getPlayModel()){
				case Music.FINITE_LOOP:
					if (music.isPlayEnd()==false){
						//增加播放次数
						music.increasePlayTimes();
						
						//如果达到最大播放次数,则停止播放,否则继续播放
						if (music.isPlayEnd()==false){
							try{
								music.getMusicPlayer().start();
							}
							catch(Exception ex){
								ex.printStackTrace();
							}
						}
						else{
							stopSound(music.getId());
						}
					}
					else{
						music.getMusicPlayer().removePlayerListener(this);
						System.out.println("音乐已经播放完毕!");
					}
					break;
				case Music.INFINITE_LOOP:
					try{
						music.getMusicPlayer().start();
					}
					catch(Exception ex){
						ex.printStackTrace();
					}
					break;
				}
			}
			else{
				System.out.println("没有查找到与player相应的music对象");
			}
		}
	}
	
	public void commandAction(Command cmd,Displayable d){
		
		if (cmd.getLabel().equals(exitCmd.getLabel())){
			gameOver=true;
			MainMIDlet.gameNavigator.switchSomething(GameNavigator.MENU_CANVAS);
		}
	}

	public boolean isGameOver() {
		return gameOver;
	}

	public void setGameOver(boolean gameOver) {
		this.gameOver = gameOver;
	}

	public boolean isGamePass() {
		return gamePass;
	}

	public void setGamePass(boolean gamePass) {
		this.gamePass = gamePass;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -