2013-07-22 5 views
8

私はオブジェクト指向のパラダイム全体にはかなり新しいです。オブジェクト指向のjavascriptでモデル化しようとしています

私は特定のゲームでキャラクターをモデル化しようとしていますが、レベル、クラス、そしてさまざまな機器の選択肢があります。

など最終的には私の目標は、プレイヤーがサイトを開くことができ、ある種の「ドレッサー」を作成、いくつかの装備に試してみて、それが費用どのくらい、そのパラメータにどのように影響するかを見ることであろう

私は既にプログラムされた主要部分(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ブーストを与えるでしょう。これらの値は再割り当てできません。 プレイヤーは、レベリング時に異なるパラメータに費やすためにいくつかの統計ポイントを取得し、これらを再割り当てすることができます。

さらに、プレイヤーはいくつかの装備に装備を増やすことができ、再配分することはできません。

これまで私が行ったことは、それぞれのパラメータに対応するインデックスを持つすべての配列をすべて作成したことです。各配列は、異なる派閥からのデフォルトのstat boostを表しています。プレイヤーが手動で割り当てたステータス。 次に、それぞれのインデックスを合計して、最終的なパラメータの配列を表示します。プレイヤーは3番目の配列内のポイントのみを再割り当てでき、他の配列は再配置できません。

オブジェクト指向プログラミングを使用してこれを実装するにはどうすればよいですか?

私は基本的な概念(カプセル化、継承、多態性)の一部にまで読んだが、彼らはかなり抽象的であり、私がダウンしてそれを得るとき、私は本当にしかなりのか分からない。■

-

-


応答


01私が試してみて、私はqternionの答えから得ることができるか見てよ、

[OK]を:O:

このwebstieは使用することは非常に難しいです、私が持っているだろう、主オブジェクトのその後

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

'騎士は1守備で始まり - ので、あなたのオブジェクトリテラルではこれを1に設定し...'防御:0、 '=> '防衛:1、 ' –

+0

右、ハングアップ:) – Sylin

+1

あなたのJavascriptオブジェクト指向のスキルを向上させたいという精神で、プロトタイプ関数についてこのSOの記事を見てみたいかもしれません:http://stackoverflow.com/questions/12238103// javascript-prototype-vs-general-functions-performance-readability –

答えて

2

メンバー変数の代わりに統計値をメソッドにすることができます。そのようにして、コール中に、特定のstat(exemple knight.defense())を計算することができます。次に、あなたのキャラクタークラスのメソッドdefense()は、ファッションクラス、defenseSetクラスなどから防御()を呼び出すことができます。これは、例えば、あなたが決定した場合にいつでも追加のstat修飾子を追加することができるという利点がありますあなたはペルクシステムなどが必要です。

それぞれのファクションクラスは、修飾子のdefense()関数をオーバーライドできます。

私はこれを最もオブジェクト指向の方法とは言いませんが、それはJavascriptプログラマとして自分自身でやっています。

補足:冥王星の答えは、再利用可能な「クラス」(個々のオブジェクトではなく)をどのように得るかです。例えば

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;}; 

:前述のように、私も派閥クラスだけではなく、文字列を(あなたは型チェックできるのinstanceofで)作ると思います。

+0

私は試してみましょう:q – Sylin

+0

私は計算しようとしているので、とにかくそれを提示する前に防衛、それは計算する代わりに、防衛メソッドの戻り値を使用することができます防衛プロパティに割り当て、次にプロパティ自体を使用する?私はこれをちょっと今に始めようと思っています:D – Sylin

+0

はい、それです。たとえば、一時的なstatの変更があり、他のいくつかのチェックのためにキャラクターの基本防御をキャッシュしたい場合など、何らかの理由でキャッシュする場合は、戻り値を手動で割り当てる必要があります。 – qternion

2

必要に応じて配列を保持することができます。オブジェクト指向プログラミングで最も重要なことは、カプセル化です。これは、低レベルの実装について何も知らなくても、Characterオブジェクトとやりとりする手段を提供することになります。あなたはオブジェクトなく、配列やハッシュテーブルに対処したいあなたが望むようなコードを書くことです(それをすべて下に、そのオブジェクトが実際に構築されている方法です場合でも!):

var link = Knight(); 
link.equip(new MasterSword()); 
alert(link.getAttackPoints()); 

え、私にそれを打つ@ qternionの種類。だから私はこの答えをwikiにしています!これの上にSOの知恵を発散させましょう。

+0

私はそれでうまくいきます。 – Sylin

2

Lordを関数(つまりvar Lord = function() { /* current code */ })に変更し、そのプロパティをthis.Level = 1;に設定するだけです。これからは、ほとんどのオブジェクト指向プログラミング言語のように、new Lord()であなたが望む数の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(); 
+0

ok、おそらく私はこれに変更します 私は装置などにこの表記を使用する予定でした。文字通りの表記法ですが、私はそれには慣れていませんでした – Sylin

関連する問題