在线程中,通过 1、调用创建关卡的方法CREAT_STAGE(); paper51.com
2、判断是否按下暂停while(ispause) paper51.com
3、调用按键方法INPUT_KEY(); paper51.com 4、调用各种判断和行动的方法PENG_ZHUANG(); 内容来自论文无忧网 www.paper51.com 5、调用刷新画面的方法movMing(); 内容来自论文无忧网 www.paper51.com 6、判断是否输掉游戏if(isEndGame) 内容来自www.paper51.com 7、判断是否赢得游戏if(isEndGame) 内容来自论文无忧网 www.paper51.com 来对游戏进行不断监控。 copyright paper51.com 4.4.3 玩家精灵GamePlayer类的实现 内容来自论文无忧网 www.paper51.com
Sprite类是继承自Layer的用于存储多帧的基本可视元素。不同的frame可交相显示,构成动态的效果。图片可翻转、颠倒、由一个主角图片就可以方便的得到所有方向的显示状态,相比原先只能使用Canvas绘图,需要将所有方向的主角图像都绘制在png图像中简化了许多。Sprite也可以从整合的图像中读图,读图时将把大图分解为若干等宽等高的小图。每个小图按照其排列顺序有相应的序号,在程序中调用其序号,就可以绘制出相应的图片。本程序中的玩家、怪物都由Sprite继承得到。在有些情况下,控制主角的翻转,尤其是多幅图片配合显示的过程,如果将多图的共享定位点设置在通常的左上角,将很不容易控制,因为许多翻转都是以其他点为参考电的(比如,中心点)。由此,引入参考点的概念。参考点由defineReferencePixel函数确定未翻转图片状态时的坐标。默认是(0,0)点,如果需要,可将参考点设置在画面边界之外。 copyright paper51.com 在本程序中,由于J2ME中提供的Sprite类功能有限,所以我自己写了一个GamePlayer类来继承Sprite类,扩充了更多的功能。 内容来自论文无忧网 www.paper51.com
public class GamePlayer extends Sprite http://www.paper51.com { 内容来自www.paper51.com
} paper51.com 在游戏中和背景的碰撞检测始终是个难点,在本程序中是这样实现的: http://www.paper51.com
public void isPeng(int x,int y,int Array[][],int N) copyright paper51.com
{ copyright paper51.com for(int i = 0; i < 20; i++) paper51.com
{ paper51.com for(int j = 0;j< 18; j++) 内容来自论文无忧网 www.paper51.com { 内容来自论文无忧网 www.paper51.com if(Array[i][j]== N) copyright paper51.com
{ paper51.com
if(!MyGame.isU) 内容来自论文无忧网 www.paper51.com { copyright paper51.com if(Length * j <= x + this.getWidth() /2 && Length *(j + 1) >= x +this.getWidth() /2 && 10 +Length * i <= y && 10 +Length *(i + 1) >= y) 内容来自www.paper51.com
{ 内容来自www.paper51.com this.setPosition(this.getX(), 20 + Length *(i + 1)); paper51.com System.out.println(“UP:”+getY()); 内容来自论文无忧网 www.paper51.com
} copyright paper51.com //左 内容来自论文无忧网 www.paper51.com if(Length * j <= x + 1 && Length *(j + 1) >= x + 1 && 10 +Length * i <= y + this.getHeight()/2 && 10 + Length *(i + 1) >= y+ this.getHeight()/2) paper51.com { paper51.com this.setPosition(Length * (j + 1),this.getY()); paper51.com } paper51.com if(Length * j <=x + this.getWidth() - 1 && Length *(j + 1) >= x +this.getWidth() –1 && 10 + Length * i <= y + this.getHeight()/2&& 10 + Length *(i + 1) >= y + this.getHeight()/2) paper51.com { paper51.com this.setPosition(Length* j - this.getWidth() ,this.getY()); copyright paper51.com } 内容来自www.paper51.com } paper51.com //左下 内容来自www.paper51.com if(Length * j <= x + 3&& Length *(j + 1) >= x + 3 && 10 +Length * i <= y + this.getHeight() && 10 + Length *(i + 1) >= y +this.getHeight()) copyright paper51.com
{ 内容来自www.paper51.com this.setPosition(this.getX(), Length * (i -1)); 内容来自www.paper51.com } http://www.paper51.com //右下 copyright paper51.com if(Length * j <= x +this.getWidth() -3 && Length *(j + 1) >= x +this.getWidth() -3 && 10 +Length * i <= y + this.getHeight() && 10 + Length *(i + 1) >= y +this.getHeight()) paper51.com { 内容来自www.paper51.com
this.setPosition(this.getX(), Length * (i - 1)); copyright paper51.com Length *i:+Length * (i-1)); copyright paper51.com } paper51.com
http://www.paper51.com
} paper51.com } paper51.com 通过查看背景数组和玩家坐标,来实现和背景的碰撞检测。 内容来自www.paper51.com 4.4.5SoundEffects类的实现 内容来自www.paper51.com 声音效果是一个游戏中必不可少的部分,没有了生动的音乐效果,游戏的体验就会大打折扣。在我们的游戏中当然也不能没有声音。 http://www.paper51.com 在我们的游戏程序中的PlayMusic类就是游戏中的音效类。该类的主要功能为使用MIDP2.0 Media API播放游戏中的声音效果:背景音乐和游戏结束的提示音。 paper51.com 我们用private Player createPlayer(Stringfilename, String f, int i) 创建播放器。该方法中的filename是要播放声音文件的相对路径,f是播放音乐文件的格式,i用来控制该音乐的播放次数。在播放某个声音之前我们都需要调用stop方法来中止声音(如果声音未播放则该方法无效)。游戏中的声音我们用的startPlayer方法来播放。在需要播放游戏中的声音时我们就调用该类中相应的方法。 paper51.com
5 程序设计过程中遇到的一些重要问题 paper51.com
5.1 关于碰撞的问题 paper51.com 在游戏中最先要解决的也是最重要的问题就是碰撞检测的实现以及碰撞后表现出的效果。在弹球游戏中碰撞检测分为俩种:精灵与精灵之间的碰撞检测以及精灵与方块图层之间的碰撞检测。 http://www.paper51.com 精灵与精灵之间的碰撞检测可以直接调用Sprite类中的collidesWith()方法或者自己重新Sprite类中的collidesWith()方法并调用来进行碰撞检测。在本游戏程序中我们使用的是后者。这点表现效果还是很不错的。 内容来自www.paper51.com 再者就是精灵与图层之间的碰撞检测即主角与砖块之间的碰撞检测。我们精灵中重写的collidesWith()方法来检测它们之间的碰撞检测,这个时候我们就存在一个怎么样判断与小球碰撞的是哪个砖块的问题。我所采用的是通过查看背景数组和玩家坐标,来实现和背景的碰撞检测,但是效果不是很理想。到目前在我们经过的多次测试中还没有出现判断失误以及无法判断等错误。可是,效果不理想,我还将继续探索更精更有效的算法。 内容来自论文无忧网 www.paper51.com 5.2 关于游戏画面的显示问题 copyright paper51.com 在后期测试中发现游戏在暂停后继续游戏时,游戏画面又恢复为游戏开始的画面,而不是暂停时的游戏画面,经过多次调试后发现问题在MyGameCanvas类。 paper51.com 在仔细阅读了相关的资料后发现线程的创建和运行是通过调用它本身的函数start()来调动run()函数开始运行的,当run ()方法执行完毕后,线程就结束了。一旦一个线程执行完毕,这个实例就不能再重新启动,只能重新生成一个新实例,再启动一个线程。鉴于此,我们决定在MyGameCanvas类的run()内设置一个暂停标志量pause。 http://www.paper51.com
这样就实现了游戏的暂停(挂起)功能。当继续游戏后,游戏画面就是我们暂停时的画面。 copyright paper51.com |