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

原创 2003年06月06日 09:34:00

使用Game API函数制作二维动作游戏<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

翻译者:阿麦  hua

原作者:

 

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

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

l        功能强大而复杂的图层(layer)API函数可以轻松高效地建立复杂的场景。          

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />

        

 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。

 

未完待续…………

译者附言:翻译的目的在于开阔视野,培养无线应用程序开发人

员的兴趣和爱好,从而有于国内无线互联网的发展。译者希望

这篇文章会给广大爱好者与开发者的学习和研发提供帮助。由于

译者专业技术水平和英语水平有限,难免有不当之处,请各位朋

友多多指教。

cocos2d-x 如何制作一个类马里奥的横版平台动作游戏续 2

欢迎回来,上篇我们讲到了物理引擎中重力环境模拟以及主角考拉与地面墙壁的碰撞,相信大家已经对2D世界的物理模拟有了一定的了解,现在我们接着讲如何让考拉动起来吧!       让考拉动起来!...
  • qiou2719
  • qiou2719
  • 2015年01月05日 00:51
  • 2451

Unreal Open Day 2017 参会总结——ACT(动作)游戏制作经验分享

国产游戏 失落之魂 (英文名 Lost Soul Aside ) 是由杨冰先生独自一人花费3年左右的时间开发的一款动作游戏,目前还处于并不完整的demo阶段。前不久杨冰先生在网上上传了一个宣传视频,网...
  • u012999985
  • u012999985
  • 2017年05月01日 17:06
  • 2583

二维指针的使用场景

实际上,指针作为参数,其目的有许多,一般来说,一维指针主要传给函数入参地址,或者通过其改变地址对应的值。而二维指针也比较类似,如果需要修改指针的值,则可以将函数出参修改为二维指针。若需要修改入参地址,...
  • sunjunior
  • sunjunior
  • 2015年04月02日 00:46
  • 1644

二维高斯函数

转至:http://blog.sina.com.cn/s/blog_6e4fdcbd0100qr7b.html
  • ZYTTAE
  • ZYTTAE
  • 2014年11月13日 20:26
  • 6315

cocos2d-x 如何制作一个类马里奥的横版平台动作游戏 1 献给所有对动作游戏有爱的朋友

大家一定很想知道超级马里奥,洛克人这样优秀的横版动作游戏是怎么制作的吧? 本文翻译自国外著名IOS源码教学商业网站raywenderlich 的IOS Game Start Kits三件套之一的Pl...
  • qiou2719
  • qiou2719
  • 2015年01月04日 17:22
  • 2043

游戏设计之我见 —— 动作游戏中的攻防设计

这篇博客介绍了在近战攻击中的攻防设计,通过一些参考资料以及游戏案例来分析一个有趣味性的攻防设计需要注意的点,以一个半吊子的游戏策划的身份...
  • noahzuo
  • noahzuo
  • 2016年05月09日 17:37
  • 1423

C++ 中将二维数组传入函数

C++ 中将二维数组传入函数 主要有三种方式 void fun(int *a[],int m,int n)//**a void fun2(int a[][2],int m)//a[2][2]...
  • hxh129
  • hxh129
  • 2014年04月17日 15:50
  • 2653

函数调用常规二维数组和动态二维数组的差异

博客的内容分为两个部分,第一部分解释了函数调用常规二维数组的格式,主要参照的是《C++ Prime Plus》中的7.4节。第二部分解释了动态二维数组的初始化方法,以及函数调用动态二维数组的格式。...
  • u013698770
  • u013698770
  • 2015年09月06日 14:19
  • 794

不使用PHP内置排序函数对二维数组实现快速排序的面试题

请使用PHP设计一个函数,对学生英语考试得分从高到低排序,输入时所有学生的学号和考试得分,返回排好序的考试得分和对应学生的学号。考试满分为100,得分可能会有小数,由于考试评分要求,小数位只会是0或0...
  • xgm930090280
  • xgm930090280
  • 2017年03月09日 17:03
  • 560

游戏设计之我见 —— 动作游戏中敌人的受击设计

这篇博客结合一些游戏案例,介绍了3D动作游戏中敌人的受伤设计。
  • noahzuo
  • noahzuo
  • 2016年05月14日 16:32
  • 2345
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用Game API函数制作二维动作游戏(一)
举报原因:
原因补充:

(最多只允许输入30个字)