В кадре, как я могу остановить все звуки, когда начинает играть новый звук? - PullRequest
1 голос
/ 11 мая 2019

Когда я играю, нажмите на a-сущность, она воспроизводит звук, но как мне заставить его остановить все остальные звуки при воспроизведении, чтобы это не было громким путаницей?

Я погуглил проблему и попытался добавить коды, которые они используют, но они не работали, я попробовал около 5 разных.

У меня звучит так:

<audio id="mercury-sound" src="mercury.mp3" preload="auto"></audio>

<script id="mercury" type="text/html">
          <a-entity class="mercury"
            geometry="primitive: sphere; radius: 0.67"
            material="shader: flat; src: ${thumb}"
            event-set__mouseenter="_target: #image-mercury; material.src: ${src}; opacity: 1"
            event-set__mouseleave="_target: #image-mercury; material.src: ${src}; opacity: 0">
            </a-entity>
          </script>


<a-entity template="src: #mercury" sound="src: #mercury-sound; on"></a-entity>

Я хочу, чтобы он воспроизводил звук и останавливал все остальные звуки во время воспроизведения.

РЕДАКТИРОВАТЬ: если у кого-то еще есть эта проблема, это то, что исправило ее

Компонент шаблона создает дочерние узлы. Вам нужно взять let el = e.target.parentNode. Проверьте это также здесь, я бы управлял всей звуковой логикой в ​​js, но это уже другая тема :) Кстати, где плохой плутон! - Петр Адам Милевский

1 Ответ

0 голосов
/ 13 мая 2019

Вот подход, использующий js.Идея состоит в том, чтобы:

1) сохранить массив элементов со звуком
2) при щелчке по нему - выполнить итерацию по массиву и остановить звуки
3) воспроизвести "нажатый" элемент

Имея такую ​​настройку:

<a-box sound='#first'></a-box>
<a-box sound='#second'></a-box>
<a-box sound='#third'></a-box>

Вы можете создать скрипт, который будет:

// grab all elements with the sound component
var soundEls = document.querySelectorAll('[sound]')

// make sure all of those react on a 'click' event
for (var i = 0; i < soundEls.length; i++) {
   var item = soundEls[i];
   item.addEventListener('click', e => {
        let el = e.target

        // don't replay an already playing sound
        let isPlaying = el.components.sound.isPlaying

        // stop all sounds
        soundEls.forEach(soundEl => {
            soundEl.components.sound.stopSound()
        })

        // play the clicked sound if isn't already playing
        if (!isPlaying)
            el.components.sound.playSound()
  })
}

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

...