2016-07-20 13 views
0

Ich habe ein Spiel mit Phaser erstellt, und ich möchte es in TypeScript "portieren". Ich stoße auf ein Problem, wenn ich dieselbe Funktion aus mehreren verschiedenen Zuständen aufrufen möchte.TypeScript, verwenden Sie die gleiche Funktion in verschiedenen Phaser.States

Neben einigen anderen Variablen und Funktionen gibt es zum Beispiel eine Musik-Ein/Aus-Funktion und eine Funktion zum Ausblenden des gesamten Bildschirms auf Schwarz. Ich möchte diese in den verschiedenen Phaser.States MainMenu, LevelSelect und Game wiederverwenden. Also lege ich sie als globale Variablen in den MyGameProj.Client-Namespace, aber dies gibt einen Fehler Cannot find name .., wenn ich sie aus dem MainMenu-Zustand aufrufen.

Ich weiß, dass globale Variablen und Funktionen als eine schlechte Sache angesehen werden, aber meine Frage ist;
Wie kann ich eine Funktion in mehreren verschiedenen Phaser.States wiederverwenden?

Ich habe versucht, die globalen Variablen und Funktionen in meinem Boot-Zustand hinzufügen, etwa so:

[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. 

Aber dann, wenn ich versuche, meine die switchMusic zuzugreifen MainMenu state, gibt es einen Fehler "Kann den Namen switchMusic nicht finden". Sie können jedoch im Boot-Status verwendet und aufgerufen werden.

[MainMenu.ts]

module MyGameProj.Client { 

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

Antwort

1

Wenn Sie definieren Variable/Funktionen in Ihrem eigenen Modul/Namensraum, wie Sie mit MyGameProj.Client tat dann werden diejenigen, die nicht global betrachtet.

Um zu verwenden, was Sie in MyGameProj.Client aus einem anderen Namensraum/Modul haben Sie die Funktion/Variable mit dem Pfad, dass das Modulpräfix müssen:

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

Auch wenn beide Module (MyGameProj.Client und MyGameProj.Client) sich in verschiedenen Dateien befinden, dann müssen Sie den Compiler wissen lassen, wo Sie MyGameProj.Client finden können.
Wie das zu tun, hängt davon ab, wie Sie andere Skripte laden, können Sie es entweder importieren:

import * as m from "MyGameProj.Client"; 

oder verweisen Sie:

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

Sie die Namespaces and Modules und Module Resolution Abschnitte der offiziellen Dokumente lesen sollte .

+0

Vielen Dank für die sehr schnelle Antwort. Ich habe gerade mit TypeScript begonnen, und die Namenspakete und Module waren die gleichen, also werde ich auf jeden Fall die vorgeschlagenen Links überprüfen. – BdR

Verwandte Themen