![]() |
|
||||||||||||||
| | 网站首页 | 数据库教程 | web编程 | 服务器 | 程序设计 | | ||
|
||
|
||||||
| 使用game api函数制作二维动作游戏(一) | ||||||
作者:佚名 文章来源:不详 点击数: 更新时间:2007-7-25 ![]() |
||||||
|
使用Game API函数制作二维动作游戏 翻译者:阿麦 hua 原作者: MIDP 2.0里面包括一个用来简化编写二维游戏的API函数。 l 新的 l 功能强大而复杂的图层(layer)API函数可以轻松高效地建立复杂的场景。 muTank Example 利用
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 divsses 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 divsses 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_divSSED) != 0) mX = Math.max(0, mX - 1); if ((keyStates & RIGHT_divSSED) != 0) mX = Math.min(getWidth(), mX + 1); if ((keyStates & UP_divSSED) != 0) mY = Math.max(0, mY - 1); if ((keyStates & DOWN_divSSED) != 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(); } } 译者附言:翻译的目的在于开阔视野,培养无线应用程序开发人 员的兴趣和爱好,从而有利于国内无线互联网的发展。译者希望 这篇文章会给广大爱好者与开发者的学习和研发提供帮助。由于 译者专业技术水平和英语水平有限,难免有不当之处,请各位朋 友多多指教。
|
||||||
| 文章录入:admin 责任编辑:admin | ||||||
| 【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 | ||||||
| 网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!) |
| | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 网站公告 | 网站地图 | 管理登录 | | |||
|