Здесь нет кода и смысла, нет математики и ссылок на 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-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-оманам.
Комментарии (0)