一直很困。。。
注:本系列教程全部翻译完之后可能会以PDF的形式发布。
如果有什么错误可以留言或EMAIL:kakashi9bi@gmail.com给我。
jME版本 :jME_2.0.1_Stable
开发工具:MyEclipse8.5
操作系统:Window7/Vista
这节课我们将改善我们上一次的控制模式。由于我们正驾驶一辆交通工具,我们假设它遵循物理定律,它不应不经加速就移动,或者突然就停下来。
为了做到这个,我们增加一些模仿物理的东西。这将需要一个类保存交通工具的性能,就和传统的InputAction一样。
6.2、增加一个交通工具
我们将封装所有交通工具的信息到一个单一的类叫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,我们需要控制它。
6.3、Vehicle.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 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));
}
}
分享到:
相关推荐
FlagRush6——控制交通工具 FlagRush7——拥抱大地让我们驾驶的不再是Box FlagRush8——增加随机的Flag FlagRush9——墙壁检测系统(Detection System) FlagRush10——墙壁检测系统(Detection System) 如果确实...
6、 控制交通工具 74 6.1、介绍 74 6.2、增加一个交通工具 74 6.3、Vehicle.java 76 6.4、Actions 79 6.5、FlagRushHandler.java 81 6.6、AccelerateAction.java 83 6.7、BrakeAction.java 84 6.8、...
jmonkeyengine是一个面向冒险的java开发人员的三维游戏引擎。它是开源的、跨平台的、尖端的。3.2.4是jmonkeyengine 3 sdk的最新稳定版本,是一个完整的游戏开发套件。我们将发布3.2.x更新,直到主要的3.3版本到来。
Jmonkeyengine 3.0 Beginners Guide
jMonkeyEngine(jME)是一个开源的Java 3D引擎,它的效果非常好,速度也不错
[Packt Publishing] jMonkeyEngine 3.0 初学者指南 (英文版) [Packt Publishing] jMonkeyEngine 3.0 Beginner's Guide (E-Book) ☆ 出版信息:☆ [作者信息] Ruth Kusterer [出版机构] Packt Publishing [出版...
sdk, 在netbeans上,基于 jMonkeyEngine3 SDK jMonkeyEngine软件开发工具包( SDK ) 欢迎使用jMonkeyEngine软件开发工具包( SDK )的知识库。 这个SDK使用jMonkeyEngine简化了 3D 个应用程序的开发。 它包含开发完整...
NULL 博文链接:https://hjk685.iteye.com/blog/1912303
jMonkeyEngine 3.0 Beginner's Guide
jmonkeyengine, 在Java中,一个完整的3D 游戏开发 jMonkeyEngine jMonkeyEngine是一款用于冒险Java开发人员的3D 游戏引擎。 它是开放的,跨平台的,和cutting的。 3.2.0是 jMonkeyEngine 3 SDK的最新稳定版本,一个...
共12章JME中文教程,演示代码经测试无错
jmonkeyengine:纯Java编写的一个完整的3D游戏开发套件
NULL 博文链接:https://snake.iteye.com/blog/578982
jMonkeyEngine软件开发套件(SDK) 欢迎使用jMonkeyEngine软件开发套件(SDK)的存储库。 该SDK简化了使用jMonkeyEngine开发3D应用程序的过程。 它包含开发完整应用程序所需的一切。 我们的SDK(或jmonkeyplatform...
JME学习文档 中文版 jMonkeyEngine 入门学习
SimpleJmonkeyGame引言由JmonkeyEngine开发的3D游戏Scenerio。 在此简单游戏中导入的3D动画由Blender制作。脚步使用Blender制作3D鱼动画,包括向前游泳,静止的闲置动画和180度转弯动画。 将Blender模型导入Jmonkey ...
jMonkeyEngine是一个众所周知且广泛使用的免费开放源代码游戏引擎。 该演示应用程序展示了最新的jME版本jME 3的功能和某些功能。jMonkeyEngine使用OpenGL作为其图形库。 该软件包含的一些功能包括:粒子效果,水渲染...
赛车游戏 使用 JMonkeyEngine 创建的赛车游戏。 汽车的转向非常僵硬。 按住 F 将车轮摩擦设置为 0 并改为漂移。