Как стать автором
Обновить

Конь мой Вороной

Время на прочтение 3 мин
Количество просмотров 6K

Здорово, гении. Раньше я тоже был гением, а теперь игрушки пишу для 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? Даже редакторы Хабре их не юзают.

Что еще? Игра не выложена в магазин, возможно завтра займусь, а вам предлагаю взглянуть на видео геймплея и восхитится моей изумительной работой в комментариях.



Чао, видимся.
Теги:
Хабы:
0
Комментарии 40
Комментарии Комментарии 40

Публикации

Истории

Работа

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн