一直很困。。。
注:本系列教程全部翻译完之后可能会以PDF的形式发布。
如果有什么错误可以留言或EMAIL:[email protected]给我。
jME版本 :jME_2.0.1_Stable
开发工具:MyEclipse8.5
操作系统:Window7/Vista
这节课我们将改善我们上一次的控制模式。由于我们正驾驶一辆交通工具,我们假设它遵循物理定律,它不应不经加速就移动,或者突然就停下来。
为了做到这个,我们增加一些模仿物理的东西。这将需要一个类保存交通工具的性能,就和传统的InputAction一样。
我们将封装所有交通工具的信息到一个单一的类叫Vehicle。这将继承自node,为这个node在scene中移动的方式增加信息。Vehicle类将使用一个Spatial,那将会是个模型来代表我们的玩家。这是一个Spatial,因此允许我们增加Node或TriMesh做为Vehicle。
而定义Vehicle还有一些好处。这允许我们创建具有不同性能的Vehicle。我们可能有一个缓慢、笨重、火力强大的Vehicle,或者是轻便、敏捷、疲弱的Vehicle。当然,没有武器或敌人,在大部分scene都不会选择一个缓慢的Vehicle。这个将在以后改变。
我决定加入以下属性:
属性 |
描述 |
Velocity |
vehicle当前的速度 |
Acceleration |
vehicle的加速度 (加速的快慢) |
Braking |
vehicle的减速度 (减速的快慢) |
Turn Speed |
vehicle转动的速度 |
Max Speed |
能达到的最大速度 |
Min Speed |
能达到的最大负的速度(提供的时候采用正值,但速度将在负值达到它) |
Weight |
vehicle有多重,通常定义了摩擦力 |
所以我们最初对Vehicle类的缩减是简单继承Node并为这些值增加getter和setter。我将加入一些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,我们需要控制它。
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 vehicle的id
* @param model 表达vehicle绘图外观的模型
*/
public Vehicle(String id, Spatial model){
super(id);
setModel(model);
}
/**
* 构造方法,获取模型作为vehicle的外观
* @param id vehicle的id
* @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));
}
}