J2ME小游戏的操作指南
先简单地介绍一下这个游戏,玩家只能控制角色(一个端着网兜的小人)水平地移动,接住自然下落的小球就得分,积分到一定程度后,小球下落速度将加快,直到最高速为止;如果没接到小球,也有相应的惩罚,最终游戏会Game Over。
为了避免过于单调,玩家角色不是简单地平移,而是利用了Sprite的简单帧动画来让角色看上去有些动作。其实很方便的,只是在移动位置时更换一下图像就行了,Sprite提供有几个方法NextFrame(),PrevFrame()用来切换。
声音部分就更简单了,只是重复地播放一段预先写进去的音乐,来自Sun的WTK中的一个例子。
不过既然提到了它,就还是先简单地说一下吧,免得后面介绍其他部分时有些疑问。
J2ME中的声音部分非常简单,当然效果也不太好,所需的基本元素只有如下几个,一个内容部分的Byte系列;一个是播放器Player;还有一个是控制部分的ToneControl。代码示例如下:
tonePlayer = Manager.createPlayer(Manager.TONE_DEVICE_LOCATOR);
tonePlayer.setLoopCount(-1);
tonePlayer.realize();
ToneControl tc = (ToneControl)tonePlayer.getControl(javax.microedition.media.control.ToneControl);
tc.setSequence(mySequence);
当然还需要些初始化工作和异常处理,然后就可以通过tonePlayer.start()/close()方法来控制声音的播放和停止了。
具体请参见源码中CanvasGetBall.java中的createTonePlayer()方法。
锣鼓响了半天,主角也该出场了。这个游戏里的主角只有一个接球小人,不过角色还有一个跟它演对手戏的NPC,就是那只从天而降的小球了。这两个类都是Sprite的子类,小球因为有些自己的动作,同时实现了Runnable接口,能自主活动。不过也很简单,NPC嘛,一般来说都是相对弱智些,不然也没法玩了,谁的反应速度跟得上机器啊,再说了,NPC知道的信息也要多些:)。
先来看看主角吧,BallPlayer类就是我们的主角,其实非常简单,在所有的6个类中,除了记分用的Score外就数它最小了。提供一幅图像把它实例化后,就只能通过左右移动来控制了,额外的几个方法都是跟记分有关系的,先略过不提。
先来看看它的构造方法:
public BallPlayer(Image img, int fw, int fh) {
super(img, fw, fh);
this.step = fw / 2;
}
主要工作都由它的父类Sprite做了,给出一幅图像,这个图像是用PNG格式提供的,大家可能留意到不是一幅单一的图像,而是有点象帧动画中的几个关键帧,不错,的确如此,构造方法中的后两个参数就是告诉Sprite如何分割这幅图像的。这里整个Player共有6个关键帧,比较粗糙,呵呵,自己动手截屏做的:)
Field step是用来控制主角的移动步伐的,为了快一点,取了它身宽的一半。
接下来我们看看如何移动它,就是通过这样两个方法来左移和右移。
public void left() {
prevFrame();
if( (getX() - step) >= -12 ) {
move( -1 * step, 0);
}
}
public void right () {
nextFrame();
if((getX() + step) < canvas.getWidth()) {
move(step, 0);
}
}
留意一下,这里只管相对位移,主角的开始位置通过setPosition来设定,在运动过程中最好就不要直接设置位置了,增大计算量,要不就看起来动作不自然了。
接下来简单说一下配角--球。球的构造跟主角类似,只是为了节省构造销毁对象带来的开销,这个对象是一直存在的,也就是让它掉下去了又自己起来,并根据记分来确定下落速度,简单地用线程实现的,没怎么仔细设计,大家看看代码就清楚了。
再来看看CanvasGetBall这个类,它从GameCanvas继承,并实现了CommandListener和Runnable两个接口,是整个游戏中最复杂的一个类了,主要工作有如下几个部分,实例化主角,配角对象,还有背景对象,音乐等,并在适当的时候画出这些对象,在顶部画出些状态信息,并根据玩家操作开始和暂停游戏,并显示相应画面。并通过进行碰撞检测来判定玩家是否接到了小球。