使用Game API函数制作二维动作游戏(一)
2003-06-06 09:34
417 查看
使用Game API函数制作二维动作游戏<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
翻译者:阿麦 hua
原作者:Jonathan Knudsen
MIDP 2.0里面包括一个用来简化编写二维游戏的API函数。这个API函数是非常简凑的,只包括
l 新的
l 功能强大而复杂的图层(layer)API函数可以轻松高效地建立复杂的场景。
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />
muTank Example
利用
这不是一个美丽的画面。运行在应用程序线程中的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。
翻译者:阿麦 hua
原作者:Jonathan Knudsen
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[/code] 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。
未完待续…………译者附言:翻译的目的在于开阔视野,培养无线应用程序开发人员的兴趣和爱好,从而有利于国内无线互联网的发展。译者希望这篇文章会给广大爱好者与开发者的学习和研发提供帮助。由于译者专业技术水平和英语水平有限,难免有不当之处,请各位朋友多多指教。
相关文章推荐
- 使用Game API函数制作二维动作游戏(二)
- 用GameAPI函数制作二维动作游戏
- cocos2d-x 如何制作一个类马里奥的横版平台动作游戏续 2
- 格斗游戏动作设计和制作 攻击受击判定
- (译)如何使用cocos2d制作一个塔防游戏:第三部分
- (译)如何使用cocos2d来制作一个打地鼠的游戏:第一部分
- 如何使用Unity制作一款自己喜欢玩的游戏demo(Unity萌新的进阶技巧)
- (译)碰撞检测和收集物品:如何使用cocos2d制作基于tiled地图的游戏:第二部分
- 如何使用cocos2d和box2d来制作一个Breakout游戏:第一部分
- (译)如何使用GameCenter制作一个简单的多人游戏教程:第一部分
- 15. 如何使用cocos2d制作一个打地鼠的游戏:(第二部分。完)
- cocos2d-x 如何制作一个类马里奥的横版平台动作游戏 1 献给所有对动作游戏有爱的朋友
- (译)如何使用cocos2d制作基于tile地图的游戏教程:第一部分
- 如何使用cocos2d-x3.0制作一个打地鼠的游戏:第一部分
- 如何使用cocos2dx3.0制作基于tilemap的游戏:第一部分
- 基于cocos2dx的横版动作游戏制作(一)
- (译)碰撞检测和收集物品:如何使用cocos2d制作基于tiled地图的游戏:第二部分
- 分享使用Unity制作游戏关卡的教程(2)
- 如何使用Box2D和Cocos2D制作一款像Fruit Ninja一样的游戏
- 使用SpriteBuilder制作Cocos2D游戏完全中文教程(一)