canvas2游戏(canvas2游戏全CG)

检测方法如下canvas2游戏:

canvas2游戏(canvas2游戏全CG)

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);

}

说到这里,基本上也就把它讲完了,具体内容请详细研究源码,其实没必要看太多书,深入地研究一个问题并根据自己的理解来改进或者是修正它,实践才是最好的老师,希望大家能够有所收获。