在Phaser3中的场景之间切换

时间:2019-12-21 20:58:07

标签: typescript phaser-framework game-development

所以我的 Phaser3 package.json中的版本是 3.21.0 )应用中有两个场景,我希望在两个场景之间切换副作用。第一个场景是用于处理高分菜单,第二个场景是游戏本身。

相关代码

app.ts文件如下所示:

const config = {
    title: '<game-name>',
    width: 800,
    height: 600,
    parent: 'game',
    scene: [MenuScene, GameScene],
};

export class GameName extends Phaser.Game {
    constructor(config: any) {
        super(config);
    }
}

window.onload = () => new GameName(config);

MenuScene.ts-删除了不适用的部分:

class MenuScene extends Phaser.Scene {
    constructor() { super({key: 'MenuScene'}); }

    create():void {
       console.log('create menuscreen');
       const enter = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.ENTER);
       enter.on('down', () => { this.scene.start('GameScene'); }
    }
}

GameScene.ts-还删除了不相关的代码段:

class GameScene extends Phaser.Scene {
    constructor() { super({key: 'GameScene'}); }

    create = ():void => {
       console.log('create gamescreen');
       const esc = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.ESC);
       esc.on('down', () => { this.scene.start('MenuScene'); }
    }
}

问题和我的问题

因此,一旦我重复按 Enter Esc 只是为了切换提供的解决方案,它似乎并没有清除背景中的场景。在console上切换几次(在下面的示例中为6次)后,我看到以下内容: console-screenshot

我已经尝试在this.scene.stop()之前致电this.scene.start('<scene-key>'),但仍然是同样的问题。我已经在阅读Phaser3 Scenes transitions问题,但似乎无法回答我的问题。有人告知start()应该清理或关闭未使用的设备。

那么我应该如何在场景之间正确切换或清理当前未使用的场景?

谢谢!

1 个答案:

答案 0 :(得分:1)

这就是我的做法

1.-游戏中的场景可暂停

场景scene_pause将在game_scene上方,因为最后一个场景将是顶部场景

isPaused = this.scene.isPaused('scene_game');
if (false === isPaused) {
    this.scene.pause('scene_game');
}
const isNull = this.scene.get('scene_pause');
if (null === isNull) {
    this.scene.add('pause_scene', PauseScene, true);
}

然后当y恢复游戏时

isActive = this.scene.isActive('scene_pause');
if (true === isActive) {
    this.scene.remove('scene_pause');
}
isPaused = this.scene.isPaused('scene_game');
if (true === isPaused) {
    this.scene.resume('scene_game');
}

2.-切换场景以结束游戏

this.scene.stop('scene_game'); // stop executing the Update 1rst
... // save the state and score
this.scene.remove('scene_game'); // I remove the scene, because I will add again when start the game
this.scene.stop('scene_ui');
this.scene.switch('scene_game_over');