Pull to refresh

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

Reading time 3 min
Views 15K
Development for iOS *Development of mobile applications *Game development *
Предлагаю пятничные апрельские тезисы про Что наша жизнь? Эллипс...

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

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


Вернее сказать, началось все с этой строки
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-1/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-оманам.

UPD: Какой-то iPhone Александр уделал меня и набрал 2000 очков. Думаю он, подлец, с двух рук играет, а это нечестно.
Tags:
Hubs:
Total votes 61: ↑50 and ↓11 +39
Comments 24
Comments Comments 24

Articles