Phaser 3:从另一个 class 调用函数

Phaser 3: Call function from another class

我在文件 a.ts:

中创建了 updateCanvas() 函数
export class loadscene extends Scene {
  textures1!: any
  textures2!: any
  textures3!: any
  constructor() {
    const key = 'loadscene'
    super(key)
  }
  updateCanvas(scene){
    switch (scene) {
      case 'canvastextures1':
        this.textures1.update()
        break
      case 'canvastextures2':
        this.textures2.update()
        break
      case 'canvastextures3':
        this.textures3.update()
        break
    }
  }
}

在文件 b.ts 中,我调用此功能但无法正常工作:

import { loadscene } from './load.scene'
export class BattleScene extends Scene {
  loadScene!: loadscene
...
      this.loadScene = new loadscene()
      this.loadScene.updateCanvas(tile.body.gameObject.texture.key)

我可以在内部文件中使用函数,但不能从另一个文件中调用。有人有什么想法吗?谢谢。

好吧,我认为问题出在这一行 this.loadScene = new loadscene()
当您初始化 属性 this.loadScene 时,您必须 获取 创建的场景,而不是创建新场景。 像这样:this.loadScene = this.scene.get('loadscene').

这应该有效 (如果编译器抛出错误,您应该将 属性 从 loadScene!: loadscene 更改为 loadScene!: any,或者强制转换可能有效像 this.loadScene = (this.scene.get('loadscene') as loadscene )).

P.s.: 我会更改方法的参数 updateCanvas(scene)scene 可能会被误解,因为参数是纹理的key.
并以大写字母开头 class 名称。所以 class LoadScene... 会更好。

更新:
codepen 中的代码显示,我将如何使用 typescript 从另一个场景调用函数 https://codepen.io/akumagamo/pen/WNMQWJe
在这个代码笔中,我正在从不同的场景更改纹理

这里是相关代码(去掉贴图部分):.

class FirstScene extends Phaser.Scene {
  constructor() {
    super('firstScene')
  }
  
  create(){
    console.log('Create Call in First Scene!')
    this.scene.start('secondScene')
  }
  
  testME(){
    console.info('TEST ME')
    return `called function "testME" from scene:${this.scene.key}`;
  }
  
}

class SecondScene extends Phaser.Scene {
  parentScene: any
  constructor() {
    super('secondScene')
    
  }
  
  create(){
    let text = this.add.text(10,10, '"Create" in Second Scene!', {'color':'#fff'});
    this.parentScene = this.scene.get('firstScene')
    let newLine = this.parentScene.testME();
    text.setText(text.text + '\n' + newLine);
  }
}