TypeScript,在不同的Phaser.States中重用相同的功能

时间:2016-07-20 08:02:15

标签: typescript phaser-framework

我已经使用Phaser创建了一款游戏,我想要#34; port"它转到了TypeScript。当我想从几个不同的状态调用相同的函数时,我遇到了问题。

在其他一些变量和功能中,例如有音乐开/关功能和将整个屏幕淡入黑色的功能。我想在不同的Cannot find name .. MainMenu,LevelSelect和Game中重复使用它们。所以我将它们作为全局变量放在MyGameProj.Client命名空间中,但是当我从MainMenu状态调用它们时会出现错误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.

我知道全局变量和函数被认为是一件坏事,但我的问题是;
如何在几个不同的Phaser.States中重用一个函数?

我尝试在启动状态下添加全局变量和函数,如下所示:

[Boot.ts]

module MyGameProj.Client {

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

但是当我尝试从MainMenu状态访问switchMusic时,它会出现错误&#39;找不到名称switchMusic&#39;。但是,可以在Boot状态下使用和调用它们。

[MainMenu.ts]

>>> a = [('policy', 871), ('insurance', 382), ('life', 357), ('request', 270), ('call', 260)]
>>> dict(a)

1 个答案:

答案 0 :(得分: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部分。