Как я могу вызвать функцию в классе из метода коллайдера, когда это другая область? - PullRequest
0 голосов
/ 01 ноября 2018

Я использую 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.player и this.bombs на месте и работают, как и ожидалось, так, как я планировал.

Обратный вызов в методе коллайдера имеет this (testScene) в качестве контекста, поэтому this.entityDestroy() больше не работает и выдает ошибку:
app.bundle.js:116068 Uncaught TypeError: this.entityDestroy is not a function.

Я подозреваю, что это потому, что класс npcs не является областью действия this, когда метод вызывается из коллайдера.

Как правильно обойти это с помощью метода коллайдера?

Спасибо всем,

Ваша помощь очень ценится. MHC

1 Ответ

0 голосов
/ 08 ноября 2018

Я спросил по www и нашел удовлетворительное решение моей проблемы.

Основное решение, которое я получил больше всего, это изменить контекст в методе коллайдера. Вот так:

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

Где класс npcs становится контекстом для функции hitBomb. Проблема с этим решением заключается в том, что я больше не могу ссылаться на this (ссылка на сцену) в функции npcs. Лучшая работа, которую я нашел, которая добавляет больше строк кода:

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

Это имеет больше строк кода, но позволяет мне сохранить область действия сцены, из которой я вызываю функцию коллайдера, и установить область действия класса npcs.

Спасибо всем, кто нашел время поболтать со мной и помочь мне найти решение.

...