Не будет преувеличением сказать, что это гипербола

в 17:43, , рубрики: jaws 2, анимация, аппроксимация, гипербола, разработка игр, разработка мобильных приложений, разработка под iOS, скорость, челюсти, метки: , , ,

Предлагаю пятничные апрельские тезисы про Что наша жизнь? Игра...

Здесь нет кода и смысла, нет математики и ссылок на GitHub.
Короче, самый то, чтобы не читать. Но ты прочти.

А началось все с этой морды

Не будет преувеличением сказать, что это гипербола - 1
.

Вернее сказать, началось все с этой строки

10 CLS

30 лет назад эта команда очистила экран IBM PC/XT.
Я, как зачарованный, смотрел на потухшие 320 на 200 черных точки и понимал, что теперь могу их зажечь, как звезды на небе. Простой командой. Простой парень. И я зажег. Так зажег, что до сих пор остыть не могу.

Первая игра, сделанная в конце 80-ых, была написана на языке BASIC, который не имел компилятора, а исполнялся интерпретатором команд. И потому, чередующиеся картинки мигали, как слепой Пью на прицеле у Билли Бонса.

Пофик! До этого вся анимация, созданная мною, умещалась в 50 страницах маленького блокнота. Мы рисовали внизу каждой страницы человечка, выпускающего стрелу, стрела летела и поражала другого человечка. Потом страницы блокнота пролистывались большим пальцем правой руки — вжи-и-и-и-и-и-и-и-и-и-и-и-и-и-и-и-и-и-и-и-и-и-и-и-и-и-и-и-и-и-и-к, и 50 кадров мультика вызывали одобрительное гуканье. Было клево. Самые красивые девчонки школы просили блокнотик. Мягко клали руку на плечо и заглядывали в глаза. Стоп, я тону. Лучше вернемся к басику.

Так вот, первая сделанная игра на BASICе называлась Челюсти. Челюсти сжимались и разжимались. Конфигурация зубов менялась. Герой бегал внутри пасти, ел фрукты и пытался не попасть на зубок.

Короткое видео геймплея

Прошло время. Очень быстро.
Проскочили компилятор для BASIC, Pascal, С, С++, JS, Obj-C и Swift.
Я делал игры на всем, что втыкается в розетку, и это были в том числе очень даже 3D симуляторы танкового полигона для Муромского/Арзамасского (тсс! строгая тайна!) завода бронетранспортеров и что только не было, лучше и не вспоминать.

И вдруг вчера мне приснилась та, первая игра.
Представляете? Ну, что бы вы сделали на моем месте? И я такой же.
200 строк кода — и, опта! игра лежит в магазине, а код на GitHub-е.

Что изменилось за 30 лет? Изменилось программирование — раньше челюсти сжимались в цикле все с большей и большей частотой, пока не достигали скорости отрисовки изображения. И если компьютер был слабый — игрок жил бесконечно. Теперь все иначе. Циклов нет. Такты бешеные. А для расчета частоты схлопывания челюсти используют математику. Пусть простую, но интересную. Переходим к выводу формулы частоты движения челюсти.

Формулировка задачи

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

Итак что мы имеем?
1) Устанавливаем время обновления экрана iPhone в 50 герц. То есть 50 раз в секунду. 50 тиков на секунду. Запомним.
2) Предельная реакция игрока. Вспомним, спринтер на старте забега реагирует на выстрел с задержкой 280 миллисекунд — за это время сигнал проходит путь от его мозга до его же икроножных мышц. iPhone-юзер посылает сигнал не ногам, а своим щупальцам, путь нервного сигнала нервного нерда короче вдвое, =140 миллисекунд — это минимальное время реакции. 7 тиков. Герою игры надо пробежать от края до края челюсти за 6 тапов. То есть минимум 6 тиков. Итого — челюсти, в пределе, не могут сжиматься быстрее, чем за 6+7=13 тиков.
3) Начальная скорость челюстей — 1 щелк за 50 тиков. Если челюсти будут слишком медленно двигаться — пользователь бросит игру. Поэтому уже через 5-10 секунд частота должна быть 1 щелк в 25-35 тиков.

Решение.
Имеем нелинейную функцию
f(0) = 50
f(10) = 30
f(10^10) = 13

Без дураков ясно — это гипербола.
Записываем формулу
f(t) = A + B*(C+t)

Три неизвестные — три уравнения, решаем (просто удовольствие решать школьные задачки).
Ответ записываем в листинг программы.

  func setupDelay(_ ticks:Int) {
        let t = Double(ticks)
        let a:Double = 12.0
        let b:Double = 9000.0/2.2
        let c:Double = 100.0/2.2
        let d:Double = a + b/(c+t)
        delay = Int(d)
    }

Играть интересно на пределе человеческих способностей.
Поэтому для тех, кто набирает более 1000 очков, реклама пропадает.
Жалко же парней.

Хвала пуно, брате!

Прим. перев. Код на GitHub разумеется тяп-ляп, но картинки, звуки и некоторые приемы безусловно будут полезны начинающим swift-оманам.

Автор: Вадим Башуров

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js