用J2ME在移动设备上实现动画(3) (2007-04-11 11:50)

使用Sprite类实现人物动画

  Game API函数里提供的另一个具体的Layer类是Sprite类。一方面,Sprite类是TileLayer类的概念化的逆转.TiledLayer类使用源图像贴片的调色板来创建一幅大场景,而Sprite类则使用一系列源图像帧来产生动画。

  你创建一个Sprite类所需要的只是源图像和每个帧的尺寸。在TiledLayer类里,源图像被分为相同大小的图像贴片;在Sprite类里,子图像被称为帧。在下面的例子里,源图像tank.png用来创建帧大小为32*32像素的Sprite类对象。

private MicroTankSprite createTank() {
Image image = null;
try { image = Image.createImage("/tank.png"); }
catch (IOException ioe) { return null; }

return new MicroTankSprite(image, 32, 32);
}

  源图像里面的每一帧都有一个编号,从0开始,以此累加。(在这里不要糊涂,记住图像贴片的编号才是从1开始的)Sprite类有一个帧序列,它决定了帧显示的顺序。一个新Sprite类对象的缺省帧序列简单地依照可用帧,从0开始累加。

  使用Sprite类的nextFrame()方法和prevFrame()方法,可以把帧在帧序列中向前或向后移动。这些方法把帧序列的头尾连接起来了。例如,如果Sprite类对象已经把位于帧序列末尾的帧显示出来了,若在调用nextFrame()方法将会显示帧序列的头帧。

  调用setFrameSequence()方法,可以通过整型数组所指定的序列来确定不同于缺省时的帧序列。

  你还可以调用setFrame()方法跳至当前帧序列中的某一帧。你不能跳至特定的帧编号处,只能跳至帧序列的特定点。

  利用从Layer类继承下来的paint()方法时,只有在Sprite类在下一个时间段内被表现的时候,帧的变化才真正实现。

  Sprite类还可以变换源帧。可以把帧旋转90度,或做镜像变换,或两者皆有。在Sprite类里的常数枚举了这些可能性。Sprite类的当前变换方式可以通过向setTransform()方法传递这些常数之一进行设定。下面的例子是当前帧绕垂直中心做镜像变换,并旋转90度:

// Sprite sprite = ...
sprite.setTransform(Sprite.TRANS_MIRROR_ROT90);

  应用了变换方式,从而使得Sprite类的参考像素并没有移动。缺省下,Sprite类的参考像素位于Sprite类坐标系里的(0,0)点处,即左上角。当应用了变换方式,参考像素的位置也变换了。Sprite类的位置被调整了,从而参考像素仍然在原位置上。

  你可以通过调用defineReferencePixel()方法来改变参考像素点的位置。对于大多数类型的动画,你可以把参考像素点定义在sprite的中心上。

  最后,Sprite类提供几个collidesWith()方法来检测与其他Sprites,ItledLayers,或Images类对象的碰撞。你可以使用检测矩形(快但粗糙)或者像素级别(慢但精确)来检测碰撞。这些方法的微妙不同是难以描述的;若详细资料,可参看API 文档。

  MuTank例子

  MuTank例子向你说明TiledLayer,SpriteLayerManager类的用法。

  最重要的类是包含大部分代码的MicroTankCanvas类和封装了坦克行为的MicroTankSprite类。
MicroTankSprite
类制作了大量的变换方式。它使用了一个只含3帧的源图像来显示指向16种方向的坦克。Turn()forward()两个公用方法使得坦克很容易控制。

  MicroTankCanvas类是GameCanvas类的子类,它在run()方法里包含一个你应该很熟悉的动画循环体。 Tick()方法用来检测坦克是否碰到隔板上了。如果碰到了,就调用MicroTankCanvas类的undo()方法使它最近一次的运动倒退。Input()方法简单地检测按键是否被按下,并同时调整坦克的方向或位置。Render()方法使用一个LayerManager类对象来对绘画进行处理。LayerManager类包含两个图层,坦克图层和隔板图层。

  从游戏循环体中调用的Debug()方法,用来比较通过游戏循环体所用时间和期望的循环时间(80毫秒),并在屏幕上显示时间的百分比。它仅仅是用作调试诊断目的的,在游戏被发送给用户之前将会被删除。

  游戏循环体的计时比前面的SimpleGameCanvas类更加复杂。为了更精确的每80毫秒就重复一次游戏循环体,MicroTankCanvas类对tick(),input()render()方法所花费时间进行测量。然后停下来花费完80毫秒中的剩余时间,以使得通过每次循环所用的总共时间尽可能的接近于80毫秒。

  总结

  MIDP 2.0Game API函数提供了一个简化二维动作游戏开发的构架。首先,GameCanvas提供了使得游戏循环体紧凑的绘画和输入方法。其次,图层的架构使得创建复杂的场景成为可能。TiledLayer从源图像簇的调色盘中组合了一个大背景或场景。Sprite适合于动画人物,并能检测到在游戏中与其他对象的碰撞。LayerManager把所有的图层粘合在一起。MuTank例子提供了一组基本的工作代码,用来说明Game API函数的使用。

 

 

   上面的介绍是我刚刚接触到j2me的时候找到和总结到的一些东东,在这里贴出来希望大家可以有所帮助.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值