如果范围不同,如何从对撞机方法调用类中的函数?

时间:2018-11-01 01:07:23

标签: javascript phaser-framework

我正在使用WebPack来构建游戏,但遇到了范围问题。我会尽力解释。

我的TestScene类文件:

import 'phaser';
import Npcs from 'modules/Npcs.js';

const npcs = new Npcs()

export class TestScene extends Phaser.Scene {

  constructor () {
    super('TestScene')
  }

  preload(){...}

  create(){
    this.physics.add.collider(
      this.player,
      this.bombs,
      npcs.hitBomb,
      null,
      this
    )
  }

}

我的Npcs类文件:

import 'phaser';

const gameplayStates = new GameplayStates()

export default class Npcs {

  hitBomb (player, bomb) {
    this.physics.pause();
    player.setTint(0xff0000);
    this.entityDestroy()
  }

  entityDestroy () {
  console.log('destroyed')
  }

}

this.playerthis.bombs到位,并按照我希望的各种方式按预期工作。

collider方法中的回调具有this(testScene)作为上下文,因此this.entityDestroy()似乎不再起作用并引发错误:
 app.bundle.js:116068 Uncaught TypeError: this.entityDestroy is not a function

我怀疑这是因为从对撞机调用方法时,npcs类不是this的范围。

使用collider方法解决此问题的正确方法是什么?

谢谢,

非常感谢您的帮助。 MHC

1 个答案:

答案 0 :(得分:0)

我问过www周围,并得到了令人满意的解决方案。

我得到的主要解决方案是更改collider方法中的上下文。像这样:

this.physics.add.collider(
  this.player,
  this.bombs,
  npcs.hitBomb,
  null,
  npcs
)

npcs类成为hitBomb函数的上下文的位置。该解决方案的问题在于,我无法再在npcs函数中引用this(场景引用)。 我发现最好的解决方法是添加更多行代码:

this.physics.add.collider(
  this.player,
  this.bombs,
  function (player, bomb) {
    this.physics.pause();
    npcs.hitBomb(player, bomb);
  },
  null,
  this
)

这具有更多的代码行,但是它使我可以保留正在调用collider函数的场景的范围并建立npcs类的范围。

感谢所有花时间与我聊天并帮助我找到解决方案的人。