簡體   English   中英

Phaser3:檢測精靈碰撞

[英]Phaser3: Detecting sprite collision

使用Phaser 3,我無法檢測兩個精靈之間的碰撞。 我一直在上下文檔和幾個例子,大多數是從Phaser 2過時的,並且由於某種原因它只是不起作用。

我要去的是一系列mapTiles和一個玩家角色。 現在,我將牆壁地板都傳遞到對撞機只是為了測試目的而沒有任何事情發生。

正如你在下面的代碼中看到的,我確實有一個使用this.enemies數組的對撞機,所以我不確定為什么它不能使用this.mapTiles 此外,在檢查我的mapTiles的類型時,它們每個都被標記為Sprite ,我的敵人顯然被標記為ArcadeSprite ,這可能是問題嗎?

在此輸入圖像描述

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
  }
}

編輯

我決定減少一些代碼,並給出一個小的3行示例,說明什么不起作用。

這是一個只有兩個精靈,仍然無法正常工作。 這個小例子將放在我的場景創建方法中。

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)

碰撞不起作用,因為精靈沒有物理體。

如你所知,mapTiles是Sprite類型,其中敵人是ArcadeSprite意味着他們有一個物理體。

創建它們的不同之處在於工廠使用。

this.add.sprite(...)使用GameObject工廠(Sprites是this.physics.add.sprite(...) ), this.physics.add.sprite(...)使用物理Arcade工廠,它創建一個精靈,並給它一個物理體。

因此,在最小示例的代碼中,使用this.physics.add.sprite(...)更改您對使用物理工廠創建sprite的調用,它應該可以工作。

我不知道你的地圖生成器代碼是什么樣的,但我認為它將是一個類似的修復。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM