📄 carniecanvas.java
字号:
}
}
/**
* 碰撞处理:首先检测与非行走图层的碰撞,然后检测与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 + -