admin 管理员组

文章数量: 1184232


2024年3月29日发(作者:db2数据库实例名怎么查看)

SILICoN 

LLEY鞭霸 【技术应用】 

深入分 ̄JavaME手机游戏开发中paint方法的应用 

宋婷婷 

(福建农林人学软件工程学院福建福州350002) 

摘要: 在JavaMe的MIDP2.0版本中新增Game(游戏开发)包,在包中的每个类都拥有paint方法,由于各类的paint方法在使用过程中极易混淆,详细阐述和 

分析pai nt方法在每个游戏开发类中的作用和使用方式。 

关键词:JavaMe;手机游戏;paint 

中图分类号:TP3文献标识码:A文章编号:1671--7597(2010)1020154一O2 

1 Game包简介 以上每个类都包含有paint方法,该方法在GameCanvas类的父类 

JavaMe开发框架由Configuration(配置)和Profi 1e(简表)组成, 

Canvas中就是一个不可或缺的实现屏幕绘画的方法,由于该方法的特殊 

在手机程序开发中使用了CLDC(有限连接设备配置)并在此基础上建立了 

性,我们将在以下部分详细阐述该方法在各个类中的作用和使用,以利于 

Ⅺil)P(移动信息设备简表)。 

Java手机开发人员能够自如的使用该方法。 

在JavaMe:]-:机开发的早期,简表使用MIDP1.0版本,为了让程序开发 

2 GameCanvas类的paint方法 

人员有能力控制手机屏幕的外观和操作,需要使用大量的低级界面开发模 

2 1 Canvas类的pa i nt方法 

爻,尤其在游戏程序中,几乎完全依赖低级界面开发的Canvas抽象类进行 

在低级界面屏幕Canvas抽象类中,其唯一的抽象方法是: 

’。。。’’。’ 。’’ … ’一 。‘ ‘。。。 。。’。。。。。。。。。。。。  。。 。。。’。 ‘。。。 。。。。。 。一 

绘图操作,j ̄Canvas类的绘图只能写在paint方法里。 

 ̄IIDP在2.0以后新增了game包,即javax.microedition.1cdui.game 

I pr。tected abstract v。id paint(Graphics g)I 

包,给游戏开发提供了极大的方便,这个包中包含了五个游戏类,分别 

也就是所有继承Canvas类的子类都必须实现该方法。 

是:GameCanvas(游戏画布)类、Layer(图层)类、Sprite(精灵)类、 在paint方法中传入了GraphiCS类对象g,具体的绘画操作都由对象 

TiledLayer(背景图层)类和LayerManager(图层管理器)类。 

g实现,可见Canvas类与Graphics类之间的关系就是画布与画笔的关系。 

这些类的增加不仅降低了游戏开发过程中错误出现的几率,也使游戏 (我们将不对Canvas类进行深入的阐述,本文的重点是MIDP2.O的新 

代码更精悍,游戏的专属特性诸如地图绘制、人物动态显示、碰撞检测、 

增的游戏开发包的内容。) 

图层控制等都能够在移动设备上得到最大程度的显现。 2.2 GameCanvas类的pa i nt方法 . 

这几个类之间的关系如图一: 

GameCanvas类是Canvas类的子类,它重写了父类的paint方法: 

protected void paint(Graphics g); 

由于GameCanvas类本身就拥有屏幕缓冲,因此其绘图方式与Canvas类 

不同,它通过getGraphics方法获得屏幕显示的控制权,因此无需通过实现 

paint方法实现屏幕显示。以下的例子是在屏幕上显示一个位于屏幕中央 

30*30的红色正方形,使用GameCanvas类实现,其代码如下: 

图1 game包中的类关系图 

从上图可知,GameCanvas类继承了低级界面Canvas类,LayerManager 

类和Layer类则直接继承自Object类,而Layer类还有二个游戏开发最重要 

的子类:Sprite类和TiledLayer类。在此我们简要说明一下每个类的作用 

在上面的绘图过程中,整个图像显示过程没有调用 ̄rJpaint0方法。 

以便于深入探讨各个类的paint方法: 

在GameCanvas中,paint()方法没有在Canvas电那么重要,可以被其它方法 

i)GameCanvas类:提供了游戏基本接口的抽象类。 

取代,这是因为在GameCanvas中,对图形的操作首先发生在屏幕缓冲区 

2)Layer类:提供了游戏可视元素的抽象类,每个图层的位置、宽度 

