Проблема:
Скажите, что вы делаете космический шутер и хотите воспроизвести звук выстрела, пока ваш космический корабль стреляет. Или даже что-то столь же простое, как воспроизведение звука ходьбы во время ходьбы. Это довольно просто и часто встречается в видеоиграх. Но требуется небольшая ручная настройка. Если вы читаете эту статью, значит, вы либо слишком ленивы, чтобы понять это, либо пытались понять это последние несколько часов и бились головой о стол (как и я). В любом случае… ниже приведено решение, которое вы можете скопировать и вставить, потому что я знаю, что это все, что вам нужно 👇
Решение:
function init() { isFlying: false, }function preload(){ this.load.audio("rocket", "assets/rocket.mp3"); }function create(){ this.rocketSound = this.sound.add("rocket", { volume: 1, loop: true }); } function update(){ if (this.cursors.right.isDown && this.isFlying === false ) { this.rocketSound.play(); this.isFlying = true; } else { this.rocketSound.stop(); this.isFlying = false; } }
Объяснение:
Мы хотим, чтобы звук:
- Начните играть, как только клавиша будет нажата.
- Не играть, пока он уже играет.
- Продолжайте прокручивать дорожку, пока клавиша удерживается нажатой.
- Остановите воспроизведение, как только клавиша будет отпущена.
Если бы мы просто вызывали .play()
и .stop()
при нажатии и отпускании клавиши, вы бы получили ужасный шум, поскольку звук постоянно начинает воспроизводиться сам по себе, потому что функция update()
вызывается в каждом кадре. Вот почему нам нужна переменная isFlying
, чтобы отслеживать, воспроизводится ли звук в данный момент. Этот метод не ограничивается нажатием клавиш, но также может быть применен к скорости игрока для воспроизведения звука при движении и остановке, когда вы находитесь в состоянии покоя, и, возможно, к множеству других приложений. Суть в том, чтобы предотвратить воспроизведение звука, если он уже есть, что кажется довольно неуклюжим для чего-то, что должно быть довольно распространенным в Phaser 3, поэтому, если кто-нибудь знает более элегантный способ добиться этого, дайте мне знать. 👊🎮