Могу ли я запускать события Phaser 3 из DOM?

Я пытаюсь запустить событие Phaser 3 из DOM, как я читал в этом примере, который я нашел в Интернете: "Экземпляр игры доступен при создании игры с чем-то вроде 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()

получать:

Uncaught TypeError: не удается прочитать свойства неопределенного (чтение «приветствие») в :1:7

Код: https://github.com/Neffer2/bull-rompecabezas.git

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Есть две проблемы:

Первая проблема заключается в том, что имя сцены gameScene, а не MainScene , это значение из конструктора.

Вторая проблема заключается в том, что экземпляр сцены/игры не заполняется сразу, вам придется немного подождать. Я смоделировал это в демонстрации с помощью setTimeout, или вы также можете щелкнуть Button, чтобы вызвать ту же функцию из сцены.

Вот короткая демонстрация:

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>

О боже, не могу поверить, что это было неправильное имя 🤦🏻‍♂️ Ну, я многому научился за короткое время благодаря вашему объяснению. Большое спасибо.

Neffer Barragan 17.01.2023 16:03

@NefferBarragan Конечно, мы все делали одинаковые ошибки в начале, дальше будет лучше. :) Кстати: если возможно, и ваш вопрос решен, не могли бы вы принять мой ответ, нажав на галочку рядом со стрелками вверх. Заранее спасибо и получайте удовольствие от фазера

winner_joiner 17.01.2023 16:26

Извините, я внес изменение, как только прочитал ваш ответ, и забыл его отметить. Большое спасибо еще раз

Neffer Barragan 17.01.2023 21:15

Другие вопросы по теме