我可以从 DOM 触发 Phaser 3 事件吗?

Can I fire Phaser 3 events from DOM?

提问人:Neffer Barragan 提问时间:1/17/2023 最后编辑:winner_joinerNeffer Barragan 更新时间:1/17/2023 访问量:168

问:

我正在尝试从 DOM 触发 Phaser 3 事件,就像我在互联网上找到的这个示例一样: “当你创建游戏时,游戏实例是可以访问的,你可以从这个实例访问你想要的场景中的所有内容,并执行类似的事情const game = new Phaser.Game(config);const scene = game.scene.keys.sceneName

textareaElement.addEventListener("change", function(event) {
    const text = textareaElement.value;
    scene.updateGameTextFromTextarea(text);
});

这是我的项目配置:

const config = {
    // Phaser.AUTO, intenta usar WebGL y si el navegador no lo  tiene, usa canva.
    type: Phaser.AUTO,
    parent: 'game-container',
    width: 650,
    height: 522,
    scene: [MainScene], 
    scale: {
        mode: Phaser.Scale.FIT
    },
    dom: {
        createContainer: true
    },
    physics: {
        default: 'arcade',
        arcade: {
        // debug: true,
        // gravity: { y: 350 }
        }
    }
}

// Inicializacion del objeto
game = new Phaser.Game(config)`

我实际上可以从控制台访问游戏,但无法触发事件。

const scene = game.scene.keys.MainScene
scene.greeting()

获取:

未捕获的 TypeError:无法读取 undefined 的属性(读取“greeting”) 在 :1:7

代码: https://github.com/Neffer2/bull-rompecabezas.git

JavaScript DOM 事件 phaser-framework

评论


答:

1赞 winner_joiner 1/17/2023 #1

有两个问题:

第一个问题是,场景的名称不是,这是构造函数的值gameSceneMainScene

第二个问题是场景/游戏实例没有立即填充,您必须等待一段时间。我在演示中用 模拟了这一点,或者您也可以单击 从场景中调用相同的函数。setTimeoutButton

这里有一个简短的演示:

document.body.style = 'margin:0;';

class MainScene extends Phaser.Scene {
    constructor(){
        super('gameScene');
    } 
    
    test(){
        console.info('Hello From Scene');
    }
}

var config = {
    type: Phaser.AUTO,
    width: 536,
    height: 183,
    physics: {
        default: 'arcade',
        arcade: {            
            gravity:{ y: 100 },
            debug: true
        }
    },
    scene: [ MainScene ],
    banner: false
}; 

var game = new Phaser.Game(config);

setTimeout( () => game.scene.keys.gameScene.test(), 1000);  // Wait for generation

document.querySelector('button').addEventListener('click', () => game.scene.keys.gameScene.test())
<script src="//cdn.jsdelivr.net/npm/[email protected]/dist/phaser.js"></script>

<button id="button"> Fire from the DOM </button><br>

评论

0赞 Neffer Barragan 1/17/2023
天哪,我不能相信这是一个错误的名字🤦🏻 ♂️好吧,多亏了你的解释,我在短时间内学到了很多东西。非常感谢。
0赞 winner_joiner 1/17/2023
@NefferBarragan 当然,我们一开始都犯过类似的错误,它会变得更好。:)顺便说一句:如果可能并且您的问题已解决,您能否通过单击赞成箭头旁边的复选标记来接受我的回答。提前致谢,玩得开心
0赞 Neffer Barragan 1/18/2023
对不起,我一读到你的答案就做了更改,忘记标记它。再次非常感谢你