尝试使用面向对象的javascript进行建模
Trying to model with object-oriented javascript
我对整个面向对象范式还很陌生。
我试图在某个游戏中为一个角色建模,你有不同的等级、职业和很多装备选择等等。
最终,我的目标是创建一个"梳妆台",玩家可以在这里打开网站,试穿一些装备,看看它如何影响他们的参数,花费多少,等等。
我已经对主要部分进行了编程(在这里),但这是我第一次使用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个士气,不同的派系会给你不同的属性提升。这些值不能重新分配。玩家在调平时也会获得一些统计点,用于不同的参数,这些可以重新分配。
此外,玩家可能会装备一些可以提高属性的装备,但这些装备也不能重新分配(只能通过取消装备)。
我之前所做的是,我创建了一大堆数组,所有数组的索引都对应于每个参数,每个数组代表不同派系的默认属性提升,设备的总属性提升,以及玩家手动分配的属性。然后,我对每个索引求和,得到要显示的参数的最终数组。玩家只能在第三个数组中重新分配点数,而不能再分配其他数组中的点数。
我应该如何使用面向对象编程来实现这一点?
我读过一些基本概念(封装、继承、多态性),但它们相当抽象,当我深入研究时,我真的不知道该怎么办: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
感谢大家的贡献:)
您可以将stats值设置为方法,而不是成员变量。这样,你就可以在调用过程中计算出一个给定的属性,例如knight.dedefense()。反过来,你的角色类中的方法defense)可以从派系类中调用defense。
然后,每个派系类都可以覆盖其修改器的defense()函数。
我不会称之为最面向对象的方式,但作为一名Javascript程序员,我会这样做。
附录:Pluto的答案也是如何获得可重用的"类"(而不是单个对象)。如前所述,我还将Faction作为一个类,而不仅仅是一个字符串(您可以使用instanceof键入check):
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;};
例如。
只需将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();
如果需要,可以保留数组。关于面向对象编程,最重要的是封装,它可以归结为提供一种与Character对象交互的方法,而不必了解任何底层实现。您想要处理对象,而不是数组或哈希表(即使在所有对象的下面,对象实际上就是这样构建的!)您想要的是编写如下代码:
var link = Knight();
link.equip(new MasterSword());
alert(link.getAttackPoints());
呃,@qternion有点打败我了。所以我要把这个答案变成一个维基!让我们在这个问题上释放SO的智慧。
- 为什么不't Javascript对我的输入值进行了一些重新检查
- 创建一个类似链接的按钮,并通过Javascript函数打开一个新的弹出窗口
- 将函数的上下文应用于javascript变量
- 使用php或javascript从facebook相册URL中删除多余的部分
- 正在添加'X'按钮,在文本字段旁边使用javascript
- 如何在JavaScript中将字符串转换为函数引用
- 模糊事件的Javascript测试
- Javascript更改图标
- 如何将HTML id分配给元素,以及如何将JavaScript应用于元素
- 如何使用WCF服务和javascript表单post上传.doc文件
- javascript结合了数组和字典
- 这是什么 ==- javascript 运算符
- 从javascript创建一个列表
- 使用UML对JavaScript更改为HTML进行建模
- 如何用javascript建模字符串的最后一部分
- 如何在JavaScript中对此数据结构进行建模?(AngularJS)
- 尝试使用面向对象的javascript进行建模
- 用于建模2D、3D数据的Javascript控件
- (重新)将DOM建模为特定的投影JavaScript | jQuery
- JavaScript / TypeScript中的3D UML建模