[英]Javascript object interaction (OOP)
很難獲得要搜索的有關OOP的確切特定信息。 我試圖使它盡可能短:
我目前正在開發HTML5中運行的JumpN。 我實際上沒有開發游戲的實際經驗。 但是我知道基本原理應該如何工作。 我只想知道我是否做對了。
我有一個游戲,一個玩家和一個關卡對象。
我當前正在執行以下操作:
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();
他們認為我現在(第一個)正在這樣做,這對我來說似乎更合邏輯。 但是..在關卡對象函數中,我必須檢查游戲對象的各種變量或調用其自身的函數。 因此,我必須在Level對象函數中編寫Game.level.funcName。 但是,由於Game.level實際上並不存在於關卡對象聲明點處,因此感覺有些錯誤和骯臟。 這是另一個示例:
Level.prototype.reset = function() {
this.load(Game.currentLevel);
};
Game.currentLevel是硬編碼的,沒有更好的方法來檢測當前哪個變量處理游戲對象,或者我這樣做的方式完全可以嗎?
因此,基本問題是,使對象彼此交互的最佳方法是什么?
最后一個問題有點離題,但是()()是什么呢? 做? 我有時會看到它像這樣被使用:
(function() {
// Content
});
希望您能理解我的擔憂,感謝您的寶貴時間和答復。 :)
我建議第一種方法,因為它更具模塊化。
您可以通過簡單地將Game
實例的引用傳遞給其他組件來解決您的問題,從而使其他組件知道游戲。
對象在javascript中具有循環結構的情況並不少見:
Game.level = new Level();
Game.level._game = Game;
//...
Level.prototype.reset = function() {
this.load(this._game.currentLevel);
};
當然,您可以通過在初始化時傳遞引用來做到這一點,但是我認為您的意思是正確的。
我有最后一個問題的答案
問題:()()是什么? 做? 我有時會看到它像這樣被使用:
(function() {
// Content
});
這是自我執行的閉包 。 我將在這里提供最簡單的解釋。 當我們編寫Java腳本函數時,需要調用它們來執行它們。
例如,
function alertMe(){
alert('alerted');
}
alertMe(); // We need to call intentionally for execution of function.
自執行閉包不需要單獨調用。
例如,
(function(){
alert('alerted');
})();
腳本加載后,上面的javascript自動執行。 在這里,同樣的問題也被回答。
我認為您的處事方式看起來不錯。 關於問題的最后一部分,這稱為立即函數。 該函數在聲明后立即被調用。 您可以在此處查看更多信息: http : //javascriptmountain.com/2011/06/functions/immediate-functions-in-javascript-the-basics/
從用戶交互開始,然后向后工作。 如果設計過於靈活或解決了太多問題,那么可能會過多地參與設計過程並提出復雜的設計。
基於我對游戲的有限了解,甚至更少的游戲編程知識,以及您向我們展示的內容,我相信您在這里要處理兩種用戶交互。
將當前關卡存儲為游戲對象的屬性非常好。 我可以想到處理這些交互所需的兩種方法,這兩種方法在Game
對象上都是有意義的。
function setLevel(levelNumber) {
this.currentLevelNumber = levelNumber;
this.level = new Level(levelNumber);
}
function resetCurrentLevel() {
this.setLevel(this.currentLevelNumber);
}
我會斷開從Level對象到Game對象的連接,並盡可能獨立於游戲加載一個關卡。 所以不要做
game.level = new Level();
game.level.load(game.currentLevel);
我會像這樣在Level構造函數上加重初始化一個級別的負擔,
game.level = new Level(8);
甚至更好的是,使其成為對Game對象的方法調用,如我上面的示例setLevel(n)
。 該方法將負責確保級別更改時游戲對象的一致性。
game.setLevel(8);
由於reset函數resetCurrentLevel
內部使用此方法,因此無論是加載新級別還是重置當前級別,都將統一級別更改的處理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.