Phaser3: обнаружение столкновения спрайтов - PullRequest
0 голосов
/ 24 июня 2019

Использование Phaser 3 и у меня проблемы с обнаружением столкновения между двумя спрайтами.Я пробежал вверх и вниз по документам и нескольким примерам, в основном устаревшим из Phaser 2, и по какой-то причине он просто не работает.

У меня есть массив mapTiles и игрок персонаж.Прямо сейчас у меня есть стены , этажи и двери , которые все передаются на коллайдер только для целей тестирования, и ничего не происходит.

Как видно из приведенного ниже кода, у меня есть коллайдер, работающий с массивом this.enemies , поэтому я не уверен, почему он не работает с this.mapTiles .Кроме того, при проверке типов моих mapTiles каждый из них помечается как Sprite , а мои враги явно помечаются как ArcadeSprite , может ли этобыть проблемой?

enter image description here

Dungeon.js

import 'phaser';

import {
  Enemy,
  MapGenerator,
  PlayerCharacter
} from '../game_objects/index'

class DungeonScene extends Phaser.Scene {
  constructor() {
    super({ key: 'DUNGEON' });
    this.mapTiles = []
    this.walls = []
    this.player = null
    this.enemies = []
    this.entities = []
  }

  preload() {
    this.load.spritesheet('sprites', 'src/arial10x10.png', { frameWidth: 10, frameHeight: 10 })
  }

  create() {
    this.createMap()
    this.player = new PlayerCharacter('PC', this, 9, 9, 'sprites', 32, { health: 100, atk: 10 }, [])
    this.enemies = [
      new Enemy('E1', this, 64, 64, 'sprites', 100, { health: 100, atk: 10 }, [])
    ]

    this.keyboard = this.input.keyboard.addKeys('W, A, S, D')

    // this works but not by default; aka it requires a callback to do anything
    // which is odd because examples show it working without a callback
    this.physics.add.collider(this.player, this.enemies, () => {
      this.scene.restart()
    })
    // DOES NOT WORK
    this.physics.add.overlap(this.player, this.mapTiles, () => console.log('overlap'))
    // DOES NOT WORK
    this.physics.add.collider(this.player, this.mapTiles, () => console.log('collider'))
  }

  createMap() {
    const mapGenerator = new MapGenerator(this, 39, 39, 9, 9)
    mapGenerator.create()
    this.mapTiles = mapGenerator.mapTiles
  }
}

Edit

Я решил сократить некоторыекод, а также дать небольшой пример из 3 строк, что не работает.

Это один с двумя спрайтами и все еще не работает.Этот небольшой пример будет помещен в мои сцены метод create .

this.foo = this.add.sprite(10, 10, 'sprites', 32)
this.bar = this.add.sprite(30, 30, 'sprites', 2)
this.physics.add.collider(this.foo, this.bar)

1 Ответ

0 голосов
/ 29 июня 2019

Столкновение не работает в вашем, потому что спрайты не имеют физических тел.

Как вы заметили, mapTiles имеют тип Sprite, где врагами являются ArcadeSprite, что означает, что они имеют физическое тело.

Разница в их создании заключается в использовании фабрики.

this.add.sprite(...) использует фабрику GameObject (спрайты - это GameObjects), а this.physics.add.sprite(...) использует фабрику физики Аркады, которая создает спрайт, идает ему физическое тело.

Итак, в вашем коде для минимального примера измените ваши призывы к созданию спрайтов, чтобы сделать это с фабрикой физики, используя this.physics.add.sprite(...), и это должно работать.

Iне знаю, как выглядит код вашего генератора карт, но я предполагаю, что это будет аналогичное исправление.

...