483. Музыка движения

Не решаласьЛёгкая

Нужно реализовать симулятор шарика, падающего на металлические платформы. Каждая платформа при столкновении с шариком должна издавать звук определенной частоты.

image

Формат ввода

В качестве решения надо прислать функцию следующего вида:

export function solution(player, platforms, audioContext, destination) {
    let { x, y, vx, vy, ax, ay } = player;
    // your code here
    return player;
}

Данная функция будет вызываться в цикле на каждый момент времени и принимать следующие параметры:

  • player — параметры текущего положения и движения шарика. Можно считать, что шарик — точечного размера (ширина и высота — 1 пиксель). x, y — координаты положения шарика. Считаем, что ось x идёт слева направо, а ось y снизу вверх. vx, vy — скорости шарика по горизонтали (ось x) и вертикали (ось y). ax, ay — ускорение шарика по тем же осям.
  • platforms — массив параметров металлических платформ следующего вида { x: 200, y: 560, width: 50, height: 6, freq: 261.63 }, где x и y положения центров платформ, а freq — частота звучания платформы при столкновении с шариком.
  • audioContextAudioContext.
  • destination — финальное назначение звука, куда нужно присоединить любые другие создаваемые ноды WebAudio.

Формат вывода

Функция должна вернуть новое положение шарика, и при определении столкновения проиграть звук столкновения.

На каждый вызов функции solution должно определяться новое положение по обычным законам физики (считаем, что интервал времени между вызовами равен 1):

  • v_new = v_old + a;
  • x_new = x_old + v_old;
  • a_new = a_old;

При столкновении с платформой (считаем, что все такие столкновения происходят только сверху вниз), пересчитываем скорость по следующим законам:

  • vx_new = -vx_old
  • vy_new = -0.5 * vy_old;
  • остальные значения не меняются, считаем, что столкновение происходит только на верхней части платформы.

Кроме этого при столкновении должен проиграться звук с частотой freq из параметров платформы. Для воспроизведения звука используем OscillatorNode с треугольным типом волны 'triangle' и длительностью звука 250 миллисекунд.

Примечание

Чтобы упростить тестирование решения, можно скачать приложенный архив.

Ограничения

Ограничение времени

30 с

Ограничение памяти

640 МБ

Теги

JavaScript Node.js 20.14 + Chrome 125
Нужно войти, чтобы отправить решение.Войти