User Manual

Общение

События являются удобным способом общения между скриптами для реагирования на происходящие события без проверки каждого кадра.

Движок PlayCanvas содержит простой способ добавления обработки событий к любому объекту:

pc.events.attach(объект);

Это добавит методы: on(), off(), fire() и hasEvent() к объекту. Это означает, что вы можете прослушивать события, вызванные этим объектом.

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

Использование событий

Запустите событие с помощью fire(). В этом примере скрипт игрока вызывает событие move каждый кадр с переданными значениями x и y в качестве аргументов.

var Player = pc.createScript('игрок');

Player.prototype.update = function (dt) {
    var x = 1;
    var y = 1;
    this.fire('move', x, y);
};

Слушайте события, используя on() и off(). В этом примере скрипт отображения слушает событие move на игроке и выводит значения x и y.

var Display = pc.createScript('display');

// создать ссылку на сущность игрока
Display.attributes.add('playerEntity', { type: 'entity' });

Display.prototype.initialize = function () {
    // метод вызывается при перемещении игрока
    var onPlayerMove = function(x, y) {
        console.log(x, y);
    };

    // слушать событие перемещения игрока
    this.playerEntity.script.player.on('move', onPlayerMove);

    // удалить слушателей событий перемещения игрока при уничтожении скрипта
    this.playerEntity.script.player.on('destroy', function() {
        this.playerEntity.script.player.app.off('move', onPlayerMove);
    });
};

События приложения

Существует очень удобный и мощный метод использования событий для общения между объектами, который мы называем "События приложения" (Application Events). Как видно из примера выше, прослушивание событий на определенных объектах требует некоторых затрат на настройку. Например, прослушиватель должен иметь ссылку на конкретный объект, который инициирует событие. Это работает в некоторых случаях, но для более общего случая мы считаем, что более подходящим является использование основного приложения (this.app) в качестве центрального узла для инициирования событий. Это означает, что вам не нужно хранить ссылки на объекты, чтобы использовать события.

Это работает путем инициирования и прослушивания всех событий на this.app. По соглашению мы используем пространства имен в названиях событий, чтобы указать область действия события и предотвратить конфликты. Например, событие player:move инициируется в приложении, а не в событии move на игроке.

Давайте попробуем тот же пример с использованием событий приложения.

Инициирование события player:move.

var Player = pc.createScript('игрок');

Player.prototype.update = function (dt) {
    var x = 1;
    var y = 1;
    this.app.fire('player:move', x, y);
};

Слушаем событие player:move.

var Display = pc.createScript('display');

Display.prototype.initialize = function () {
    // метод вызова при перемещении игрока
    var onPlayerMove = function(x, y) {
        console.log(x, y);
    };

    // прослушивание события player:move
    this.app.on('player:move', onPlayerMove);

    // удаление слушателей событий player:move при уничтожении скрипта
    this.on('destroy', function() {
        this.app.off('player:move', onPlayerMove);
    });
};

Как видите, это уменьшает объем кода для настройки и делает код более чистым.

Более подробная информация о событиях в API Reference

This site is translated by the community. If you want to get involved visit this page