jMonkeyEngine译文 FlagRush6(1)——控制交通工具

一直很困。。。

 

 

 

 

注:本系列教程全部翻译完之后可能会以PDF的形式发布。

如果有什么错误可以留言或EMAILkakashi9bi@gmail.com给我。

 

jME版本 jME_2.0.1_Stable

开发工具:MyEclipse8.5

操作系统:Window7/Vista

 

 

 

 

 

    控制交通工具

6.1、介绍

这节课我们将改善我们上一次的控制模式。由于我们正驾驶一辆交通工具,我们假设它遵循物理定律,它不应不经加速就移动,或者突然就停下来。

为了做到这个,我们增加一些模仿物理的东西。这将需要一个类保存交通工具的性能,就和传统的InputAction一样。

6.2、增加一个交通工具

         我们将封装所有交通工具的信息到一个单一的类叫Vehicle。这将继承自node,为这个nodescene中移动的方式增加信息。Vehicle类将使用一个Spatial,那将会是个模型来代表我们的玩家。这是一个Spatial,因此允许我们增加NodeTriMesh做为Vehicle

         而定义Vehicle还有一些好处。这允许我们创建具有不同性能的Vehicle。我们可能有一个缓慢、笨重、火力强大的Vehicle,或者是轻便、敏捷、疲弱的Vehicle。当然,没有武器或敌人,在大部分scene都不会选择一个缓慢的Vehicle。这个将在以后改变。

         我决定加入以下属性:

 

属性

描述

Velocity

vehicle当前的速度

Acceleration

vehicle的加速度 (加速的快慢)

Braking

vehicle的减速度 (减速的快慢)

Turn Speed

vehicle转动的速度

Max Speed

能达到的最大速度

Min Speed

能达到的最大负的速度(提供的时候采用正值,但速度将在负值达到它)

Weight

vehicle有多重,通常定义了摩擦力

 

         所以我们最初对Vehicle类的缩减是简单继承Node并为这些值增加gettersetter。我将加入一些public方法,这允许我们去调整速度。

   

    public void accerate(float time){

       velocity = (velocity+=acceleration*time)

               > maxSpeed ? maxSpeed : velocity;

    }

 

         足够简单。我不关心物理的精确性,只是看起来好就行了。减速很像这个:

   

    public void brake(float time){

       velocity = (velocity-=braking*time)

               < -minSpeed ? -minSpeed : velocity;

    }

 

         我接着增加一个漂移(drifting)方法,它将会在每次反向的时候被调用,这个描述了由摩擦力引起Vehicle停下来。在科学天才的尝试下,我决定它由值(weight/2)调整。我不会深入证明这个选择只多么完美只需知道没有什么理由让我选择这个,我只是使用其它不同的值玩了玩。

         我们现在有一个Vehicle类,它描述了一个Node,能被作为汽车一样被运行。现在我们只需把它加载进我们的游戏。这将包含在buildPlayer方法中。

 

    private void buildPlayer() {

        //box 代替

        Box b = new Box("box", new Vector3f(), 0.35f,0.25f,0.5f);

        b.setModelBound(new BoundingBox());

        b.updateModelBound();

 

        //设置Vehicle的属性(这些数字能被认为是单元/ Unit/S

        player = new Vehicle("Player Node",b);

        player.setAcceleration(15);

        player.setBraking(25);

        player.setTurnSpeed(5);

        player.setWeight(25);

        player.setMaxSpeed(25);

        player.setMinSpeed(15);

       

        player.setLocalTranslation(new Vector3f(100,0, 100));

        player.attachChild(b);

        player.updateWorldBound();

        scene.attachChild(player);

        player.setRenderQueueMode(Renderer.QUEUE_OPAQUE);

    }

 

         通常,我设置的值是这样获取的,通过一直玩,一直尝试知道我发现我喜欢它。由于现在player对象需要用到Vehicle中自己定义的方法,而这些方法在父类node中不存在,因此,我们需要修改player定义的那一行:

 

    private Vehicle player;

 

         现在,我们有了自己的vehicle,我们需要控制它。

 

6.3Vehicle.java

 

import com.jme.scene.Node;

import com.jme.scene.Spatial;

/**

 * Vehicle将会是一个node,处理了vehicle在游戏中的移动。

 * 它拥有定义它的加速度acceleration、速度velocity

 * 和减速度barking的参数。

 * 转向速度turnSpeed定义了它有怎样的处理。

 * 而重量weight定义了漂移时的摩擦力,它下降多快等等。

 * @author Mark Powell

 */

 

public class Vehicle extends Node {

   

    private Spatial model;

 

    private float velocity;

    private float maxSpeed = 30;

    private float minSpeed = 10;

   

    private float acceleration;

    private float braking;

   

    private float turnSpeed;

    private float weight;

   

    /**

     * 基础构造方法,获取模型作为vehicle的外观

     * @param id vehicleid

     * @param model 表达vehicle绘图外观的模型

     */

    public Vehicle(String id, Spatial model){

       super(id);

       setModel(model);

    }

   

    /**

     * 构造方法,获取模型作为vehicle的外观

     * @param id vehicleid

     * @param model 表达vehicle绘图外观的模型

     * @param maxSpeed vehicle能达到的最大速度(Unit/Sec)

     * @param minSpeed vehicle的反向最大速度(Unit/Sec)

     * @param accerlation vehicle多快能达到最大速度

     * @param braking vehicle减速的速度以及按多久反向

     * @param weight vehicle的重量

     * @param turnSpeed vehicle转向转得多块

     */

    public Vehicle(String id,Spatial model,

           float maxSpeed, float minSpeed,

           float accerlation, float braking,

           float weight, float turnSpeed){

       super(id);

       setModel(model);

       this.maxSpeed     = maxSpeed;

       this.minSpeed     = minSpeed;

       this.acceleration    = acceleration;

       this.braking      = braking;

       this.weight       = weight;

       this.turnSpeed       = turnSpeed;

    }

   

    public Spatial getModel() {

       return model;

    }

    public void setModel(Spatial model) {

       this.detachChild(this.model);

       this.model = model;

       this.attachChild(this.model);

    }

    public float getVelocity() {

       return velocity;

    }

    public void setVelocity(float velocity) {

       this.velocity = velocity;

    }

    public float getMaxSpeed() {

       return maxSpeed;

    }

    public void setMaxSpeed(float maxSpeed) {

       this.maxSpeed = maxSpeed;

    }

    public float getMinSpeed() {

       return minSpeed;

    }

    public void setMinSpeed(float minSpeed) {

       this.minSpeed = minSpeed;

    }

    public float getAcceleration() {

       return acceleration;

    }

    public void setAcceleration(float acceleration) {

       this.acceleration = acceleration;

    }

    public float getBraking() {

       return braking;

    }

    public void setBraking(float braking) {

       this.braking = braking;

    }

    public float getTurnSpeed() {

       return turnSpeed;

    }

    public void setTurnSpeed(float turnSpeed) {

       this.turnSpeed = turnSpeed;

    }

    public float getWeight() {

       return weight;

    }

    public void setWeight(float weight) {

       this.weight = weight;

    }

   

    public void accerate(float time){

       velocity = (velocity+=acceleration*time)

               > maxSpeed ? maxSpeed : velocity;

    }

   

    public void brake(float time){

       velocity = (velocity-=braking*time)

               < -minSpeed ? -minSpeed : velocity;

    }

 

    public void drift(float time) {

       velocity = velocity < 0 ?

                  (velocity += ((weight/5) * time)):

                  (velocity -= ((weight/5) * time));

    }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值