Проблема:

Скажите, что вы делаете космический шутер и хотите воспроизвести звук выстрела, пока ваш космический корабль стреляет. Или даже что-то столь же простое, как воспроизведение звука ходьбы во время ходьбы. Это довольно просто и часто встречается в видеоиграх. Но требуется небольшая ручная настройка. Если вы читаете эту статью, значит, вы либо слишком ленивы, чтобы понять это, либо пытались понять это последние несколько часов и бились головой о стол (как и я). В любом случае… ниже приведено решение, которое вы можете скопировать и вставить, потому что я знаю, что это все, что вам нужно 👇

Решение:

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;
  }
}

Объяснение:

Мы хотим, чтобы звук:

  1. Начните играть, как только клавиша будет нажата.
  2. Не играть, пока он уже играет.
  3. Продолжайте прокручивать дорожку, пока клавиша удерживается нажатой.
  4. Остановите воспроизведение, как только клавиша будет отпущена.

Если бы мы просто вызывали .play() и .stop() при нажатии и отпускании клавиши, вы бы получили ужасный шум, поскольку звук постоянно начинает воспроизводиться сам по себе, потому что функция update() вызывается в каждом кадре. Вот почему нам нужна переменная isFlying, чтобы отслеживать, воспроизводится ли звук в данный момент. Этот метод не ограничивается нажатием клавиш, но также может быть применен к скорости игрока для воспроизведения звука при движении и остановке, когда вы находитесь в состоянии покоя, и, возможно, к множеству других приложений. Суть в том, чтобы предотвратить воспроизведение звука, если он уже есть, что кажется довольно неуклюжим для чего-то, что должно быть довольно распространенным в Phaser 3, поэтому, если кто-нибудь знает более элегантный способ добиться этого, дайте мне знать. 👊🎮