2016-07-20 56 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

相关问题