使用J2ME Polish进行游戏编程

                       使用J2ME Polish进行游戏编程
                                        ――优化J2ME Polish的游戏引擎
摘要:
J2ME Polish 游戏引擎为MIDP1.0的设备提供了完备的MIDP2.0游戏API.在这篇文章中,是从Robert Virkus的 Pro J2ME Polish 摘录的.你将学会通过设置各种预处理变量从而优化游戏引擎;在MIDP1.0平台游戏引擎受限的条件下开发以及通过使用低级图形操作,声音重放和设备控制的厂家特殊库,把MIDP2.0的游戏移植到MIDP1.0的平台上.
作者 Robert Virkus

游戏产业是J2ME最大的市场.当你编写J2ME应用 ,很可能你就是在写游戏.游戏是移动Java的一个巨大的成功事例并且属于3G时代,预期移动领域的主要收入来源是游戏,博彩和女士.游戏市场增长的很快,估计2005年世界范围内将达到40亿美元.
Java社区进程网站针对游戏编程发布了更强的MIDP2.0标准,业界已经有所反应.不幸的是,当前主要的手机只是支持MIDP1.0标准.J2ME Polish的游戏引擎出现就是来解决这个问题的.在你学习这个章节时,你可以使用J2ME Polish 的游戏引擎快速地把MIDP2.0的游戏移植到MIDP1.0平台上.
使用该游戏引擎
使用MIDP2.0的游戏API编写游戏是很容易的.你可能使用了视窗的层管理器等等.当你为MIDP1.0开发游戏时,这些特性或许是你非常需要的.这就是为什么J2ME Polish 包含一个包装API,以使得你甚至在MIDP1.0设备上也能使用javax.microedition.lcdui.game.* API.这个游戏引擎使你再MIDP1.0设备上能够使用所有MIDP2.0游戏API.通常,当你使用合适的import声明,源代码是不需要做任何的修改.然而存在一些主要的限制,这些限制要求你调整代码,尤其是你无力使用像素级的冲突检测.此外,也不是所有的MIDP1.0平台支持这种魔法转换.在这片文章的后续章节"在游戏引擎受限下工作"中将讨论如何处理这些限制.
使用这个游戏引擎并不困难.当你移植到MIDP1.0的设备时,J2ME Polish 在你的代码里自动地编写包装类.通过交换import声明就可以完成这项工作.所以,你一定要使用合适的import声明,而不是使用类的全名.清单1展示了你不应该做的事情.
清单1. 不该如何使用游戏引擎
public class MyGameCanvas
extends javax.microedition.lcdui.game.GameCanvas
implements Runnable
{
public MyGameCanvas(boolean supress) {
super(supress);
}
public void run() {
// main game-loop
}
}
当你移植清单1中的代码到MIDP1.0设备上时,该代码将无效.清单2演示了一个有效的例子,它使用了恰当的import声明.
清单2. 通过import语句恰当地使用了游戏引擎
import javax.microedition.lcdui.game.GameCanvas;
public class MyGameCanvas
extends GameCanvas
implements Runnable
{
public MyGameCanvas(boolean supress) {
super(supress);
}
public void run() {
// main game-loop
}
}
优化游戏引擎
通过在你的build.xml文件中的部分定义一些预处理变量,你可以调整游戏引擎.下面是可以达到的优化效果:
使你的游戏达到全屏模式
通过使用反向缓冲和平铺图片可以优化TiledLayer的性能
增加可能平铺图片的数量
通过执行不完善或者慢的游戏API来激活MIDP2.0设备的游戏引擎
全屏模式下运行游戏
通常你可能想在全屏模式下运行游戏.你可以通过在你项目的build.xml里使用元素的fullscreen属性来实现.可取得值为true,false或者menu.menu模式允许你设计菜单,只是你得使用J2ME Polish GUI.
元素的fullscreen属性使得所有的程序都可以在全屏模式下.如果你想在游戏中使用不同的设置,那就通过修改polish.GameCanvas.useFullScreen预处理变量,为GameCanvas定义特性的设置.可取得值仍然是true,false,menu.清单3演示了在你的程序中使用了通常的GameCanvas全屏模式下,如何使用menu.
清单3. 使GameCanvas在全屏模式下




