网站公告列表

  没有公告

加入收藏
设为首页
联系站长
您现在的位置: 网络学院 >> 程序设计 >> Java编程 >> 文章正文
  使用game api函数制作二维动作游戏(一)            【字体:
使用game api函数制作二维动作游戏(一)
作者:佚名    文章来源:不详    点击数:    更新时间:2007-7-25    

使用Game API函数制作二维动作游戏

 

翻译者:阿麦  hua

原作者:

 

MIDP 2.0里面包括一个用来简化编写二维游戏的API函数。
正在装载数据……
这个API函数是非常简凑的,只包括
javax.microedition.lcdui.game包里的五个类。这五个类主要提供了两个重要的功能:

l        新的GameCanvas类使得在一个游戏循环体内画一个screen和响应键盘输入成为可能,而不需要调用系统的paint和input线程。

l        功能强大而复杂的图层(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 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 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
     用java实现web服务器
     用java快速开发linux gu…
     正则表达式分解siemens交…
     [portal参考手册]目录
     jsp中调用oracle存储过程…
  • JSP中JavaBean的生命周期

  • 快速、简便使用AJAX技术的三…

  • Ant入门-配置和使用     选…

  • ant使用简介

  • java现状----编程使用的语言…

  • Cookie又见Cookie-使用Html…

  • 一个关于Comparator的使用例…

  • javabean+mysql数据库连接池

  • tomcat下配置jspservletbean…

  • 关于JSP的隐式对象的使用(供…

  •   网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    网络学院©2007 www.23book.net
    为您提供web编程,vb编程,vc编程,服务器架设管理,数据库设计等方面的知识 站长:David