J2ME中文教程.doc

上传人:M****1 文档编号:563719810 上传时间:2024-03-14 格式:DOC 页数:38 大小:336KB
返回 下载 相关 举报
J2ME中文教程.doc_第1页
第1页 / 共38页
J2ME中文教程.doc_第2页
第2页 / 共38页
J2ME中文教程.doc_第3页
第3页 / 共38页
J2ME中文教程.doc_第4页
第4页 / 共38页
J2ME中文教程.doc_第5页
第5页 / 共38页
点击查看更多>>
资源描述

《J2ME中文教程.doc》由会员分享,可在线阅读,更多相关《J2ME中文教程.doc(38页珍藏版)》请在金锄头文库上搜索。

1、J2ME中文教程(6)GAMEAPI第6章 GAME API6.1 游戏API简介6.2 GameCanvas的使用6.2.1 绘图6.2.2 键盘6.3 Sprite的使用6.3.1 Sprite帧6.3.2 帧序列6.3.3 Reference Pixel6.3.4 Sprite的变换6.3.5 绘制Sprite6.3.6 碰撞检测6.4 Layer的使用6.4.1 TiledLayer6.4.2 LayerManager6.5 一个示例6.6 小结6.1 游戏API简介MIDP 2.0相对于1.0来说,最大的变化就是新添加了用于支持游戏的API,它们被放在javax.microediti

2、on.lcdui.game包中。游戏API包提供了一系列针对无线设备的游戏开发类。由于无线设备仅有有限的计算能力,因此许多API的目的在于提高Java游戏的性能,并且把原来很多需要手动编写的代码如屏幕双缓冲、图像剪裁等都交给API间接调用本地代码来实现。各厂家有相当大的自由来优化它们。游戏API使用了MIDP的低级图形类接口(Graphics,Image,等等)。整个game包仅有5个Class:GameCanvas这个类是LCDUI的Canvas类的子类,为游戏提供了基本的“屏幕”功能。除了从Canvas继承下来的方法外,这个类还提供了游戏专用的功能,如查询当前游戏键状态的能力,同步图像输出

3、;这些功能简化了游戏开发并提高了性能。LayerLayer类代表游戏中的一个可视化元素,例如Sprite或TiledLayer是它的子类;这个抽象类搭好了层(Layer)的基本框架并提供了一些基本的属性,如位置,大小,可视与否。出于优化的考虑,不允许直接产生Layer的子类(不能包外继承)。LayerManager对于有着许多Layer的游戏而言,LayerManager通过实现分层次的自动渲染,从而简化了游戏开发。它允许开发者设置一个可视窗口(View Window),表示用户在游戏中可见的窗口; LayerManager自动渲染游戏中的Layer,从而实现期望的视图效果。SpriteSpr

4、ite又称“精灵”,也是一种Layer,可以显示一帧或多帧的连续图像。但所有的帧都是相同大小的,并且由一个Image对象提供。Sprite通过循环显示每一帧,可以实现任意顺序的动画;Sprite类还提供了许多变换(翻转和旋转)模式和碰撞检测方法,能大大简化游戏逻辑的实现。TiledLayerTiledLayer又称“砖块”,这个类允许开发者在不必使用非常大的Image对象的情况下创建一个大的图像内容。TiledLayer有许多单元格构成,每个单元格能显示由一个单一Image对象提供的一组贴图中的某一个贴图。单元格也能被动画贴图填充,动画贴图的内容能非常迅速地变化;这个功能对于动画显示非常大的一

5、组单元格非常有用,例如一个充满水的动态区域。 在游戏中,某些方法如果改变了Layer,LayerManager,Sprite和TiledLayer对象的状态,通常并不能立刻显示出视觉变化。因为这些状态仅仅存储在对象里,只有当随后调用我们自己的paint()方法时才会更新显示。这种模式非常适合游戏程序,因为在一个游戏循环中,一些对象的状态会更新,在每个循环的最后,整个屏幕才会被重绘。基于轮询也是现在视频游戏的基本结构。6.2 GameCanvas的使用GameCanvas类提供了基本的游戏用户接口。除了从Canvas继承下来的特性(命令,输入事件等)以外,它还提供了专门针对游戏的功能,比如后备屏

6、幕缓冲和键盘状态查询的能力。每个GameCanvas实例都会有一个为之创建的专用的缓冲区。因为每个GameCanvas实例都会有一个唯一的缓冲区。可以从GameCanvas实例获得其对应的Graphics对象,而且,只有对Graphics对象操作,才会修改缓冲区的内容。外部资源如其他的MIDlet或者系统级的通知都不会导致缓冲区内容被修改。该缓冲区在初始化时被填充为白色。缓冲区大小被设置为GameCanvas的最大尺度。然而,当请求填充时,可被填充的区域大小会受限于当前GameCanvas的尺度,一个存在的Ticker,Command等等都会影响到GameCanvas的大小。GameCanva

