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
g
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].采矿技
版权声明:本文标题:深入分析JavaME手机游戏开发中paint方法的应用 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1711651254a603671.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论