中,这一部分的操作可以位于构造函数或任何方法内,而屏幕缓冲区的显 

和高度以及可见性都包含在了该类中。 

示只需要一句语句即可实现,可以在任何地方调用,因此在GameCanvas 

3)Sprite类:该类继承自Layer类,主要用来实现游戏中的人物动 

中,paint方法不再受到重视。 

画、移动和碰撞检测,是用于存储多帧图片的基本可视化元素。 3 Layer类及其二个子类的paint方法 

4)TiledLayer类:该类继承自Layer类,主要是使用图片来平铺屏幕 

在Layer抽象类中定义了一个抽象的paint方法: 

的背景,使用大幅图片做游戏背景虽然简单但是需占用相当大的内存空 

。。。。。。。。。。。‘。 。。。。。。。’。。。。。。 。‘ —。。。。。。。。。。。。。。。 ’ 。。。。。。。。。。。。。。。 ’ ’ ‘ 。’。。。。。。。。。。。 ‘ ’。。。。。。。。。。。。。。。。 ’ 。。。。。。。。。~ 

间。 

}public abstract void paint(Graphics g)  I

L...... — —.. .............., ................ . —.--- ........., ————--------------- -----------------・—-----------一 

5)LayerManager类:该类提供了对整体游戏画面图层的管理和控 

其二个子类Sprite和TiledLayer类均重写了这个paint方法并声明为 

制。 

final,不允许再被重写。 

口匮 

【技术应用l 

G r p l S f 

p.1 a r U S 

疆一 

.1 hC  t h e G . r 

: 

S p a 

J 

的工作量而且容易出错。新增的LayerManager类(图层管理器)就是用来 

管理多个图层并把这些图层组合起来同时显示在屏幕上。 

LayerManager类的使用非常简单,使用构造函数创建LayerManager类 

对象后,使用append方法逐一添加图层。事实上,LayerManager类维护着 

.1 h na .1 p 

Sprite实现的功能类似于电影的胶片的功能,它们都是由一幅幅小的 

= t C 

(S 

ht )g() 

图片(帧)组合而成,Sprite类提供了将一幅完整图片进行分割的功能, 

分割后的小图片会被分配一个整数作为分割后的图片序号(索引号)。在 

S 

g 

显示的时候,Sprite自动根据设定的高度、宽度将大的image图片对象切成 

e 

个所有图层的z序索引值,z序索引值决定了这些图层的前后位置。所谓 

z序索引值 ̄MIDP坐标系的z轴,每个图层都在z轴排列,图层的顺序依靠索 

引号维系,索引号为0的图层最接近用户,索引号越大的图层离用户越远。 

因此使用append方法时越早添加的图层,其索引号越小,越接近用户,最 

早添加的图层就显示在屏幕的最前面。然后通过LayerManager类对象调用 

paint 0方法来将LayerManager管理的各个图层按照各图层的z序索引值依 

次绘制在屏幕上。常见代码如下: 

等大小的各帧图像。 Sprite会对image中用于形成帧的图像指定一个唯一 

G 

r 

C 

的索引值,此索引值的指定按照行顺序指定,即第一行的第一幅小图片索 

p 

a 

n 

C 

引值为0,然后向右逐渐增大,然后转下一行。Sprite实际上是使用一个大 

的图像作为其各帧图像的来源,通过将大的图像矩形分割,形成小的与各 

S 

 

,L

、J

 

帧大小相同的图像。通过组合这些小图像的顺序即可形成特定的动画。 

通过paint方法把精灵的小图片显示在屏幕上,常用代码如下: 

通常精灵的动画显示是放在线程中执行的,使用nextFrame0方法显 

示下一帧图片,然后根据场景要求重新设置精灵位置再通过调用paint方法 

将其显示在屏幕上。 

TiledLayer与Sprite很类似,只是在Sprite中小图像是用作帧的图 

像,然后一帧帧显示出来形成动画。而在TiledLayer中,各小的图像是用 

于拼图形成一大的图像,形成游戏背景,然后通过调用TiledLayer类的 

paint方法将其渲染在屏幕上。 

在图层管理器中,paint方法是将图层按照添加的先后顺序依次渲染 

在屏幕上,越靠近用户的越要先添加。通常精灵动画总是最靠近用户,背 

景对象总是位于精灵的后面,因此总是要先添加精灵对象。而在之前我们 

的讨论中,在没有使用图层管理器的情况下,我们必须先渲染背景,然后 

才能渲染精灵。因此使用paint方法在不同的类中应认真加以区分使用。 

5总结 

应该注意的是,上述的方式仅仅是在屏幕上单独显示一个精灵或者一 

个背景的情况下实现的,而游戏的每个场景总是一个或多个的背景和精灵 

的合成,那么此时就应该特别注意不同类之间paint方法的使用顺序(在不 

在MIDP2.0R增的游戏开发包javax.microedition.1cdui.game中,由 

于包中的每个类都包含paint方法,为避免开发人员在开发过程中混淆 

paint方法的使用,本文在阐述paint方法的基础上对该方法进行如下总 

结: 

使用LayerManager情况下)。 

游戏中精灵层总是在背景层的前面,以确保精灵动画能够在特定背景 

下实现,因此当我们构建好精灵和背景层后,需要将这些图层全部显示在 

屏幕上时,我们总是要先渲染背景层,然后再逐一渲染每个精灵,因此背 

景层对象必须先调用TiledLayer类的paint方法进行渲染,然后再通过不同 

精灵对象调用Sprite类的paint方法,代码如下: 

1)GameCanvas类的paint方法不使用; 

2)Layer类的paint方法由其二个直接子类重写; 

3)Sprite类的paint方法在没有图层管理器情况下必须使用而且必须 

放在背景对象渲染之后; 

4)TiledLayer类的paint方法在没有图层管理器情况下必须使用而且 

必须放在精灵对象渲染之前; 

5)LayerManager类的paint方法在LayerManager对象建立并添加各图 

层后使用,将各图层按照其添加的z序索引值依次绘制在屏幕上,此时各图 

层对象的paint方法不必使用。 

background.paint(g)://background为Ti ledLayer类对象 

sprite02.paint(g): //精灵对象O2 

sprite01.paint(g): //精灵对象01 

f1ushGraphics 0: 

这顺序是开发人员必须注意的,否则屏幕将不显示精灵对象,因为背景 

对象的最后渲染将所有精灵对象都覆盖了。当我们接下来谈论LayerManager 

类的时候,你会发现这样的顺序关系发生了变化。 

4 LayManager类的paint方法 

在LayerManager类中定义的paint方法如下: 

参考文献: 

[1]Sun Microsystems:(JSR一37)一MIDPI.0 API.http://download.oracle 

Com/docs/cd/E174 01/javame/config/eldc/ref~impl/midp1.0/jsrO37/index. 

Htm1. 

publ ic void paint(Graphics g,int X,int Y) 

该方法与之前其他类的paint方法不同在于它除了提供画笔对象之外 

还提供了二个坐标参数,用于指定所渲染的图层所在显示区域的相对屏幕 

原点的坐标。 

[2]Sun Microsystems:(JSR-118)一MIDP2.0 API.Http://download.oracle. 

Com/docs/cd/E17412 01/javame/config/cldc/ref—impl/midp2.0/jsrl 18/index. 

htm1. 

[3]陈立伟、张克非、黎秀红编著,精通Java手机游戏与应用程序设计, 

个游戏的场景往往需要由多个图层构成复杂的背景,多个精灵的出 

现也处于不同的图层,如果每个图层都由开发人员进行控制势必增加很大 

中国青年出版社,2005. 

[4]郝玉龙、李向前编著,J2ME移动应用开发,清华大学出版社,2006. 

(上接第16O页) 

参考文献: 

[1]王耀和,选矿自动化系统的计算机改造[J].矿业快报,2002,(21) 

[2]李晓岚、曾云南,选矿自动化技术的新进展[J].金属矿山,2006, 

(06). 

术,2009,(01). 

[5]王琨、周源,计算机仿真技术在矿业中的应用[J].矿业工程,2005, 

(04). 

[6】孔新科、马骁,金堆城选矿自动化检测技术生产实践与分析叮].有色 

金属(选矿部分),2003,(06). 

[3]王丰雨、张覃、黄宋魏,我国选矿自动化评述[J].国外金属矿选矿, 

2006,(08). 

[7]何花金、罗开贤,计算机在凡口矿选矿中的应用实践[J].有色金属 

(选矿部分),2004,(02). 

[4]张晓兰、郭飞华,自动化系统在选矿作业的应用与实践[J].采矿技 


本文标签: 图层 方法 游戏 使用 屏幕