2017-03-15 70 views
0

我对Javascript和Typescript都是新手。我用Javascript编写了一个简单的Phaser游戏,现在想用Typescript ES2015(ES6)重新编写它。
我已经扩展Phaser.Game类,以便通过它的构造函数传递一个变量。这用于创建websocket。这个套接字可以作为Game或State类型的一个属性存在(我在示例中显示了这一点)。
我已经扩展Phaser.State类以包含需要通过websocket的.onmessage成员函数由websocket数据设置的属性。如何使用Phaser正确使用Typescript扩展类

为了完整性,我已经展示了createWebsocket作为函数,实际上它是其中一个类的成员函数。

function createWebsocket(wsPath, callback){ 
    var ws = new WebSocket(wxPath); 
    ws.onmessage = callback; 
    return ws; 
} 

export class Game extends Phaser.Game { 
    csocket: WebSocket; 
    constructor(wsPath, container) { 
    this.state.add('Boot', Boot, false); 
    this.csocket = createWebsocket(wsPath, this.handleMsg); 
} 

export class Boot extends Phaser.State { 
    csocket: WebSocket; 
    constructor(){super();} 
    my_value: number; 
    setMyValue(value) {this.my_value = value}; 
    this.csocket = createWebsocket(wsPath, this.handleMsg); 
} 

我该如何将数据从扩展的Game类实例传递到Boot实例或访问Boot实例的createWebsocket成员函数?

如果我在游戏中使用以下内容;

state = this.state.getCurrentState(); 
state.setValue() 

我得到了(反)编译器错误,如getCurrentState()返回基类的实例并不即使扩展类的类型传递给state.add功能

我的扩展类看到没有办法将wsPath传递给Boot类的构造函数,因为类型被传递给.add函数。

回答

0

简单的答案总是最好的。所以,回答我自己的问题......

虽然这些例子没有清楚地表明这一点,但this.state.add调用不仅仅允许一个类,它还允许一个类实例。只需使用新的。

export class Game extends Phaser.Game { 
    csocket: WebSocket; 
    constructor(wsPath, container) { 
     var bootState = new Boot(wsPath); 
     this.state.add('Boot', bootState, false); 
...