科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道用Game API制作二维动作游戏

用Game API制作二维动作游戏

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

MIDP 2.0的Game API函数提供了一个简化二维动作游戏开发的构架。IDP 2.0里面包括一个用来简化编写二维游戏的API函数。

作者:wawa 来源:cnjm  2007年9月4日

关键字: Game API 二维 游戏

  • 评论
  • 分享微博
  • 分享邮件

在本页阅读全文(共2页)

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函数使你能够用图层来建立场景。你可以做一个城市的背景图层,另外再做一个含有一辆小汽车的图层。将小汽车图层放在背景上,你就创造出了一个完整的场景。把小汽车放在一个单独的图层中,可以很容易的熟练操控它,而不受背景和其他图层的影响。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章