在我编码的游戏中,有不同的资源。升级到项目会花费不同数量的这些资源,尽管大多数只需要2或3种资源类型。由于数百种资源类型中的每一种都有多个参数(数量,风味文本等),我认为通过对象创建与这些资源相关的数据是最明智的。我最终决定的布局如下($
表示根游戏对象):
$.resources.genericResource = {
resource1: {
amount: 0,
earnt: 0,
flavourText: "Generic flavour text"
}
resource2: {
amount: 0,
earnt: 0,
flavourText: "Not generic flavour text"
}
resource42: {
amount: 0,
earnt: 0,
flavourText: "The answer to life, the Universe, and everything" //Possibly...
}
}
每个资源都有一个amount
整数变量,(顾名思义)表示当前拥有的每种资源的数量。
每个可购买的项目(升级,建筑等)都有许多资源(以及其他一些东西)的基本成本。如此,这也通过一个对象表示:
$.upgrades.genericUpgrade.baseCost = {
resource1: 7,
resource2: 1,
resource42: Math.PI
}
请注意,这些内容的初始化时间比此处详述的更为明智 - 这只是显示将要使用的格式的示例。
现在,这些需要是对象而不是数组,因为每个资源都有额外的数据 - 游戏将继续使用新资源进行更新(因此索引编辑可能会出现保存文件问题) 。但是,对于包含每个资源的键的每个可购买项目(其值大多为零)而不是baseCost
,我只想让它只包含不同于零的值。这将大大增加整洁度,易于更新,文件大小和我的理智到最后。
非常简单:我完全不知道如何创建一个循环,在给定baseCost
对象的情况下,返回相关$.resources
对象的值,因为对象与数组不同,是不可索引的。我还需要在成功购买后编辑$.resources
值,但考虑到相关键的名称会更容易,作为一个简单的for
循环
$.resources[resource].amount -= cost;
每个资源。
TL; DR:我不知道如何根据其中一个的密钥名称迭代两个单独的对象。
在进一步讨论之前,我将首先制作一些辅助变量来引用baseCost
和$.resources
对象,因为这将大大减少代码长度(在实际代码中,前者会仅引用$.upgrades
对象):
var $u = $.upgrades.genericUpgrade.baseCost;
var $r = $.resources;
我首先考虑了如何获得输入 - 首先需要确定$.upgrades.genericUpgrade.baseCost
的密钥数量。足够简单 - 只需做类似以下的事情:
var keys = Object.keys($u);
var keyQuantity = keys.length;
前面的代码片段包含另一个有用的变量:一个包含键名作为字符串的数组。这对最终替换很有用,但首先我们需要一个for
循环,在其中可以找到购买的有效性(也就是说,是否太昂贵):
var keysIndex;
for (i = 0; i < keyQuantity; i++) {
keysIndex = keys[i];
//Is the resource cost greater than the amount of the resource owned?
if ($u[keysIndex] > $r[keysIndex]) {
//Code to either break out of the loop, return false, or something similar
}
}
这几乎已经完成了:现在所需要的只是在物品不太贵的情况下否定成本,并将所有代码放在一起。然后我们得到以下内容:
function purchaseUpgrade(upgrade) {
var $u = $.upgrades[upgrade].baseCost;
var $r = $.resources;
var keys = Object.keys($u);
var keyQuantity = keys.length;
//Helper variable to assist with key referencing:
var keysIndex;
//Boolean to decide whether or not a purchase is valid
var isValid = true;
//Check for all resources in $u:
for (i = 0; i < keyQuantity; i++) {
keysIndex = keys[i];
//Is the resource cost greater than the amount of the resource owned?
if ($u[keysIndex] > $r[keysIndex].amount) {
//Invalidate the purchase
isValid = false;
//As no more permutations are necessary, break the loop:
break;
}
}
//If all resource costs are lesser than the owned resources, do the following:
if (isValid === true) {
for (i = 0; i < keyQuantity; i++) {
keysIndex = keys[i];
$r[keysIndex].amount -= $u[keysIndex];
}
$.upgrades[upgrade].owned += 1;
}
}
该功能可由purchaseUpgrade("nameOfUpgrade")
调用。
我现在意识到我在写出来的时候已经解决了这个问题......但是,由于StackOverflow上没有明显的类似问题,我仍然决定发布这个问题,因为它可能会对某些人有用。点。但是,如果有人认为他们有更好/更有效的答案,请随意发布 - 在这种情况下,我会选择它作为最佳答案&#39;。