private boolean notMiss( ) {
// return player.collidesWith(ball,false);
int ballCX = ball.getX() + ball.getWidth()/2;
int ballCY = ball.getY() + ball.getHeight()/2;
int playerCX = player.getX() + player.getWidth()/2;
int playerCY = player.getY() + player.getHeight()/2;
return ((Math.abs(playerCX - ballCX)< ball.getWidth()/2) &&
(Math.abs(ballCY - playerCY) < 5));
}
被注释掉的一行是直接用Sprite的碰撞检测,下面的部分是自己计算两幅图像有没有重叠,效果差不多。其中collidesWith()的第二个参数是告诉内部方法是否要用像素级别的检测,通常答案是千万不要,这很慢的,而且没有必要这么精确。
为了说明整个游戏的控制逻辑,我们先来看看MIDletGetBall这个类,跟通常的MIDlet略有不同,因为我把主线程放在了CanvasGetBall中,MIDletGetBall只是简单地控制主线程就行了。
public void startMainThread() {
Display.getDisplay(this).setCurrent(displayable);
if(mainThread != null) {
mainThread = null;
Runtime.getRuntime().gc();
}
mainThread = new Thread(displayable);
mainThread.start();
}
其中第一行就是设置当前显示页面;也就是显示CanvasGetBall。
回到CanvasGetBall,整个游戏分几个阶段,相应有不同的画面和命令接口,详细说明如下:
1. 等待开始,对应在方法ready():
public void ready() {
cover.setTitle(TIPS[2]);
cover.addCommand(playCommand);
Display.getDisplay(MIDletGetBall.instance).setCurrent(cover);
}
为了绘制方便,这里单独用了个GameCanvas来绘制提示信息和响应命令,并根据玩家操作在CanvasCover和CanvasGetBall两个画面之间来回切换。
2. 游戏画面,包括启动和结束两个方法:
public void start() {
if(!playing) {
strTip = TIPS[0];
playing = true;
MIDletGetBall.instance.startMainThread();
removeCommand(playCommand);
removeCommand(resumeCommand);
addCommand(pauseCommand);
ball.start();
try {
if(tonePlayer != null) {
tonePlayer.start();
}
}
catch (MediaException ex) {
tonePlayer.close();
tonePlayer = null;
}
}
}
public void stop () {
if(playing) {
ball.stop();
strTip = TIPS[1];
try {
Thread.sleep(300);
}
catch (InterruptedException ex) {
}
playing = false;
removeCommand(pauseCommand);
addCommand(resumeCommand);
try {
tonePlayer.stop();
}
catch (MediaException ex1) {
tonePlayer.close();
tonePlayer = null;
}
}
}
并对应设置相应的命令来让玩家能够继续下去,构成一个简单的封闭控制环路。
3.游戏结束,对应方法gameover()
public void gameover() {
this.stop();
cover.setTitle(TIPS[3]);
cover.removeCommand(playCommand);
cover.addCommand(restartCommand);
Display.getDisplay(MIDletGetBall.instance).setCurrent(cover);
}
说到这里,基本上也就把它讲完了,具体内容请详细研究源码,其实没必要看太多书,深入地研究一个问题并根据自己的理解来改进或者是修正它,实践才是最好的老师,希望大家能够有所收获。