Anonymous_toaster, вы так и не описали концепт игры. Персонажи могут ходить по-разному, например, 1 - только влево и вправо, 2 - только влево вправо вверх вниз, 3 - под любым углом. Поля зрения могут иметь разную форму, например, 1 - прямоугольник, 2 - треугольник. И так далее. Вы что игр не видели? Они разные как бы! Нельзя просто написать я делаю игру и все поймут какую. Вам не нужна теорема Пифагора, чтобы найти расстояние (гипотенузу), если ваши персонажи не ходят под углом и не смотрят треугольником.
Anonymous_toaster, выражение Math.sqrt(b*b) не имеет смысла, потому что результат будет b. Получается вы не знаете что такое квадратный корень, придется арифметику подучить, какие игры.
Игра - понятие растяжимое. Всё зависит от концепта игры, как устроена сцена, кто где находится, кто куда ходит, как взаимодействует, и так далее. Ваш код ничего не говорит про это. Но узнай мы это, могло бы оказаться, что вам и не нужны сложные проверки трассировки лучей, что предполагается изначально.
qghoul666,
Но вам же наверно нужно ширину и высоту области просмотра (вьюпорта) окна браузера учитывать, а не экрана и страницы. Иначе зачем вам анимация которую вы не увидите. А размеры вьюпорта не являются константами, потому что пользователи меняют размер окна браузера как им удобно.
id это просто число 1, 2, 3 и тд, порядковый номер вызовов setTimeout/setInterval на странице с момента загрузки.
Колбэк это функция которую передали как аргумент в другую функцию и где-то там вызвали.
Колбэком не является создание одной функции внутри другой, просто вызов одной функции внутри другой, возвращение одной функции из другой!
Таким образом, у вас колбэки это:
1. Анонимная стрелочная функция () => (this.notificationMessage = null) (как аргумент передана в параметр fn функции delay).
2. Анонимная стрелочная функция () => fn() (как аргумент передана в первый параметр функции setTimeout).
Я бы рекомендовал вам и LJ322 иногда читать MDN на английском, потому что переводы очень часто искажают смысл.
Anonymous_toaster, вам не нужно использовать дополнительные таймауты и интервалы для этого, в правильно организованном игровом цикле всё выполняется в рамках requestAnimationFrame.
Brendan Castaneda, с сайта, но пришлось рефакторинг сделать, там же реакт. Научиться можно. Нужно пользоваться поиском DevTools по всем файлам Ctrl+Shift+F и знать уникальные особенности технологии, чтобы получить меньше результатов. Например, уникальной особенностью Canvas является запись вида getContext("2d") или getContext("webgl") или getContext("webgl2"). Таким образом, при помощи поиска мы получим нужный результат, а выбрав его и кликнув на иконку Pretty print мы окажемся в нужной нам функции.
Max89, В input.files находится "массив" blob-ов - FileList, вам нужно в пустой FormData добавить нужные по индексу blob-ы, например:
formData.append(input.name, input.files[0])
formData.append(input.name, input.files[2])