
Здорово, гении. Раньше я тоже был гением, а теперь игрушки пишу для iPhone. Последнюю неделю Apple и Google меня сильно взволновали, пытаясь лишить приложений и доходов. Пришлось вспотеть и сделать 7 игр за 7 дней на Swift 3.0. При этом в старый Obj-C код былых игр я не заглядывал — настолько проще делать приложения на новом языке.
Раньше, когда был гением, мне каждый раз приходилось заново писать функцию сортировки (как элемент игры) и затем гордитьсяя этим. Боже, какой я был идиот. Впрочем, не сильно я изменился. Но изменился инструмент. Смотрите, как теперь выглядит сортировка на Swift 3.0.
let vtxSorted = vtx.sorted(by:{ $0.yPosition > $1.yPosition })
И все! Массив вершин VTX отсортирован по координате Y…
Да зачем это надо? А вот зачем…
Сортировка по координате нужна для построения диаграммы Вороного, о чем было немало статей на Хабре.
Диаграмма Вороного
Все вы знаете про convex-hull и как его строить. По-русски это называется диаграмма Вороного. Напомню для пхпешников, что это сетка, равноудаленая от всех точек, набросанных на плоскость в беспорядке. Заменим плоскость на экран iPhone, точки на жирные белые пикселы и получим такую картинку.

Симпатично и сразу хочется написать какую-нибудь игру. Так я и сделал в далеком 2009 году, когда ты, читатель, не знал даже про Руби, который теперь вместо Анны Карениной лежит на рельсах.
Да и пусть лежит, а мы уносимся вдаль — вот тогда я сделал игру на OpenGL и не заработал на ней ничего. Возможно, долларов 50 за 5 лет я и получил, но это вряд ли.
Но игра классная. Тычешь пальцем в экран и нервничаешь, что не успеваешь убрать все клетки с доски. Что еще надо для счастья? Ну, может немножечко конфет и варенья. Тем более, в самом расцвете сил.
И потому я решил переделать игру на новый лад. Как раз, в интернете попалась яркая картинка с горячей темой о выборах в США, её я и сделал иконкой приложения. Точки заменил на Клинтониху и Трамп-пам-пама, сетку на Штаты — и бросился программировать на чистом Swift.
Засада с OpenGL
Зачем OpenGL? Чтобы рисовать текстурированные треугольники. Заливка чистым цветом — это в сад. Детский сад.У нас будет только хардкор!
А-а-а-! Нету! Я не про защитника Зенита. Нету API на Swift для вызова OpenGL функций! Прикиньте, перцы! Ладно, поиграем желваками и попробуем metal. Это модная библиотека, которую Apple сделал вместо OpenGL, с похожим функционалом и интерфейсом, но, якобы, работающей быстрее на родном железе.
Засада с Металлом
Эта библиотека не работает на симуляторе! Атас! При Джобсе такого не было. Держите меня 100 человек! Три тысячи чертей. Жизнь, кажется, прожита зря. И вот грустный, с разрушенной мечтой, я брел под внезапным балканским дождем и слушал ржанье местных парней. Впрочем, девушке ржали еще громче. Как вдруг, как шашечки зеленоглазого такси, меня осенила мысль — а не надо никаких библиотек, добрый человек! Я смогу нарисовать треугольник с текстурой сам, на чистом UIKit, на милом сердцу Стриже. И даже не треугольник, а целый полигон, что еще круче.
Как? а вот смотрите код, русский язык здесь бессилен.
var mask = CAShapeLayer()
mask.frame = groundTrump.layer.bounds
let path = CGMutablePath()
for t in app.trumpTriangles {
if t.flag == 0 {
path.closeSubpath() // закрываем треугольник
path.move(to: t.p) // начинаем новый
} else {
path.addLine(to: t.p) // бежим по вершинам диаграммы
}
}
mask.path = path
groundTrump.layer.mask = mask1
Да, маска рулит и я её знаю. И вы теперь тоже знаете. Идем дальше, нужно написать алгоритм построения сетки. Я люблю сетки, у меня диссертация была про безсеточные методы (SPH). Здесь P — particles.
Между прочим, на github лежат заморские алгоритмы построения сетки диаграммы Вороного на Swift 3.0. Целых два. К сожалению, первый из них не учитывает прямоугольную границу, другой работает с ошибками погрешности. Пришлось писать программу самому, что было чудесно, мозги свернулись набекрень, по часовой стрелке. Именно по часовой стрелке я обхожу каждую вершину в отдельности и весь массив точек в целом. Метод Флетчера не использовал, сортировал точки по углу и жарил тупо O(N^2). На 50 точках это не принципиально, хотя на iPhone 4S заметно тормозит. Но у кого сейчас iPhone 4S? Даже редакторы Хабре их не юзают.
Что еще? Игра не выложена в магазин, возможно завтра займусь, а вам предлагаю взглянуть на видео геймплея и восхитится моей изумительной работой в комментариях.
Чао, видимся.