Javascript 对于大量的变量,哪一个更好
因此,在过去几天大量阅读JS(我刚刚开始)之后,我为我的项目找到了3个可行的选项,这是一个游戏顺便说一句。我的游戏中将有大约200个项目,总共有大约30个统计/属性。但是由于程序必须知道剑不会造成法术伤害,所以我必须给每件物品所有的30个属性,即使90%是0。下面是我的想法,非常感谢您的建议:Javascript 对于大量的变量,哪一个更好,javascript,html,Javascript,Html,因此,在过去几天大量阅读JS(我刚刚开始)之后,我为我的项目找到了3个可行的选项,这是一个游戏顺便说一句。我的游戏中将有大约200个项目,总共有大约30个统计/属性。但是由于程序必须知道剑不会造成法术伤害,所以我必须给每件物品所有的30个属性,即使90%是0。下面是我的想法,非常感谢您的建议: var prop, obj = { Item1: "Boots", Item2: "Gloves", Item3: "Sword", Item4: "Cape" }; //我很确定我必须以某种方式重新制
var prop, obj = { Item1: "Boots", Item2: "Gloves", Item3: "Sword", Item4: "Cape" };
//我很确定我必须以某种方式重新制作它,以便在其中放置属性,这可能没有那么有用
function Item(hp, mp, dmg, spd, luk) {
this.hp = hp;
this.mp = mp;
this.dmg = dmg;
this.spd = spd;
this.luk = luk;
}
var BigSword = new Item(0, 0, 50, 20, 10)
//我想这可能是我最好的选择,所以变量越少越好?或者这并不重要?我想,每当我在更新函数中更新totalHp、totalMp和totalDmg等时,我都可以使用这个选项创建一个名为Iteem=Bigswire的局部变量,然后只执行Iteem.hp、Iteem.mp,这样它就不必搜索太多变量,应该运行得更快?很抱歉这个新手的问题,但是JS函数中有局部变量吗?如果我执行var-onteem=whatever,那么函数外部的onteem将为null
itemNames = [ "Boots", "Gloves", "Sword", "Cape" ];
itemHp = [ 0, 0, 0, 50 ];
itemMp = [ 0, 30, 0, 0 ];
itemDmg = [ 0, 0, 50, 0 ];
itemSpd = [ 50, 0, 0, 0];
//这是我想出的另一个选择,有点难看,但如果只是使用阵列更快或更好,我不太介意
但是请记住,就像我说的,总共200个物品,每个物品大约有30个属性。你觉得怎么样
非常感谢您的阅读和提供的任何信息,非常感谢!提前谢谢我更喜欢实物。我将从一个简单的、通用的“项”开始,然后通过“继承”从具有的通用项构建特定项 这可能会大大减少代码冗余并提高可维护性
Speedwise我不知道,但我认为迭代200*30数组值也不是那么快。您需要首先进行认真的设计。如果您刚刚开始编码(正如许多开发人员所做的那样),您只会走到这一步,并意识到您的设计有一个基本缺陷,应用程序需要重写。这在早期阶段并不重要,但一旦编写了几百行代码,就会变得相当乏味 无论如何都要为原型编写代码,但是您应该期望从中得到的只是设计提示,代码应该被扔掉 您的项目列表(或目录)应该是一个具有添加、删除和更新项目方法的对象。然后,每个玩家(角色、化身等)只需要一个物品列表和状态。应该有一个全局更新伤害或健康或任何功能来获取特定类型的物品并将其应用于特定类型的玩家(例如武器伤害敌人、食物使玩家和朋友复活等) 只有了解了所有的玩家和项目及其属性和操作后,才能开始设计接口和方法,并最终编写一些代码
关注目标,这应该是开发一个引人入胜的游戏,而不仅仅是编写几千行代码。您最好的选择是拥有一个构造函数,就像您在第一个示例中所做的那样。然而,我会改变一些事情。首先,对于构造函数,您只需传入大量数字。这很糟糕,因为很容易忘记数字的顺序。更好的方法是将对象传递给构造函数,这样就可以标记每个属性:
function Item(props) {
this.hp = props.hp;
this.mp = props.mp;
this.dmg = props.dmg;
this.spd = props.spd;
this.luk = props.luk;
}
var BigSword = new Item({
hp: 0,
mp: 0, 5
dmg: 0,
spd: 20,
luk: 10
});
这很好,但仍然很痛苦,因为您有各种不同的项目,正如您所说的,您必须为每个项目定义30个属性,这既麻烦又耗时。此时,您将进入更复杂的面向对象的领域。从这里您基本上有两个选择:继承和构造
遗产
使用对象继承来正确定义对象可能是两者中比较常见的一种,而且相当简单。本质上,您有一个对象的“类”,然后是每个类的子类。所以你可以把魔法物品和非魔法物品分为两类。如果你有一条魔法腰带,也许你会想让它继承魔法物品类的属性。另一方面,如果你有一把基本的非魔法剑,你会想让它从非魔法物品类继承
但是说你有魔法卷轴和魔法药水。那都是魔法物品,对吧?因此,您需要创建一个名为“药剂”的类和一个名为“卷轴”的类,这两个类都继承自魔法物品类。那么你可能会有某种药剂。治疗药剂,也许--“治疗盟友的魔法药剂”和“治疗自我的魔法药剂”。所以你需要不同的类,等等
Javascript中的继承可以通过多种不同的方式来实现,而且可能会非常深入,所以我不打算在我的文章中讨论它。但是,如果您想走这条路,这里有一些有用的链接可以帮助您开始继承:
- 及
物品->魔法->药剂->治疗药剂->盟友的事情。然而,在构图方面,你
// base item class
function Item(props) {
this.someProperty = props.someProperty;
this.someOtherProperty = props.someOtherProperty;
}
// potion behavior
function Potion(props) {
this.amount = props.amount; // IDK what amount means, just some random potion property
this.color = "green";
}
// healing behavior
function Healing(props) {
this.amountToHeal = props.amountToHeal;
this.cooldown = props.cooldown;
}
// behavior to affect allies
function AffectAllies(props) {
this.allies = props.allies;
for(ally in this.allies) {
this.allies[ally].affect(props.affact);
}
}
// at this point we have the various behaviors set up and we can create the Magical Potion of Heal Allies constructor:
function MassHealingPotion(props) {
var self = this;
this.amount = props.amount;
this.potion = new Potion(props);
this.effect = new Healing(props);
this.AffectAllies = new AffectAllies({
affect: function(ally) {
self.potion.affect;
},
allies: player.allies;
});
}
// you can now create a mass healing potion:
var potion = new MassHealingPotion({
weight: 50,
someProp: "someValue",
someOtherProp: "someOtherValue"
// and so on and so forth with whatever properties you want the potion to have
});
var itemList = {
bigSword: new BigSword(...);
smallSword: new SmallSword(...);
}