尝试使用面向对象的javascript建模
我对整个面向对象的范例非常陌生 我试图在一个特定的游戏中塑造一个角色,你有不同的等级,职业,和很多的装备选择等等 我最终的目标是创建一个“化妆台”,玩家可以在这里打开网站,试穿一些装备,看看它如何影响他们的参数,花费多少,等等 我已经对主要部分进行了编程(),但这是我第一次使用html、css和javascript,目前这一切都一团糟。 这次我想好好开始:)尝试使用面向对象的javascript建模,javascript,oop,Javascript,Oop,我对整个面向对象的范例非常陌生 我试图在一个特定的游戏中塑造一个角色,你有不同的等级,职业,和很多的装备选择等等 我最终的目标是创建一个“化妆台”,玩家可以在这里打开网站,试穿一些装备,看看它如何影响他们的参数,花费多少,等等 我已经对主要部分进行了编程(),但这是我第一次使用html、css和javascript,目前这一切都一团糟。 这次我想好好开始:) 假设我们要模拟的角色有一个对象: var Lord = function(){ this.Level = 1;
假设我们要模拟的角色有一个对象:
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
};
};
我的问题是:
一个骑士一开始有一个防御和一个士气,不同的派系会给你不同的属性提升。无法重新分配这些值。
玩家在升级时还可以获得一些属性值,用于不同的参数,这些属性值可以重新分配
此外,玩家可能会装备一些能够提升属性的装备,而这些装备也不能重新分配(只能通过取消装备)
我之前所做的是,我创建了一大堆数组,所有数组的索引都对应于每个参数,每个数组表示不同派别的默认属性提升、装备的总属性提升以及玩家手动分配的属性。
然后,我对每个索引求和,得到要显示的最终参数数组。玩家只能在第三个阵列中重新分配点,而不能在任何其他阵列中重新分配点
我应该如何使用面向对象编程来实现它
我读过一些基本概念(封装、继承、多态性),但它们相当抽象,当我开始认真研究时,我真的不知道该怎么做:s
-
-
响应
这条领带很难用 好的,我将尝试从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;
}
我希望通过使用
感谢大家的贡献:)您可以让统计值成为方法而不是成员变量。这样,您可以在调用过程中计算给定的属性,例如knight.defense()。反过来,角色类中的方法defence()可以从派系类调用defence(),从装备集类调用defence(),等等。这样做的好处是你可以在任何时候添加额外的属性修饰符,例如,如果你决定要一个额外的系统或其他东西 然后,每个派系类都可以覆盖其修饰符的defense()函数 我不认为这是最面向对象的方式,但作为一名Javascript程序员,我会这样做 附录:Pluto的答案也是如何获得可重用的“类”(而不是单个对象)。如前所述,我还将派系设置为一个类,而不仅仅是一个字符串(您可以使用instanceof键入check):
例如。如果需要,您可以保留阵列。面向对象编程最重要的一点是封装,它可以归结为提供一种与角色对象交互的方法,而无需了解任何关于底层实现的信息。您想要处理对象,而不是数组或哈希表(即使在它们下面,对象实际上就是这样构建的!),您想要的是编写如下代码:
var link = Knight();
link.equip(new MasterSword());
alert(link.getAttackPoints());
呃,@qternion有点抢先了我一步。所以我把这个答案变成了一个维基!让我们在这个问题上释放SO的智慧。只需将Lord更改为函数(即,
var Lord=function(){/*current code*/}
),并将其属性设置为this.Level=1代码>。从现在起,您可以像大多数面向对象编程语言一样,使用newlord()
创建任意数量的Lord
实践中的一个例子
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();
一个骑士以1个防御开始
-所以在你的对象文字中将其设置为1<代码>防御:0,
=>防御:1,
本着希望提高Javascript OO技能的精神,你可能还想看看这篇关于原型函数的文章:因为你对面向对象编程是绝对陌生的,我强烈建议你阅读以下关于为什么原型继承很重要的博客文章:谢谢你的资源:)好吧,也许我会改成这个,我计划在设备上使用这个符号等等,这里只有一个字符可供使用,所以我使用了文字符号,但我对itok不太熟悉,等等,因为我将在呈现防御方法之前计算防御方法,所以我可以使用防御方法的返回值,而不是计算它,将其分配给防御属性,然后使用该属性本身?我想我现在开始有点明白了:染料,就这样。如果你出于某种原因想要缓存返回值,你只需要手动分配返回值(例如,你可能有临时的属性修改,并且你想缓存角色的基本防御以进行其他检查)。嗯,我很快就会编辑它,以便它在我上面的第一篇文章中可见,但是现在,每个派系都有一个对象,每个派系的每个参数都有相应的属性。然后它变得有点笨拙D:啊,忘了上面的,我刚刚意识到我可以制作一个派系对象,然后让每个派系都是该对象的一个实例!谢谢,我想我现在对这一点有了更坚定的把握:啊,你可以在更合适的地方传播修饰语。例如,如果一个给定的角色有一个派系修饰符(由派系.防御()提供)和一个装备修饰符,可能还有一些临时状态修饰符,那么所有这些都将添加到角色中
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();