我正在开发帆布迷你游戏,我想建立一个计算将你的船从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())
正如我在我的问题中所解释的那样,如果总量不够,拒绝飞行是不可接受的,只要它有燃料就必须运输
答案 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}}