谁说Java不适合写游戏?

In the mood of java...

JME 3 入门教程 4 - Hello Update Loop

上一节: Hello Assets,下一节: Hello Input System

您已经知道如何加载3D模型等资源了,您想要真正地让游戏跑起来。本节教程,我们将关注更新循环(update loop)。游戏的动态内容都是在更新循环中产生的。

样例代码

package jme3test.helloworld;

 

import com.jme3.app.SimpleApplication;

import com.jme3.material.Material;

import com.jme3.math.ColorRGBA;

import com.jme3.math.Vector3f;

import com.jme3.scene.Geometry;

import com.jme3.scene.shape.Box;

 

/** Sample 4 - how to trigger repeating actions from the main update loop.

 * In this example, we make the player character rotate. */

public class HelloLoop extends SimpleApplication {

 

    public static void main(String[] args){

        HelloLoop app = new HelloLoop();

        app.start();

    }

 

    protected Geometry player;

 

    @Override

    public void simpleInitApp() {

 

        Box b = new Box(Vector3f.ZERO, 1, 1, 1);

        player = new Geometry("blue cube", b);

        Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");

        mat.setColor("Color", ColorRGBA.Blue);

        player.setMaterial(mat);

        rootNode.attachChild(player);

    }

 

    /* This is the update loop */

    @Override

    public void simpleUpdate(float tpf) {

        // make the player rotate

        player.rotate(0, 2*tpf, 0);

    }

}

生成并运行此文件,您将看到一个不停旋转的立方体。

理解代码

与之前的样例代码相比,您会注意到Geometry类型对象player成为了一个成员。这是因为在update loop中需要访问这个Geometry,并对其进行变换。正如您所看到的,我们在simpleInitApp()方法中初始化了这个对象。

现在,让我们仔细研究一下simpleUpdate() 方法中的update loop。

  •  player.rotate(0, 2*tpf, 0);这一句改变了player对象的旋转角度。
  • 我们使用 tpf (times per frame,次每帧)变量根据fps设置旋转速度。 这意味着立方体即使在速度更快的机器上也保持同样的速度,游戏可玩性得到保证。

The Update Loop更新循环

旋转物体的例子十分简单。在update loop中,您可以更新生命值,检测碰撞,让敌人计算下一步动作,随机决定是否设置陷阱,播放随机环境音效,等等。

  • 当 simpleInitApp()方法设置了场景图和状态变量后,update loop开始运行。
  • JME会以最快的速度反复执行simpleUpdate() 方法。
  1. 利用loop遍历游戏状态,启动动作。
  2. 利用loop触发反应,更新游戏状态。
  3. 慎用update loop,在loop中加入过多的调用会降低游戏速度。

练习

这里有些有趣的东西可以试一试:

  1. 如果给rotate()方法赋一个负值,会出现什么情况?
  2. 您能否创建两个挨在一起的模型,并让其中一个的旋转速度是另外一个的两倍?(利用tpf) 
  3. 您能否让立方体“脉动”起来?(像心脏一样搏动,时而膨胀,时而缩小)
  4. 您能够让一个立方体滚动起来?(绕x轴自旋,并沿着z轴位移)

如果您回忆不起来放缩,位移和旋转的变换方法,请回顾 Hello Node教程。 

小结

您正在学习的是update loop,它是游戏的“脉搏”,您可以在其中加入各种动态内容。

除此外,游戏还需要交互! 请继续学习怎样响应用户输入。 


另请参阅:资深 jME3开发者还会用到应用程序状态Application States)和自定义控件Custom Controls),以实现更为复杂的游戏循环机制。在您进一步学习高级文档时会遇到这些主题。

 

posted on 2012-02-03 15:51  sailingbird  阅读(664)  评论(0编辑  收藏  举报

导航