2012-01-18 8 views
0

あなたが探しているOOPに関する正確な情報を得ることは難しいです。 私はできるだけ短くしておきました。Javascriptオブジェクトインタラクション(OOP)

私は現在、HTML5でジャンプnを開発中です。 私は実際にゲームを開発する上で実際の経験はありません。 しかし、私は基礎がどのように働くべきか知っています。 私は正しいことをしているかどうかだけ知りたい。

私はゲーム、プレイヤー、レベルオブジェクトを持っています。

私が現在やっていることは以下の通りです:

Game.player = new Player(); 
Game.level = new Level(); 

Game.level.load(Game.currentLevel); 
... 
Game.run(); 

は最善の方法は、私は例えば、自分でそれらのすべてを呼び出す必要かということです:彼らは方法私は

var Player = new Player(); 
var Level = new Level(); 
Level.load(Game.currentLevel); 
... 
Game.run(); 

今すぐ(最初のもの)それをやっていることは、私にとってより論理的なようです。 しかし、レベルオブジェクトの関数では、私はゲームオブジェクトからさまざまな変数を調べたり、自分の関数を呼び出す必要があります。したがって、私はGame.level.funcNameをLevelオブジェクト関数の中に記述する必要があります。しかし、Game.levelはレベルオブジェクトの宣言ポイントに実際に存在しないので、間違っていて汚いと感じます。ここでは別の例である:

Level.prototype.reset = function() { 
    this.load(Game.currentLevel); 
}; 

Game.currentLevelがハードコードされては、現在、ゲームオブジェクトを処理する変数を検出するための任意のより良い方法はありませんか、それは私がそれをやっている方法は完全に大丈夫ですか?

基本的な質問は、オブジェクト同士が相互作用できるようにするにはどうすればよいでしょうか?

最後に質問がありますが、それは何のためですか?行う? 私は時々、それはこのように使用beeingて参照してください。

(function() { 
    // Content 
}); 

私は、あなたが私の懸念を理解し、あなたの時間と回答に感謝を願っています。 :)

+0

質問を分割する必要があります。ただ一つに答えるのは難しいです。それは言った。最後の質問に。それは自己呼び出しラムダです。それは、それが解析された瞬間に常に実行されることを意味します。通常、関数を定義する場合は、別々に呼び出す必要があります。 –

答えて

1

よりモジュラーなので、最初のアプローチをお勧めします。
Gameインスタンスの参照を他のコンポーネントに渡すだけで問題を解決できるため、ゲームに気づくことができます。あなたは初期化時に参照を渡すことで、もう少しエレガントにそれを行うことができる。もちろん、

Game.level = new Level(); 
Game.level._game = Game; 
//... 
Level.prototype.reset = function() { 
    this.load(this._game.currentLevel); 
}; 

、私はあなたが私のポイントを得たと思う:
オブジェクトはJavaScriptで環状構造を持っていることは珍しくありません。

+0

ありがとう、私はすでにそれについて考えました。アンダースコアを使った理由を説明できますか?元のゲーム機能/オブジェクトとの混乱を防ぐには? –

+0

それは私が可視性を改善するために従う唯一の命名規則です。 jsはプライベートメンバーのネイティブサポートを実際には持っていないので、セキュリティ上の問題ではない場合、私は通常、アンダースコアで始まるプライベートメンバーの名前を付けます。 –

0

私は最後の質問への回答があります

質問:何ですか()();行う?私は時々それがこのように使用beeingて参照してください。

(function() { 
    // Content 
}); 

それは閉鎖を実行自己です。私はここで最も簡単な説明をします。 Javaスクリプト関数を書くときには、それらを実行するために呼び出す必要があります。

例えば、閉鎖を実行

function alertMe(){ 
alert('alerted'); 
} 

alertMe(); // We need to call intentionally for execution of function. 

セルフは別途呼び出す必要はありません。スクリプトがロードされたときのjavascript上記の例では

(function(){ 
alert('alerted'); 
})(); 

は、自動的に実行されます。同じ質問がSO hereに返答されます。

+0

あなたの詳細な説明をありがとう。私はそれが何であるか、それが何をしているのか分からなかったので、私はそれを自分で検索することができませんでした。 –

0

ユーザーのやりとりから始まり、逆に作業してください。設計プロセスが複雑すぎて、あまりにも多くの問題を解決していると、複雑な設計が思い浮かぶ可能性があります。

私の限られたゲーム知識、さらにはゲームプログラミングの程度が低いこと、そしてあなたが私たちに示したことによると、ここでは2つのユーザーのやりとりがあると考えています。

  1. ユーザーは
  2. ユーザーがそのゲームレベルゲームオブジェクトのプロパティはまったく問題ありとして、現在のレベルを保存

をリセットして再生するには、特定のゲームレベルを選びます。私はGameオブジェクトの両方でこれらの相互作用を処理するために必要な2つの方法を考えることができます。

function setLevel(levelNumber) { 
    this.currentLevelNumber = levelNumber; 
    this.level = new Level(levelNumber); 
} 

function resetCurrentLevel() { 
    this.setLevel(this.currentLevelNumber); 
} 

レベルオブジェクトからゲームオブジェクトへの接続を解除し、可能な限りゲームとは独立してレベルをロードします。だからではなく、

game.level = new Level(); 
game.level.load(game.currentLevel); 

をやって、私はそれゲームのオブジェクトのメソッド呼び出し作る、

game.level = new Level(8); 

またはより良いのではとのレベルのコンストラクタそれ自体の上のレベルを初期化するの負担をプッシュしたいです上記の私の例のように - setLevel(n)。このメソッドは、レベルが変更されたときにゲームオブジェクトが一貫していることを確認する責任があります。

game.setLevel(8); 

リセット機能resetCurrentLevelが内部的にこの方法を使用しているため、レベルの変更の取り扱いは、それが新たなレベルをロードするか、現在のレベルをリセットしますか統一されます。

+0

現在のところ、プレイヤーコントロールのほかにユーザーの操作は実際にはありません。ゲームはレベル0で始まりますが、保存状態は後で利用可能になります。あなたはユーザーのやりとりとしてこれを考えることができます。コンストラクタからレベルをロードすることは良い考えです。あなたがinteressted場合は、現在のprogessを見ることができます:http://elias-schuett.de/canvas/iwbtg/私はまだコードを最適化していない、いくつかの機能はかなり醜いですが、私はまだより良いどのシステムでもゲーム速度を一定に保つループ機能。 –