选择显示字体大小

用game api制作二维动作游戏(1)

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.*;

import javax.microedition.lcdui.game.*;

public class simplegamecanvas

extends gamecanvas

implements runnable {

private boolean mtrucking;

private long mframedelay;

private int mx, my;

private int mstate;

public simplegamecanvas() {

super(true);

mx = getwidth() / 2;

my = getheight() / 2;

mstate = 0;

mframedelay = 20;

}

public void start() {

mtrucking = true;

thread t = new thread(this);

t.start();

}

public void stop() { mtrucking = false; }

public void run() {

graphics g = getgraphics();

while (mtrucking == true) {

tick();

input();

render(g);

try { thread.sleep(mframedelay); }

catch (interruptedexception ie) {}

}

}

private void tick() {

mstate = (mstate + 1) % 20;

}

private void input() {

int keystates = getkeystates();

if ((keystates & left_pressed) != 0)

mx = math.max(0, mx - 1);

if ((keystates & right_pressed) != 0)

mx = math.min(getwidth(), mx + 1);

if ((keystates & up_pressed) != 0)

my = math.max(0, my - 1);

if ((keystates & down_pressed) != 0)

my = math.min(getheight(), my + 1);

}

private void render(graphics g) {

g.setcolor(0xffffff);

g.fillrect(0, 0, getwidth(), getheight());

g.setcolor(0x0000ff);

g.drawline(mx, my, mx - 10 + mstate, my - 10);

g.drawline(mx, my, mx + 10, my - 10 + mstate);

g.drawline(mx, my, mx + 10 - mstate, my + 10);

g.drawline(mx, my, mx - 10, my + 10 - mstate);

flushgraphics();

}

}

本文所举示例的代码包括一个使用了这个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   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons