根据速度和距离计算移动费用

时间:2017-06-23 09:13:01

标签: javascript math

我正在开发帆布迷你游戏,我想建立一个计算将你的船从A点移动到B点的成本的函数。

我需要两件事:

  • 发货前的总成本
  • 移动每个刻度的成本(服务器循环节拍)

每次移动船舶时都会收取成本(每次服务器循环滴答),因此总数必须与服务器为获得它而生成的所有滴答的总和相匹配。

我有简单的服务器循环移动:

setInterval(function() {
    ship.move();
}, 10);

现在简化的船舶代码:

var rad = (p1, p2) => Math.atan2(p2.y - p1.y, p2.x - p1.x),
    distance = (p1, p2) => Math.sqrt( (p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y) );

var ship = function() {

    this.x; // current ship x
    this.y; // current ship y
    this.destination; // destination object
    this.total_distance; // total distance before dispatch
    this.remaining_distance; // remaining distance before arrival
    this.speed = 0.5; // ship speed modifier

    this.set_travel = function(target) {
        this.destination = target;
        this.total_distance = distance( { x: this.x, y: this.y }, { x: this.destination.x, y: this.destination.y } );
    };

    this.move = function() {
        this.remaining_distance = distance( { x: this.x, y: this.y }, { x: this.destination.x, y: this.destination.y } );

        var _rad = rad( { x: this.x, y: this.y }, { x: this.destination.x, y: this.destination.y } );

        this.x += Math.cos(rad) * this.speed;
        this.y += Math.sin(rad) * this.speed;
    };

};

现在我们可以引入燃料成本并添加到上面的代码中:

var ship = function() {

    ...
    this.total_fuel_cost; // total fuel cost that player will consume during entire travel

    this.set_travel = function(target) {
        ...
        this.total_fuel_cost = ?
    };

    this.move = function() {
        ...
        player.fuel -= ? // fuel cost every tick that must match total after arrival
    };

};

也许有人可以帮助解决这个问题。也许这可能是一个很好的方法,假设每1个距离花费成本x燃料,但我不知道它是否可以这样做。

-----编辑

创建船舶时,它会以这种方式实例化:

objects.push(new ship())

正如我在我的问题中所解释的那样,如果总量不够,拒绝飞行是不可接受的,只要它有燃料就必须运输

2 个答案:

答案 0 :(得分:0)

我使用已提供的设置组装了一个小小的演示:

  • move()循环以10毫秒的间隔进行
  • 燃料即时消耗
  • 整个旅程中消耗的燃料必须与开头时的假设消耗相等

逻辑解释:

您的逻辑中唯一真正需要的变量就是出货速度。

您的代码如下所示:

this.move = function() {
    this.remaining_distance = distance( { x: this.x, y: this.y }, { x: this.destination.x, y: this.destination.y } );

    var _rad = rad( { x: this.x, y: this.y }, { x: this.destination.x, y: this.destination.y } );

    this.x += Math.cos(rad) * this.speed;
    this.y += Math.sin(rad) * this.speed;

    player.fuel -= this.speed;
};

让我们说玩家有1000燃料,你需要飞行845的距离。如果我们假设1 distance === 1 fuel,我们希望在旅程结束时你应该留下155燃料。此外,如果你快速飞行(比如说2)或者说慢(比如说0.5)那也没关系,油耗应该是一样的,因为你在飞得更快时会消耗更多的燃料。上面的代码就是这样。

演示链接: https://jsfiddle.net/7khvxkaa/1/

燃料成本可以通过处理较小的数字来缓和,例如,如果假设1 distance === 0.01燃料,您将在整个10距离旅程中消耗1000燃料。考虑到上述情况,这是唯一需要做出的改变:

player.fuel -= this.speed / 100;

另外请记住,演示仅用于调试目的以验证概念验证,在您有更多变量的实际环境中(例如移动目的地或船舶加速/减速),可能难以预测总燃料消耗,但逻辑将仍然按预期工作。

答案 1 :(得分:-1)

我认为你大多需要一个关于OOP的解释。

您的功能船不是对象;它是一个类的构造函数 (嗯,这就是其他语言所称的那种。)

要创建对象,请执行以下操作:

{{1}}

这是一个例子;有点类似你的游戏。但我的主要观点是你要看看如何使用一个物体。正如您所看到的,物业myship.fuel会跟踪燃料;如果旅行需要更多的燃料,它将拒绝移动。

您可以自己处理的计算。看看"我有什么属性?" "我需要什么?",...

{{1}}