7、s的当前大小可以通过调用getWidth和getHeight获得。一个游戏可能提供自己的线程来运行游戏循环。一个典型的循环将检查输入,实现游戏逻辑,然后渲染更新后的用户界面。以下代码演示了一个典型的游戏循环的结构:/ 从后备屏幕缓冲获得Graphics对象Graphics g = getGraphics();while (true) / 检查用户输入并更新位置,如果有需要 int keyState = getKeyStates(); if (keyState & LEFT_PRESSED) != 0) sprite.move(-1, 0); else if (keyState & RIGHT_

8、PRESSED) != 0) sprite.move(1, 0); / 将背景清除成白色 g.setColor(0xFFFFFF); g.fillRect(0,0,getWidth(), getHeig ht(); / 绘制Sprite(精灵) sprite.paint(g); / 输出后备缓冲区的内容 flushGraphics();6.2.1 绘图要创建一个新的GameCanvas实例,只能通过继承并调用父类的构造函数:protected GameCanvas(booleansuppressKeyEvents),这将使为GameCanvas准备的一个新的缓冲区也被创建并在初始化时被填充为白

9、色。为了在GameCanvas上绘图,首先要获得Graphics对象来渲染GameCanvas:protected Graphics getGraphics()返回的Graphics对象将用于渲染属于这个GameCanvas的后备屏幕缓冲区(off-screen buffer)。 但是渲染结果不会立刻显示出来,直到调用flushGraphics()方法;输出缓冲区的内容也不会改变缓冲区的内容,即输出操作不会清除缓冲区的像素。每次调用这个方法时,都会创建一个新的Graphics对象;对于每个GameCanvas实例,获得的多个Graphics对象都将渲染同一个后备屏幕缓冲区。因此,有必要在游戏启

10、动前获得并存储Graphics对象,以便游戏运行时能反复使用。刚创建的Graphics对象有以下属性:l 渲染目标是这个GameCanvas的缓冲区;l 渲染区域覆盖整个缓冲区;l 当前颜色是黑色(black);l 字体和调用Font.getDefaultFont()返回的相同;l 绘图模式为SOLID;l 坐标系统的原点定位在缓冲区的左上角。在完成了绘图操作后,可以使用flushGraphics()方法将后备屏幕缓冲区的内容输出到显示屏上。输出区域的大小与GameCanv as的大小相同。输出操作不会改变后备屏幕缓冲区的内容。这个方法会直到输出操作完成后才返回,因此,当这个方法返回时,应用程

11、序可以立刻对缓冲区进行下一帧的渲染。 如果GameCanvas当前没有被显示,或者系统忙而不能执行输出请求,这个方法不做任何事就立刻返回。6.2.2 键盘如果需要,开发者可以随时调用getKeyStates方法来查询键的状态。getKeyStates()获取游戏的物理键状态。返回值的每个比特位都表示设备上的一个特定的键。如果一个键对应的比特位的值为1,表示该键当前被按下,或者自上次调用此方法后到现在,至少被按下过一次。如果一个键对应的比特位的值为0,表示该键当前未被按下,并且自上次调用此方法后到现在从未被按下过。这种“闭锁行为(latching behavior)”保证一个快速的按键和释放总是

12、能够在游戏循环中被捕获,不管循环有多慢。下面是获取游戏按键的示例: / 获得键的状态并存储 int keyState = getKeyStates(); if (keyState & LEFT_KEY) != 0) positionX-; else if (keyState & RIGHT_KEY) != 0) positionX+; 调用这个方法的副作用是不能及时清除过期的状态。在一个getKeyStates调用后如果紧接着另一个调用,键的当前状态将取决于系统是否已经清除了上一次调用后的结果。某些设备可能无法直接访问键盘硬件,因此,这个方法可能是通过监视键的按下和释放事件来实现的,这会导致g

13、etKeyStates可能滞后于当前物理键的状态,因为时延取决于每个设备的性能。某些设备还可能没有探测多个键同时按下的能力。请注意,除非GameCanvas当前可见(通过调用Displayable.isShown()方法),否则此方法返回0。一旦GameCanvas变为可见,将初始化所有键为未按下状态(0)。6.3 Sprite的使用Sprite是一个基本的可视元素,可以用存储在图像中的一帧或多帧来渲染它;轮流显示不同的帧可以令Sprite实现动画。翻转和旋转等几种变换方式也能应用于Sprite使之外观改变。作为Layer子类,Sprite的位置可以改变,并且还能设置其可视与否。6.3.1 S

14、prite帧用于渲染Sprite的原始帧由一个单独的Image对象提供,此Image可以是可变的,也可以是不可变的。如果使用多帧,图像将按照指定的宽度和高度被切割成一系列相同大小的帧。正如下图所示,同一序列的帧可以以不同的排列存储,这取决于游戏开发者是否方便开发。每一帧都被赋予一个唯一的索引号。左上角的帧被赋予索引号0。余下的帧按照行的顺序索引号依次递增(索引号从第一行开始,接着是第二行,以此类推)。getRawFrameCount()方法返回所有原始帧的总数。 6.3.2 帧序列Sprite的帧序列定义了帧以什么样的顺序来显示。缺省的帧序列就是所有可用帧的顺序排列,因此,帧序列和对应的帧的索引号是一致的。这表示缺省的帧序列的长度和所有原始帧的总数是相等的。例如,如果一个Sprite有4帧,缺省的帧序列为0, 1, 2, 3。可以使用setFrameSequence(intsequence)来为Sprite设置帧序列。当调用此方法时,将会复制sequence数组;因此,随后对参数sequence数组进行的任何更改均不会影响Sprite的帧序列。传入null将使Sprite的帧序列重置为缺省值。开发者必须在帧序列中手动切换当前帧。可以调用setFrame(int),prevFrame()或者nextFrame()方法来完成。注意,这些方法是针对帧序列操作,而不是对帧的索引

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号