TypeScript,在不同 Phaser.States 中重复使用相同的函数
TypeScript, re-use same function in different Phaser.States
我使用 Phaser 创建了一个游戏,我想 "port" 将其转交给 TypeScript。当我想从几个不同的状态调用同一个函数时,我 运行 遇到了问题。
在一些其他变量和函数中,例如音乐 on/off 函数和将整个屏幕淡化为黑色的函数。我想在不同的 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.
但是当我尝试从 MainMenu 状态访问 switchMusic 时,出现错误 'Cannot find name switchMusic'。但是,它们可以在引导状态下使用和调用。
[MainMenu.ts]
module MyGameProj.Client {
export class MainMenu extends Phaser.State {
create() {
switchMusic(this.game, true); // <- error; Cannot find name switchMusic
//.. etc.
如果您在自己的 module/namespace 中定义 variable/functions,就像您对 MyGameProj.Client
所做的那样,那么这些不被认为是全局的。
为了使用您在 MyGameProj.Client
中从另一个 namespace/module 获得的内容,您需要在 function/variable 前面加上该模块的路径:
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 and Module Resolution 部分。
我使用 Phaser 创建了一个游戏,我想 "port" 将其转交给 TypeScript。当我想从几个不同的状态调用同一个函数时,我 运行 遇到了问题。
在一些其他变量和函数中,例如音乐 on/off 函数和将整个屏幕淡化为黑色的函数。我想在不同的 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.
但是当我尝试从 MainMenu 状态访问 switchMusic 时,出现错误 'Cannot find name switchMusic'。但是,它们可以在引导状态下使用和调用。
[MainMenu.ts]
module MyGameProj.Client {
export class MainMenu extends Phaser.State {
create() {
switchMusic(this.game, true); // <- error; Cannot find name switchMusic
//.. etc.
如果您在自己的 module/namespace 中定义 variable/functions,就像您对 MyGameProj.Client
所做的那样,那么这些不被认为是全局的。
为了使用您在 MyGameProj.Client
中从另一个 namespace/module 获得的内容,您需要在 function/variable 前面加上该模块的路径:
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 and Module Resolution 部分。