我试图制作一个简单的文本冒险/农业模拟器,但我是JavaScript的新手,我一直试图计划我的库存系统如何工作。我的主要问题是有两种主要类型的物品:食品/消耗品和工具/耐用品。食物将以固定的速度生成和消费,而工具则需要购买,并且每次使用都会失去耐久性。
我能想到的最简单的解决方案是让每个食物的数量成为玩家的属性(player.meat,player.vegetable等),因为数量将是唯一改变的东西。工具有点复杂,所以我想我可以创建一个工具原型,然后给玩家一个存储所有工具的库存数组。然而,我越是想到它,我越觉得食物也需要成为原型(它也有价格和营养价值等属性)。
我现在正在努力思考最有效的方法。我是否创建了2个独立的原型,然后为每个玩家提供一个阵列?我是否需要为阵列创建原型,以便跟踪项目类型和数量?当我想要修改它时,我是否需要搜索数组中的每个项目?这似乎是不必要的复杂,但我真的不能想到更简单的事情。有人可以帮忙吗?
答案 0 :(得分:0)
您可以保留一系列食物和一系列工具物品。以下是创建食品并使用它的示例。
function FoodItem(options){
var options = options || {};
this.name = options.name || "DefaultFood";
this.amount = options.amount || 100;
this.decrease = options.decrease || 1;
this.eat = function(){
this.amount -= this.decrease;
if (this.amount < 0){
console.log("Food Gone");
}
}
}
// Then create new foods.
var carrots = new FoodItem({
name:"Carrots",
amount:50,
decrease:2
});
carrots.eat();
答案 1 :(得分:0)
至关重要的是不要在技术方面过度复杂化。随着游戏玩法的发展,您无论如何都需要改变一切,所以只有在您确定需要时才开始简单并增加复杂性。
我认为通过&#34;原型&#34;你的意思是基类。在你进入你的项目之前,我会反对这一点。关于JS经常受到经典训练的编码员绊倒的一件很酷的事情是,对象是“糊涂”的。您可以根据心脏的内容为每个对象添加或删除方法。嵌套子对象也是如此,因此您可以将所有内容保持干净整洁,而不会在以后限制自己。
这样的事情是我想到的第一件事。
player.inventory = {
tools: [
],
food: [
]
};
// when player picks up hammer
player.inventory.push({
name: 'hammer',
icon: 'images/hammer.png',
effect: function(target) {
console.log('whacked the ' + target.name);
}
});
最重要的是犯错误而不是过度工程化。这有时称为compression-oriented programming
祝你好运,玩得开心。
答案 2 :(得分:0)
如果您想创建一种简单的查看项目的方法,并且您拥有唯一的基于字符串的ID(数字或名称),则可以使用Object作为哈希。
var player = {
tools: {}
};
然后当该玩家获得新工具时,您可以将该工具的实例添加到哈希:
player.tools['hammer'] = new Tool(...);
然后,当您想稍后检索它时,您可以执行以下操作:
player.tools['hammer'].durability -= wear;
使用下划线,您可以像数组一样轻松地迭代这些对象:
var inventoryWorth = _.reduce(player.tools, function(totalCost, tool) {
return totalCost + tool.cost;
}, 0);
对于放在这些数组中的对象,创建原型和构造函数可能很有用,但除非您打算向它们添加大量方法,否则您也可以只删除一个对象。