簡體   English   中英

Javascript對象交互(OOP)

[英]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/

從用戶交互開始,然后向后工作。 如果設計過於靈活或解決了太多問題,那么可能會過多地參與設計過程並提出復雜的設計。

基於我對游戲的有限了解,甚至更少的游戲編程知識,以及您向我們展示的內容,我相信您在這里要處理兩種用戶交互。

  1. 用戶選擇要玩的特定游戲級別
  2. 用戶重置該游戲級別

將當前關卡存儲為游戲對象的屬性非常好。 我可以想到處理這些交互所需的兩種方法,這兩種方法在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM