Здорово, гении. Раньше я тоже был гением, а теперь игрушки пишу для 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? Даже редакторы Хабре их не юзают.
Что еще? Игра не выложена в магазин, возможно завтра займусь, а вам предлагаю взглянуть на видео геймплея и восхитится моей изумительной работой в комментариях.
Чао, видимся.
Комментарии (40)
3aicheg
17.10.2016 03:22+7> convex-hull (...) по-русски это называется диаграмма Вороного
рукалицо.jpg
riot26
17.10.2016 04:09-2Предлагаю автору разрабатывать больше гениальных игрушек, а не тратить время на написание статей. Думаю, хабрасообщество меня поддержит.
PapaBubaDiop
17.10.2016 07:37+2Куда уж больше? Игр у меня за сотню, статей — пару дюжин. Не писать больше? Я могу…
riot26
17.10.2016 15:19+1Да, погорячился. Посмотрел остальные статьи и беру свои слова обратно. Постарайтесь избежать оскорблений (как то о руби и пхпешниках).
PapaBubaDiop
17.10.2016 17:29+1Это мои любимые люди. Настоящие пхпшники довольны, как слоны. А уж над каламбуром про Аню и Руби истинные рубисты ржут до сих пор… Но трезвым обещаю больше не творить.
AllexIn
17.10.2016 08:17+6У автора нормально и с статьями и с игрушками.
Да, юмор в статье специфический. Это не отменяет интересности этой и других статей автора.3aicheg
17.10.2016 11:33-1Полистал статьи автора — ему действительно есть что сказать, но вот чувство юмора у него, похоже, отсутствует (да, то, что есть в этой статье, тоже не юмор). Ему бы примерить имидж звериной серьёзности — возможно, и он, и читатели бы от этого выиграли.
wholeman
17.10.2016 08:48+4Протестую. Я в эти игрушки не играю, да и айФона у меня нет, но статьи читаю с удовольствием.
Buchachalo
17.10.2016 09:49+1Сказал заслуженный автор с отсутствием статей в профиле.
3aicheg
17.10.2016 10:26+3Вкус омлета можно оценить даже не снеся за всю жизнь ни единого яйца.
PapaBubaDiop
17.10.2016 11:45+6Те, кто несет яйца — омлет не едят.
Buchachalo
17.10.2016 12:21+5Глупейшая аллегория ИМХО.
Попытка заткнуть рот автору на ресурсе который только и держится за счет вот таких вот статей.
За сим прекращаю. Наши комментарии по моему так же бесполезны как и комментарий уважаемого 3aicheg.
3aicheg
17.10.2016 08:27Выглядит красиво, но что-то не могу уловить сути геймплея. Летают кружочки, упруго отталкиваясь от границ экрана и друг от друга, так? По этому набору кружочков динамически строится диаграмма Вороного, так? Если в кружочек ткнуть, он на большой скорости улетает вниз и исчезает, так? В любой кружок можно ткнуть в любой момент, и он обязательно улетит вниз, или какие-то ограничения есть?
Gamegen
17.10.2016 09:14+2Я так понял, что ткнуть можно только в тот кружочек, который полностью окружен противоположным цветом.
savostin
17.10.2016 19:52+1Как Вы это поняли?
Gamegen
18.10.2016 15:41Пардон. :) Видимо, профдеформация. Моя специальность — системный анализ, то есть учили-то меня в какой-нибудь бредовой каше находить «умные» зависимости и последовательности. А на видео, вроде, видно куда игрок кликает.
PapaBubaDiop
18.10.2016 15:58+1Между прочим, спасибо за обсуждение — я переделал демо и игру, добавив анимацию шарика, готового к снманию доски. Стало намного нагляднее и понятней, Кстати, игру сегодня одобрили без всяких заморочек — к американцев нет пиетета к верховным вождям!
Gamegen
19.10.2016 16:03+1Ну, это вам спасибо! Всегда с удовольствием читаю ваши статьи. И всегда поражаюсь способности генерировать и реализовывать такие простые, но цепляющие идеи.
Учиться, учиться и еще раз учиться. А потом еще раз…
PapaBubaDiop
17.10.2016 11:47Убивать можно только шарики-одиночки, которые оторвались от своего цветного коллектива. Добавлю, что написав ИИ для игры, я запустил его на 40-ом и выше уровне, пройти которые мне не удается. Задав реакцию ИИ в 400 миллисекунд — я с восторгом наблюдаю, как ИИ доходит до 48 уровня и дальше играть пока не может.
3aicheg
17.10.2016 14:20А как сложность нарастает — шариков больше, летают быстрей или что?
PapaBubaDiop
17.10.2016 17:25Скорость не трогаю. Слегка увеличивается общее количество шариков.
Но главное:
1 уровень. 5 шариков красных, 5 шариков синих.
…
20 уровень. 10 шариков красных, 5 шариков синих.
80 уровень. 20 шариков красных, 5 шариков синих.
Гораздо реже и на очень короткое время красный шар становится изолированным при таком раскладе. Даже бот не справляется порой.
3aicheg
18.10.2016 03:21А игру на двоих, типа Го, на этом принципе нельзя запилить? Не удаляешь, а ставишь шарики своего цвета, и окружить противника не шариками по регулярной сетке, а своим цветом по диаграмме Вороного, как-то так.
PapaBubaDiop
18.10.2016 03:56Так глубоко не думал, потому что не умею выигрывать в Го. Но была мысль сделать типа Lines — на нерегулярную сетку падают каждый ход три цветных шара (всего есть 6 различных цветов), твоя задача за один ход переместить 1 шарик на доске на любое свободное поле (и чтобы к этому полю был проход). 5 и более шаров, соединенных по графу — снимаются с доски. Кстати, Match 3 на ячейках Вороного, в этом году вышла на iPhone и заработала кучу денег. А моя очень похожая игра от 2010 года так и провалялась в магазине, никем не замеченная и теперь удалена.
mwizard
Автор, к сожалению, обороты вида "Так я и сделал в далеком 2009 году, когда ты, читатель, не знал даже про Руби" вместо расположения вызывают отталкивающее ощущение :(
Rastishka
Ага, PHPшников тоже ни за что обласкали....
3aicheg
Ну, этих-то не жалко…
mwambanatanga
Я в 2009 году не знал про Руби. Поэтому предлагаю считать, что PapaBubaDiop имел в виду лично меня, и не принимать на свой счёт.
P.S.: :-)
PapaBubaDiop
Я Руби до сих пор не знаю)
PapaBubaDiop
Пардон, господа! Это я не вас написал, а про тех, кто Толстого не читал.
savostin
Пора уже привыкнуть к странноватому юмору PapaBubaDiop.