2016-07-20 53 views
0

我已經使用Phaser創建了一個遊戲,並且我想將它「移植」到TypeScript。當我想從幾個不同的狀態調用相同的函數時,我遇到了一個問題。TypeScript,在不同Phaser.States中重複使用相同的功能

在其他一些變量和功能中,例如有音樂開/關功能和將整個屏幕淡化爲黑色的功能。我想在不同的Phaser.States MainMenu,LevelSelect和Game中重複使用它們。所以我把它們作爲全局變量放在MyGameProj.Client命名空間中,但是當我從MainMenu狀態調用它們時,這會給出錯誤Cannot find name ..

我知道全局變量和函數被認爲是壞東西,但我的問題是;
如何在幾個不同的Phaser.States中重新使用一個函數?

我試着加入全局變量和函數在我開機狀態下,像這樣:

[Boot.ts]

module MyGameProj.Client { 
    var SOUND_IS_ON = true; 
    var MUSIC_IS_ON = true; 

    function switchMusic(game, onoff) { 
     MUSIC_IS_ON = onoff; 
     // .. etc. 
    } 

    export class Boot extends Phaser.State { 
     preload() { 
      switchMusic(this.game, true); // no errors 
      //.. etc. 

但是當我嘗試訪問switchMusic我MainMenu狀態,它給出了一個錯誤'無法找到名稱switchMusic'。但是,它們可以在Boot狀態下使用和調用。

[MainMenu.ts]

module MyGameProj.Client { 

    export class MainMenu extends Phaser.State { 
     create() { 
      switchMusic(this.game, true); // <- error; Cannot find name switchMusic 
      //.. etc. 

回答

1

如果你定義變量/函數自己的模塊/命名空間裏,你有沒有MyGameProj.Client那麼這些不被認爲是全球性的。

爲了使用你所擁有的MyGameProj.Client從另一個命名空間/模塊,您需要與所述模塊的路徑前綴的函數/變量:

MyGameProj.Client.switchMusic(this.game, true); 

另外,如果兩個模塊(MyGameProj.ClientMyGameProj.Client)駐留在不同的文件中,那麼您需要讓編譯器知道在哪裏可以找到MyGameProj.Client
如何做到這一點取決於你如何加載其他腳本,您可以將其導入:

import * as m from "MyGameProj.Client"; 

或引用它:

/// <reference path="MyGameProj.Client.ts" /> 

你應該閱讀官方文檔的Namespaces and ModulesModule Resolution節。

+0

感謝您的快速回復。我剛剛開始使用TypeScript,想象中的命名空間和模塊是相同的,所以我一定會檢查出建議的鏈接。 – BdR

相關問題