在相位器3中更改场景的问题

时间:2019-01-07 14:54:58

标签: javascript phaser-framework

我正在使用Phaser 3制作游戏,其框架为Michael Hadley在其Phaser 3 / matter.js教程(https://itnext.io/modular-game-worlds-in-phaser-3-tilemaps-5-matter-physics-platformer-d14d1f614557)中所做的游戏,但我在更改场景时遇到问题在第一级结束时过渡到第二级。我按照他的方式将所有游戏划分为.js模块,所以我已经在两个不同的.js文件中完成了第一级和第二级的操作,并将它们都添加为包含config函数的index.js文件中的场景:

import MainScene from "./main-scene.js";
import MainScene2 from "./main-scene2.js";

let config = {
  type: Phaser.AUTO,
  width: 1280,
  height: 720,
  backgroundColor: "#000c1f",
  parent: "game-container",
  scene: [MainScene, MainScene2],
  pixelArt: true,
  physics: { default: "matter" },
  plugins: {
    scene: [
      {
        plugin: PhaserMatterCollisionPlugin, // The plugin class
        key: "matterCollision", // Where to store in Scene.Systems, e.g. scene.sys.matterCollision
        mapping: "matterCollision" // Where to store in the Scene, e.g. scene.matterCollision
      }
    ]
  }
};

let game = new Phaser.Game(config);

两个场景是这样开始的:

export default class MainScene extends Phaser.Scene

export default class MainScene2 extends Phaser.Scene

在MainScene场景的末尾有触发场景转换的代码:

if(this.player.sprite.x > 15400){
    this.scene.start(MainScene2);
}     

我发现自己遇到的问题是,当我尝试运行游戏时,它显示黑屏:

Uncaught Error: Cannot add a Scene with duplicate key: default

所以我尝试在第二个场景中删除默认设置,然后收到错误消息:

Uncaught SyntaxError: The requested module './main-scene2.js' does not provide an export named 'default'

我已经尝试在移相器实验示例页面(https://labs.phaser.io/index.html?dir=&q=)上搜索所有场景教程,但是所有场景教程的场景代码中都没有显示默认值。当他编写了我在游戏中使用的导出代码时,我试图再次阅读用作框架的第一篇教程,但是他没有说我如何添加另一个关卡作为场景或如何不使用它。默认导出,我在其他在线代码中已经看到过,但从未完全了解。我什至尝试将所有三个.js文件合并在一起,以便将两个场景和配置文件放在同一文件中,但是错误是相同的。

我确定两个场景单独播放时它们可以正常工作,我只是不知道如何将它们作为第一级和第二级连接。

我确定答案确实很愚蠢,而且我做错了什么,但是我尝试了很多在线搜索,但没有找到与之类似的东西。

这是我第一次在这里写问题,所以不确定是否提供足够的信息,因此我在这里链接了三个代码沙箱链接;第一个具有index.html和index.js来仅使第一级工作,第二个使第二级工作,而第三种是我尝试连接两个级别的方式:

1:https://codesandbox.io/s/xv42ww7joo

2:https://codesandbox.io/s/l9zr5yqm49

3:https://codesandbox.io/s/2p22o6rnly

非常感谢您的提前帮助,距我使用移相器只有一个月左右的时间,而且我很难理解一些事情,但是从现在开始,我一直在网上找到答案但这一直困扰着我一段时间,但我一无所获。

2 个答案:

答案 0 :(得分:2)

您需要在两个场景中都添加一个构造函数,并使用键名调用super。

因此在MainScene中将是

constructor() {
  super("main");
}

它将在MainScene2中

constructor() {
  super("main2");
}

答案 1 :(得分:0)

tontheman回答的是正确的。只是要补充一点,如果要扩展Phaser.Scene,则需要传递string作为密钥或传递Object作为配置。您可以参考Phaser 3 API Documentation - Class:Scene以获得更多指导。