idp 2.0里面包括一个用来简化编写二维游戏的api函数。这个api函数是非常简凑的,只包括javax.microedition.lcdui.game包里的五个类。这五个类主要提供了两个重要的功能:
1、新的gamecanvas类使得在一个游戏循环体内画一个screen和响应键盘输入成为可能,而不需要调用系统的paint和input线程。
2、功能强大而复杂的图层(layer)api函数可以轻松高效地建立复杂的场景。
mutank example
利用gamecanvas类创建一个游戏循环(game loop)
gamecanvas类是附加了功能的canvas类,它提供了立即重画和检查设备按键状态的方法。这些新的方法把一个游戏的所有函数(功能)封装在一个循环体内,并由一个单线程进行控制。为什么这样做就非常吸引人呢?先让我们考虑一下你是如何执行一个使用了canvas类的典型游戏的:
| public void microtankcanvas extends canvas implements runnable { public void run() { while (true) { // update the game state. repaint(); // delay one time step. } } public void paint(graphics g) { // painting code goes here. } protected void keypressed(int keycode) { // respond to key presses here. } } |
这不是一个美丽的画面 。运行在应用程序线程中的run()方法,每一个时间段都会刷新游戏。典型的任务是刷新小球或飞行物的位置,绘制人物或飞行器动画。每一次通过循环体,repaint()方法被用来刷新屏幕。系统把按键事件传送给keypressed(),它能适当地刷新游戏状态。
问题是,每样东西都在不同的线程里,游戏代码在以上三种不同方法里传递很容易混淆。当run()方法里的主动画循环体调用repaint()方法时,将没有办法确切知道系统什么时候调用paint()方法。当系统调用keypressed()时,也没有办法知道程序的另一部分正在进行什么。如果你keypressed()中的代码将要刷新游戏的状态,而同一时刻paint()方法将表现屏幕,这时屏幕将会持续非常奇怪的状态。如果表现屏幕所用时间超过一个单时间段,动画会看起来颠簸不定或是很奇怪。
gamecanvas类允许你避开常用绘画(painting)和按键消息(key-event)机制,所以所有的游戏逻辑都可以被包括在一个单循环中。首先,gamecanvas类允许你用getgraphics()方法直接访问graphics对象。对于所返回的graphics对象的任何表现(rendering)都可以通过屏幕外缓冲区(offscreen buffer)来实现。你可以用flushgraphics()复制缓冲区到屏幕上,直到屏幕被刷新才会返回。这种方式给你提供比调用repaint()方法更完善的控制。repaint()方法会立即返回值,以至于你的应用程序不能确定系统什么时候会调用paint()来刷新屏幕。
gamecanvas类也包含一个用来获得设备按键当前状态的方法,即所谓得polling技术。你可以通过调用gamecanvas类的getkeystates()方法,马上确定哪一个按键被按下,从而取代了等待系统调用keypressed()方法。
下面是一个使用gamecanvas类的典型的游戏循环体:
| public void microtankcanvas extends gamecanvas implements runnable { public void run() { graphics g = getgraphics(); while (true) { // update the game state. int keystate = getkeystates(); // respond to key presses here. // painting code goes here. flushgraphics(); // delay one time step. } } } |
接下来的例子描述了一个基本的游戏循环体。它向你展现了一个旋转的“x”,你可以用方向键在屏幕上移动它。这里的run()方法特别的瘦小,这要多亏了gamecanvas。
import javax.microedition.lcdui.*; public class simplegamecanvas |
本文所举示例的代码包括一个使用了这个canvas的midlet。你可以尝试着运行simplegamemidlet这个小程序,看看它是怎样工作的。你将会看到一个像正在做健身操的海星的东西(或许它正在寻找自己失掉的腿)。
simplegamemidlet screen shot
游戏场景就像是洋葱(有层次)
典型的二维动作游戏常包含一个背景和若干动画人物。尽管你可以自己来描绘出这种场景,不过game api函数使你能够用图层来建立场景。你可以做一个城市的背景图层,另外再做一个含有一辆小汽车的图层。将小汽车图层放在背景上,你就创造出了一个完整的场景。把小汽车放在一个单独的图层中,可以很容易的熟练操控它,而不受背景和其他图层的影响。
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器