Comments 8
Спасибо, интересная статья!
А под разные платформы пробовали собирать? Мобильные/браузер? Был бы очень интересен опыт именно кросс-платформенного использования. Обычно при попытке кросс-платформенной компиляции подобных проектов возникает множество различных подводных камней...
Мысль вслух: возможно, стоящая идея для следующей статьи?
P.S. В расчете положения разве не надо учитывать прошедшее время?
// Перемещаем корабль.
self.position += self.speed * elapsed_time;
Насчёт кроссплатформенной сборки - не пробовал. Цель была скорее в том, чтобы показать, что Rust не так страшен, как его малюют и на нём легко и приятно писать мини-игры. Если найду время - попробую собрать и запустить в WASM. Отпишусь в комментарии.
В процитированной строке время учитывается. Для вычисления позиции скорость умножается на время (elapsed_time
).
Я привел "исправленную" строку, в оригинале умножения на elapsed_time нет...
И это исправление потребует изменения параметров скорости ) Потому как очень медленным становится изменение позиции...
Или это происходит из-за замедления - не совсем понимаю, зачем деление:
// Замедляем корабль по горизонтали.
self.speed /= DECELERATION * elapsed_time;
А под разные платформы пробовали собирать? Мобильные/браузер?
Если интересно, у меня есть небольшая опенсорсная поделка на макрокваде - https://github.com/ozkriff/zemeroth. Вот (немного устаревшая) wasm версия на итче. Вот андроид порт и заметки про него. С ios Федя (автор квадов) когда-то экспериментировал, но дальше pov дело пока не долшло.
И вот тут - https://github.com/ozkriff/awesome-quads - я еще всяке макроквадные ссылки старался собирать, может кому пригодится. Если есть какие сложности-вопросы, то можно в дискорде обсудить с автором и другими пользователями.
self.speed /= DECELERATION * elapsed_time;
А давайте проверим как оно работает?
Для начала, возьмём случай с 30 fps. DECELERATION = 180, elapsed_time = 1/30, итого каждое обновление скорость делится на 6. И так 30 раз в секунду. Кажется, тут можно было вовсе скорость не вводить, а просто двигать корабль на фиксированное расстояние при нажатии "стрелок".
Теперь берём более мощный комп с 180 fps. DECELERATION = 180, elapsed_time = 1/180 — и скорость вообще не меняется! Тормозов у корабля вообще нет, а игрок вынужден удерживать его на месте постоянными нажатиями стрелок (что реалистично, но отличается от того что было задумано).
А при 200fps корабль и вовсе начнёт саморазгоняться...
Если уж так хочется сделать экспоненциальное замедление — ну так используйте экспоненту-то!
self.speed /= DECELERATION * elapsed_time.exp();
Мини-игра на Rust + macroquad