我已经使用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)
答案 0 :(得分:1)
如果您在自己的模块/命名空间中定义变量/函数,就像使用MyGameProj.Client
一样,那么这些变量/函数不被视为全局变量/函数。
为了使用来自另一个命名空间/模块的MyGameProj.Client
中的内容,您需要在函数/变量前面加上该模块的路径:
MyGameProj.Client.switchMusic(this.game, true);
此外,如果两个模块(MyGameProj.Client
和MyGameProj.Client
)都位于不同的文件中,那么您需要让编译器知道在哪里找到MyGameProj.Client
。
如何做到这一点取决于你如何加载其他脚本,你可以导入它:
import * as m from "MyGameProj.Client";
或引用它:
/// <reference path="MyGameProj.Client.ts" />
您应该阅读官方文档的Namespaces and Modules和Module Resolution部分。