当你在GameCanvas中添加命令是,你需要确保是在menu模式下.menu模式需要你使用J2ME Polish GUI,因此你不能使用paint(Graphics)方法.因为这个方法已经在J2ME Polish GUI内部使用了.
在这种情况下,你可以使用flushGraphics()方法作为替代.如果这也不允许,那你可以为执行paintScreen(Graphics)方法做些预处理而替代paint(Graphics)方法.清单4展示了这些.
清单4. 在全屏模式下使用paintScreen()方法替代paint()
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.lcdui.Graphics;
public class MyGameCanvas
extends GameCanvas
implements Runnable
{
public MyGameCanvas(boolean supress) {
super(supress);
}
public void run() {
// Main game loop
}
//#if polish.usePolishGui && polish.classes.fullscreen:defined && !polish.midp2
//# public void paintScreen( Graphics g )
//#else
public void paint( Graphics g )
//#endif
{
// Implement the paint method
}
}
在TiledLayer中使用反向缓冲
TiledLayer可在屏幕上画多个平铺画面,经常被用来为游戏的背景着色.反向缓冲优化使用了一个内部图像缓冲器,只有当画面修改了才进行重画.全部缓冲被画到屏幕上,而不是分别地画所有的画面.这就能够动态地增加你游戏的速度,尤其是在可见的画面偶尔才改变的情况下.
反向缓冲优化的缺点是使用了更多的内存,并且你不能使用任何透明的画面.因此,在有以下应用时你不能使用反向缓冲优化.
内存受限
TiledLayer没有当作背景使用
同时使用多个TiledLayer
通过把polish.TiledLayer.useBackBuffer预处理变量设置为true,你可以激活反向缓冲优化.通过设置polish.TiledLayer.TransparentTileColor变量为任意整数值,你可以指定背景的颜色.清单5中展示了这些.先前透明的画面被着了色.
清单5. 为TiledLayer激活反向缓冲



把图像分成单个画面
当基本图像被分成单个的画面时,TiledLayer被画出的速度明显加快.与基本的TiledLayer相比,这个优化需要的内存会多些.此外,当设备不支持Nokia的UI API时,传送画面时会有丢失.通过把polish.TiledLayer.splitImage预处理变量设置为true,你可以激活这个优化.清单6展示了这些.
清单6. 为TiledLayer激活分割图像优化


定义TiledLayer的grid类型
每一个TiledLayer都使用一个称作grid的内部数组来存放它所包含的画面的信息.默认情况下,J2ME Polish使用了byte grid 从而明显减少了内存消耗.但是,这也限制了不同的画面的数目最大为128.通过修改polish.TiledLayer.GridType预处理变量,你可以把数组默认的byte类型变为int或者short类型.清单7显示了如何修改为short类型,这样你就可以使用多达32767种不同的画面,这对于大多数移动游戏都是足够的了.
清单7. 支持多达32767种不同的画面

使用MIDP2.0设备的游戏引擎
你也可以在MIDP2.0上使用J2ME Polish 程序.你想这么做或许是因为一些游戏是有漏洞的,或者性能很差.为了能在MIDP2.0上使用这个游戏引擎,把polish.usePolishGameApi设置为true即可.清单8演示了如何做.
清单8. 在特殊的MIDP2.0设备上使用J2ME Polish 游戏引擎


资源
这篇文章取自于 Pro J2ME Polish ,Robert Virkus(Apress,July 2005;ISBN:1590595033);
http://www.apress.com/book/bookDisplay.html bID=431
Java社区进程网站;
http://jcp.org/en/jsr/%20detail id=118
阅读取自于Apress J2ME Games with MIDP2 的"Using the MIDP2.0 Game API",你可以了解更多MIDP2.0,Carol Hamer(JavaWorld,August 2004);
http://jcp.org/en/jsr/%20detail id=118
浏览JavaWorld关于Java 2 Platform, Micro Edition (J2ME)的文章索引,你可以获得更多关于J2ME的文章;
http://www.javaworld.com/channel_content/jw-j2me-index.shtml
浏览JavaWorld关于Development Tools的文章索引,你可以获得更多关于Java开发工具的文章;
http://www.javaworld.com/channel_content/jw-j2me-index.shtml

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值