我对整个面向对象的范例都很陌生。
我正在尝试在某个游戏中塑造一个角色,你有不同的等级,类别和许多设备选择等等。
我最终的目标是创建某种“梳妆台”,让玩家可以打开网站,尝试一些装备,看看它如何影响他们的参数,花费多少等等。
我已经编写了主要部分(here),但这是我用html,css和javascript完成的第一部作品,而且现在只是一大堆。 我想这次开始正确:)
假设我有一个我们将要模拟的角色的对象:
var Lord = function(){
this.Level = 1;
this.Gender = 'Male';
this.Faction = 'Knight';
this.Attack = 0;
this.Defense = 1;
this.SpellPower = 0;
this.Knowledge = 0;
this.Luck = 0;
this.Morale = 1;
this.Initiative = 0;
this.addParameter = function(Parameter, amount){
this[Parameter] += amount;
};
this.changeLevelTo = function(Level){
this.Level = Level;
};
this.changeGenderTo = function(Gender){
this.Gender = Gender;
};
this.changeFactionTo = function(Faction){
this.Faction = Faction;
//adjust default stats based on new faction
};
};
我的问题是: 骑士开始时有1个防御和1个士气,不同的派系会给你不同的统计提升。无法重新分配这些值。 在练级时,玩家还可以获得一些在不同参数上花费的统计点,这些可以重新分配。
此外,玩家可以装备一些提升状态的装备,而且这些装备也不能重新分配(只能通过不加分配)。
我之前做的是我创建了一大堆数组,所有数组的索引都对应于每个参数,每个数组代表来自不同派系的默认stat提升,来自设备的总统计提升以及统计数据手动分配的玩家。 然后我将每个索引求和,以给我一个最终的参数数组来显示。然后,玩家只能重新分配第3个阵列中的点,而不能重新分配任何其他阵列。
我应该如何使用面向对象的编程来实现它?
我已经阅读了一些基本概念(封装,继承,多态),但它们相当抽象,当我开始讨论它时,我真的不知道该怎么做:s
-
-
响应
这个网站很难使用:o
好的,我会试着看看我能从qternion的回答中得到什么:
var Faction = function(atk, def, sp, kn, luk, mor, ini){
this.Attack = atk;
this.Defense = def;
this.SpellPower = sp;
this.Knowledge = kn;
this.Luck = luk;
this.Morale = mor;
this.Initiative = ini;
}
var Knight = new Faction(0,1,0,0,0,1,0);
var Wizard = new Faction(0,0,0,1,0,1,0);
然后在主的对象上,我会
//this.Faction = 'Knight'
this.Faction = Knight
this.Defense = function(){
return this.Faction.Defense + this.someOtherClass.Defense;
}
我将寻求使用http://javascript.crockford.com/prototypal.html
改进上述原型感谢所有人的贡献:)
答案 0 :(得分:2)
您可以将您的统计值设为方法而不是成员变量。这样,你可以在调用期间计算给定的stat,例如knight.defense()。反过来,你的角色类中的方法defense()可以从派系类调用defence(),从equipmentSet类调用defense()等等。这样做的好处是你可以随时添加额外的stat修饰符,例如你决定你想要一个特殊的系统。
然后每个派系类可以覆盖其修饰符的防御()函数。
我不会把这称为最面向对象的方式,但这就是我自己作为Javascript程序员的方式。
附录:冥王星的答案也是你如何获得可重复使用的“类”(而不是单个对象)。如上所述,我也会使Faction成为一个类,而不仅仅是一个字符串(你可以使用instanceof进行类型检查):
var Faction = function (){
this.prototype.defense = function () { return this.Defense; };
this.prototype.initStats = function () { this.Defense = 0;};
this.initStats(this);
};
var Knight = new Faction ();
Knight.prototype.initStats = function () { this.Defense = 1;};
例如。
答案 1 :(得分:2)
如果需要,您可以保留阵列。面向对象编程最重要的是封装,它归结为提供了一种与Character对象交互的方法,而不必知道任何关于低级实现的内容。你想要处理对象,而不是数组或哈希表(即使在它下面,这就是对象的实际构建方式!)你想要的是编写如下代码:
var link = Knight();
link.equip(new MasterSword());
alert(link.getAttackPoints());
呃,@ qternion有点打败了我。所以我把这个答案变成了一个wiki!让我们在这个问题上释放出SO的智慧。
答案 2 :(得分:2)
只需将Lord改为函数(即var Lord = function() { /* current code */ }
)并使用this.Level = 1;
设置其属性。从现在开始,您可以像大多数面向对象编程语言一样使用new Lord()
创建任意数量的Lords。
实践中的一个例子......
var Lord = function() {
this.Level=1;
this.Gender='Male';
this.Faction='Knight';
/* ... */
this.addParameter=function(Parameter, amount){
this[Parameter] += amount;
};
/* ... */
};
var a=new Lord();
var b=new Lord();