MIDP 2.0 开发J2ME游戏起步之二
日期:2007年5月4日 作者: 查看:[大字体 中字体 小字体]-
myCowboy.jump();
}
}
Sprite类的使用Sprite实例(以下简称Sprite)都代表填充了一个图象的图形对象。
仅仅包含一个图象是Sprite和TiledLayer类之间的本质区别,TiledLayer类的实例代表一个由多个可被操作的图象覆盖的区域(Sprite类有其他额外的特征,但每次它操作一个图象而不是用图象填充图形区域是最显而易见的特点)。所以Sprite通常被用来实现小的、活动的游戏对象(比如你的太空船和将与之相撞的小行星),而TiledLayer更多地被用来做活动的背景图形。Sprite一个很酷的特性是,尽管Sprite一次只能表示一个图象,但它能很容易地在不同情景下显示不同的图象,实现由一系列图象构成的动画效果。样例游戏中,牛仔在跑动时有三个不同的姿势图象,在跳跃时还有另外一个。一个给定的Sprite需要的所有图象都应当保存在一个图象文件中(为了找到图象文件被调用的地方,Class.getResource()方法中将图象文件地址以相同的格式作为参数在jar文件中查找)。多帧图象保存在一个简单Image对象中显然让我们感觉轻松不少,因为我们不必操作不同的Image对象以便决定Sprite在一个给定时刻显示哪一个Image对象。风滚草图象文件包含三帧图象,当它们顺序显示时实现了一个滚动的动画效果。
在某一时刻应该选择哪一帧显示,这个很难计算,取决于你的感受。首先,如果你的图象文件包含了多个图象,你要用constructor来构建一个Sprite,定义你计划的Sprite的长度和宽度(用象素)。而Image的长度和宽度应当是你准备传到constructor的长度和宽度参数的整数倍。换句话说,计算机会均匀地将Image分割成若干按你的尺寸定义的矩形。正如前边的例子看到的那样,你可以在它的横向和纵向分别设置子图象,为了方便,你甚至可以在一个多行多列的网格中设置它们。然后,定义各个独立帧,对它们进行编号,顺序是从左上角顶点开始,然后向右,接着是下一行,就象你通常的阅读习惯一样。最后,选择某一帧显示的时候,直接将帧编号作为参数传入并调用setFrame(int sequenceIndex)方法就可以了。
Sprite类有一些为了实现动画效果的附加支持,比如允许你用setFrameSequence(int[] sequence) 方法定义帧的显示顺序。如Listing 5所示,我为牛仔定义了一个帧顺序{1,2,3,2},而风滚草是{0,1,2}(注意对于风滚草,我定义的顺序恰恰是默认的帧顺序,所以不用特意在代码中设置)。要想将活动的Sprite从某一帧移动到下一帧,需要调用nextFrame()(与之相反,可以用prevFrame())。这样处理对类似我的风滚草这样的动画效果显然是很方便的,所有的有效帧都会被用到,而对于牛仔的活动这样处理有点不便,因为只有一个Image或者Images都不在动画的帧顺序之内。这是因为一旦一个帧顺序被设置,传至setFrame(int sequenceIndex) 方法的参数只能表示用于帧顺序的索引,而不是帧本身的索引。那意味着一旦我设置好牛仔的帧顺序{3,2,1,2},如果我调用setFrame(0)方法,将返回帧编号1,setFrame(1)返回2,setFrame(2)返回3,而setFrame(3)返回2。但当牛仔跳起时,我想让它返回0,然而这一帧已经无效了。所以当我的牛仔跳起时,我必须在调用setFrame(0)前设置帧顺序为空(null),然后将帧顺序设置回{1,2,3,2}。Listing 5 jump()和advance(int tickCount,boolean left)方法中显示这个逻辑。
除了通过调用不同的显示帧改变你的Sprite显示外,你也可以通过直接的转换比如旋转或者镜象来展现不同的Sprite。Listing 5 和Listing 6样例中的牛仔和风滚草活动都是可左可右,所以我这里用了镜象转换。
一旦开始镜象转换,你必须首先保存Sprite参考象素的轨迹,因为你转换你的Sprite后,参考象素就是为改变前的象素。你可能以为如果你的Sprite图象是一个正方形,转换后图象将会呆在屏幕中同样的位置。事实不是这样。举例来说明。想象一个面朝左方的站立的人,他的参考象素可以定义为他的脚趾顶端。在旋转90度后,他所处的位置恰好就象他被拌倒向前摔倒后的姿势。很明显,转换后你的参考象素(脚趾顶端)的位置事先已被设置为和以前相同。如果你想让Sprite转换后继续占据屏幕上同样的区域,那么你应当首先调用defineReferencePixel(int x, int y)方法,并且设置你的Sprite参考象素为Sprite中心,正如我在Listing 5中对牛仔的设置那样。(另一个避免Sprite转换后失去位置的技巧是在转换前调用getX()和getY()方法获得Sprite左上角的绝对坐标,然后在转换后调用setPosition()设置左上角坐标为以前的位置。)
搞明白defineReferencePixel(int x, int y) 中引用的坐标与Sprite的顶端角相关,但是传至setRefPixelPosition(int x, int y) 告诉Sprite的参考坐标位置的坐标参数是根据屏幕坐标来的。更准确地说,如果Sprite是直接被绘制到Canvas,则传至setRefPixelPosition(int x, int y) 的坐标参数指的是Canvas的坐标系统,但如果Sprite是被一个LayerManager类绘制,这些参数应该根据LayerManager坐标系来确定。(这些坐标系统如何协调工作在前已有论述,请参考。)
在那些用来设置、获得参考象素或者设置、获得左上角位置象素的方法中,调用的坐标参数指的是对应的Canvas或者LayberManager坐标系上的坐标参数。还有需要注意的是如果你要进行多个转换,稍后的转换应用于它的前一个图象,而不是它的当前状态。换句话说,如果我对某一行应用了两次镜象转换setTransform(TRANS_MIRROR) ,第二次转换并不能将Image转换回最初的位置;它仅仅重复镜象转换的动作。如果你打算将一个转换后的Sprite返回到它转换前的位置,需要调用setTransform(TRANS_NONE) 方法,具体请参考Cowboy.advance(int tickCount, boolean left) 方法的前几行。
Layer类(包括Sprite和TiledLayer)的另一个伟大的特征是支持你用相对距离而不是绝对距离来设置对象位置。如果你的Sprite需要移动3个象素,无论它当前的位置坐标是多少,你只需调用move(int x,int y)方法就可以,而不是与之相反的调用setRefPixelPosition(int x, int y) 方法设置Sprite的新坐标来实现。更有用的是collidesWith()方法,它允许你检测是否一个Sprite抢占了另一个Sprite,或者TiledLayer,甚至Image的区域。这个方法的结果保存了许多比较后获得的参数,很容易看到,特别是当你传递一个象素级参数”true”后,如果他们的不透明象素有重叠之处,它将认为这两个图层发生冲突。
在风滚草游戏中,在所有Sprites向前移动后,我检测了是否牛仔与任何风滚草发生冲突(这发生在被JumpManager.advance(int gameTicks)调用的Cowboy.checkCollision(Tumbleweed tumbleweed)方法中)。当然因为如果当前的风滚草处于不可视状态,校验函数会返回False,所以我可以避免再花时间校验牛仔与这些不可视风滚草的冲突。除此以外,在很多情况下,通过只和可能发生冲突的对象进行校验,你还可以进一步提高程序的效率。注意样例游戏中我没有庸人自绕地检查是否风滚草彼此之间或者检查是否任何对象和背景草丛发生冲突,那显然与游戏无关。在你进行象素级别的冲突检测时,你要保证你的图象有一个透明的背景。(这通常也是很有用的,以避免你的Sprite不会用背景颜色在另一个Sprite或者Image上画一个丑陋的矩形)。
Listing 5 Cowboy.java.
package net.frog_parrot.jump;
import javax.microedition.lcdui.*;
- 上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] 下一页
-
- MIDP 2.0 开发J2ME游戏起步之二 相关文章:
- ·Web2.0在中国步入歧途 缺赢利模式VC有错
- ·C #中的几个线程同步对象方法
- ·简单七步最大限度优化你的博客文章
- ·江民教你五步远离“机器狗”病毒侵扰
- ·加强边界路由器安全防护的几个步骤
- ·教你两步彻底根除系统多余输入法
- ·改进SQL Server数据库系统安全五步走
- ·Photoshop调色 五步搞定军色效果
- ·ASP.NET AJAX中的异步Web Services调用
- ·Office文档打印成为TIFF图形文件的步骤
- MIDP 2.0 开发J2ME游戏起步之二 相关软件
- ·忧郁狐步
- ·《月球漫步》模拟器
- ·《独步武林》
- ·独步天下
- ·NDS《简单DS系列Vol.21 步兵》模拟器
- ·《交易》— 步入权利与欲望的死亡陷阱
- ·《文学散步》
- ·全年龄段言情主义大作《步步惊心》实体书版(全本)
- ·《步非烟作品全集》
- ·与孙子兵法同步思考
- 特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作
- 者.文章版权归文章原始作者所有.对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转
- 载的文章有版权问题请联系编辑人员,我们尽快予以更正. 转载请注明来源:http://www.hackhome.com
精品推荐
热点TOP10
- ·图象处理中的边缘检测------canny算子
- ·EZ-USB 68013A开发指南
- ·数值计算程序大放送-特征值和特征向量
- ·ARM的嵌入式Linux移植体验之BootLoader
- ·Visual C++ ADO数据库编程入门
- ·智能手机Smartphone开发导语
- ·利用 wordXP 实现自动排班
- ·[分形]DLA团簇模型的摸拟
- ·DENX U-Boot及Linux使用手册
- ·Static和Final修饰类属性变量及初始化
- ·BPEL的异常管理
- ·看Vue 5 Esprit函数的节点与链接详情
- ·初学者全面接触学习jquery(译文)
- ·LinQ学习之旅 从整型数组中找出偶数
- ·Enterprise Library 快速入门
- ·CVS源代码库服务器建立和权限配置
- ·Visual FoxPro 9.0 SP2正式版下载
- ·VS2005控件的问题解决办法
- ·Cookie是什么?用法是怎样?与SESSION有什么区别?
- ·J2SE API读取Properties文件的六种方法
