Pull to refresh

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();

Так, извиняюсь, чушь написал. Вот так правильно будет:


self.speed /= (DECELERATION * elapsed_time).exp();
Sign up to leave a comment.