作为一个学习javascript的项目,我正在做一个小型游戏。在这个游戏中有资源和机器。购买机器需要花费一种或多种资源,并且每台机器都会产生一种或多种资源。机器也可以有输入(例如能量)来保持生产。
由于资源和机器如何相互缠绕,我不确定如何在它们之间交换信息。为了计算每个资源的秒数,我不想遍历所有机器以检查其输出是否包含该资源。我宁愿以仅检查产生此资源的机器的方式构造对象。
我想到了一种方法,方法是让Machine构造函数在其输出对象中循环,然后将其名称推送到资源对象中的数组。但是以某种方式,这感觉更像是黑客,而不是可靠的解决方案。除此之外,我还想提出一种解决方案,使尚未解决的游戏机制可以轻松,动态地应用新机器,(临时)生产提升或折扣。可以按资源,按机器或所有资源/机器进行提升和折扣的地方。
下面是我当前为资源和机器定义对象的方式。
请问您有什么建议或提示吗?
Game.objectConstructor.Resource = function(id, name) {
var instance = {};
instance.id = id;
instance.name = name;
instance.category = 'resource';
var private = {};
private.production = {
perSecond: function() {
// Go over all machines producing id and calculate
},
current: 0,
update: function() {
var now = new Date().getTime();
// Cap current storage by the maximum storage we have.
private.production.current = Math.min(private.perSecond()/1000*(now-private.lastUpdate), private.storage.current());
},
lastUpdate: new Date().getTime(),
},
private.storage = {
level: 1,
baseCapacity: 50,
discount: 0.00,
upgradeCost: function() {
var result = {};
result[private.name] = private.storage.current()*(1-private.storage.discount);
result['somethingelse'] = private.storage.current()*0.25*(1-private.storage.discount);
return result;
},
current: function() {return Math.pow(private.storage.baseCapacity, private.storage.level);}
}
this.perSecond = function() {
return private.production.perSecond();
}
return instance;
};
Game.materials.entries.metal = new Game.objectConstructor.Resource('metal', 'Metal');
Game.objectConstructor.Machine = function(id, name, cost, input, output) {
var instance = {};
instance.id = id;
instance.name = name;
instance.category = 'machine';
var private = {};
private.cost = cost;
private.input = input;
private.output = output;
this.isAffordable = function() {
if (Object.keys(private.cost).every(c => (c.current - cost[c]) > 0)) {
return true;
}
return false;
}
return instance;
}
Game.machines.entries.metalGrinder = new Game.objectConstructor.Machine('grinder', 'Grinder', {metal: 10}, {}, {metal: 1})