将 Phaser Game 与 React 作为组件集成

Integrate Phaser Game with React as component

我是 React 的新手,我想为我的 Phaser 游戏制作一个组件以将其插入到 React 项目中。

我的游戏组件:

import React, { Component } from 'react'
import Phaser from 'phaser'

class Game extends Component {

  constructor() {
    super();

    this.config = {
        type: Phaser.AUTO,
        width: 700,
        height: 600,
        parent: "game",
        pixelArt: true,
        physics: {
            default: 'arcade',
            arcade: {
                gravity: { y: 0 }
            }
        },
        scene: {
            preload: function(){
              this.load.image('tiles', process.env.PUBLIC_URL + '/assets/TILES.png');
              this.load.tilemapTiledJSON("map", process.env.PUBLIC_URL + "/assets/MAP.json");
            },
            create: function(){
              const map = this.make.tilemap({ key: "map" });
              const tileset = map.addTilesetImage("TILES", "tiles");

              const worldLayer = map.createLayer("World", tileset, 0, 0);
            },
            update: function(){

            }
        }
    };

    this.game = new Phaser.Game(this.config);


  }

  render() {
    return (<div id="game"></div>)
  }
}

export default Game;

index.js:

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import Game from './Game';
import reportWebVitals from './reportWebVitals';

ReactDOM.render(
  <React.StrictMode>
    <Game />
  </React.StrictMode>,
  document.getElementById('root')
);
reportWebVitals();

从这张图可以看出,图片重复了4次,为什么?我怎样才能解决这个问题?我已经尝试将固定大小设置为 div 但它没有用。

一个解决方案是将 Phaser.Game 对象“游戏”的创建移动到方法 componentDidMount (link to the documentation) 中。 因为如果调用 new Phaser.Game,而 parent 不在 DOM 中,则将添加 canvas,忽略父项。

只需将此方法添加到 Game class:

componentDidMount() {
    this.game = new Phaser.Game(this.config);
 }

我不确定这是否是最好的方法,但它有效(在我的演示应用程序上)

Side-Note: 在我的演示中我没有得到 4 张图片/(phaser-)canvas 我只有 2 张. 在使用我的解决方案时,它下降到通常的 canvas.