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


  1. mwizard
    17.10.2016 02:55
    +7

    Автор, к сожалению, обороты вида "Так я и сделал в далеком 2009 году, когда ты, читатель, не знал даже про Руби" вместо расположения вызывают отталкивающее ощущение :(


    1. Rastishka
      17.10.2016 03:11
      +3

      Ага, PHPшников тоже ни за что обласкали....


      1. 3aicheg
        17.10.2016 06:01
        +17

        Ну, этих-то не жалко…


    1. mwambanatanga
      17.10.2016 03:34
      +5

      Я в 2009 году не знал про Руби. Поэтому предлагаю считать, что PapaBubaDiop имел в виду лично меня, и не принимать на свой счёт.

      P.S.: :-)


      1. PapaBubaDiop
        17.10.2016 11:52
        +3

        Я Руби до сих пор не знаю)


    1. PapaBubaDiop
      17.10.2016 07:32
      +5

      Пардон, господа! Это я не вас написал, а про тех, кто Толстого не читал.


    1. savostin
      17.10.2016 19:50
      +1

      Пора уже привыкнуть к странноватому юмору PapaBubaDiop.


  1. 3aicheg
    17.10.2016 03:22
    +7

    > convex-hull (...) по-русски это называется диаграмма Вороного

    рукалицо.jpg


  1. riot26
    17.10.2016 04:09
    -2

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


    1. PapaBubaDiop
      17.10.2016 07:37
      +2

      Куда уж больше? Игр у меня за сотню, статей — пару дюжин. Не писать больше? Я могу…


      1. riot26
        17.10.2016 15:19
        +1

        Да, погорячился. Посмотрел остальные статьи и беру свои слова обратно. Постарайтесь избежать оскорблений (как то о руби и пхпешниках).


        1. PapaBubaDiop
          17.10.2016 17:29
          +1

          Это мои любимые люди. Настоящие пхпшники довольны, как слоны. А уж над каламбуром про Аню и Руби истинные рубисты ржут до сих пор… Но трезвым обещаю больше не творить.


    1. AllexIn
      17.10.2016 08:17
      +6

      У автора нормально и с статьями и с игрушками.
      Да, юмор в статье специфический. Это не отменяет интересности этой и других статей автора.


      1. 3aicheg
        17.10.2016 11:33
        -1

        Полистал статьи автора — ему действительно есть что сказать, но вот чувство юмора у него, похоже, отсутствует (да, то, что есть в этой статье, тоже не юмор). Ему бы примерить имидж звериной серьёзности — возможно, и он, и читатели бы от этого выиграли.


        1. PapaBubaDiop
          17.10.2016 11:44

          Вы великолепны! С юмором у меня туго, как у Зощенко.


          1. 3aicheg
            17.10.2016 14:00
            +1

            А Зощенко про что пишет, тоже про игры для айфона?


    1. wholeman
      17.10.2016 08:48
      +4

      Протестую. Я в эти игрушки не играю, да и айФона у меня нет, но статьи читаю с удовольствием.


    1. Buchachalo
      17.10.2016 09:49
      +1

      Сказал заслуженный автор с отсутствием статей в профиле.


      1. 3aicheg
        17.10.2016 10:26
        +3

        Вкус омлета можно оценить даже не снеся за всю жизнь ни единого яйца.


        1. PapaBubaDiop
          17.10.2016 11:45
          +6

          Те, кто несет яйца — омлет не едят.


          1. nckma
            17.10.2016 14:08

            А Вы пробовали кормить? Вдруг им понравится?


            1. PapaBubaDiop
              17.10.2016 14:13

              За кур не знаю, не мой уровень.)

              Да и не люблю я Уроборосов.


            1. 3aicheg
              17.10.2016 20:06

              Им понравится, куры, при случае, с аппетитом жрут собственные яйца, целые не трогают, как правило, а если разбить — мигом налетят и слопают. Они вообще всё едят — змей, мышей, друг дружку.


          1. 3aicheg
            17.10.2016 14:10

            Они бы съели, да кто ж им даст.


        1. Buchachalo
          17.10.2016 12:21
          +5

          Глупейшая аллегория ИМХО.
          Попытка заткнуть рот автору на ресурсе который только и держится за счет вот таких вот статей.
          За сим прекращаю. Наши комментарии по моему так же бесполезны как и комментарий уважаемого 3aicheg.


  1. 3aicheg
    17.10.2016 08:27

    Выглядит красиво, но что-то не могу уловить сути геймплея. Летают кружочки, упруго отталкиваясь от границ экрана и друг от друга, так? По этому набору кружочков динамически строится диаграмма Вороного, так? Если в кружочек ткнуть, он на большой скорости улетает вниз и исчезает, так? В любой кружок можно ткнуть в любой момент, и он обязательно улетит вниз, или какие-то ограничения есть?


    1. Gamegen
      17.10.2016 09:14
      +2

      Я так понял, что ткнуть можно только в тот кружочек, который полностью окружен противоположным цветом.


      1. Sirikid
        17.10.2016 09:42

        А цель, похоже, убрать все кружочки с экрана.


        1. 3aicheg
          17.10.2016 10:20

          С целью-то всё понятно. Мне было показалось, что это разновидность игры «раздави таракана» с нестандартной визуализацией, а всё сложнее, оказывается.


      1. savostin
        17.10.2016 19:52
        +1

        Как Вы это поняли?


        1. Gamegen
          18.10.2016 15:41

          Пардон. :) Видимо, профдеформация. Моя специальность — системный анализ, то есть учили-то меня в какой-нибудь бредовой каше находить «умные» зависимости и последовательности. А на видео, вроде, видно куда игрок кликает.


          1. PapaBubaDiop
            18.10.2016 15:58
            +1

            Между прочим, спасибо за обсуждение — я переделал демо и игру, добавив анимацию шарика, готового к снманию доски. Стало намного нагляднее и понятней, Кстати, игру сегодня одобрили без всяких заморочек — к американцев нет пиетета к верховным вождям!


            1. Gamegen
              19.10.2016 16:03
              +1

              Ну, это вам спасибо! Всегда с удовольствием читаю ваши статьи. И всегда поражаюсь способности генерировать и реализовывать такие простые, но цепляющие идеи.
              Учиться, учиться и еще раз учиться. А потом еще раз…


    1. PapaBubaDiop
      17.10.2016 11:47

      Убивать можно только шарики-одиночки, которые оторвались от своего цветного коллектива. Добавлю, что написав ИИ для игры, я запустил его на 40-ом и выше уровне, пройти которые мне не удается. Задав реакцию ИИ в 400 миллисекунд — я с восторгом наблюдаю, как ИИ доходит до 48 уровня и дальше играть пока не может.


      1. 3aicheg
        17.10.2016 14:20

        А как сложность нарастает — шариков больше, летают быстрей или что?


        1. PapaBubaDiop
          17.10.2016 17:25

          Скорость не трогаю. Слегка увеличивается общее количество шариков.

          Но главное:

          1 уровень. 5 шариков красных, 5 шариков синих.

          20 уровень. 10 шариков красных, 5 шариков синих.

          80 уровень. 20 шариков красных, 5 шариков синих.

          Гораздо реже и на очень короткое время красный шар становится изолированным при таком раскладе. Даже бот не справляется порой.


      1. 3aicheg
        18.10.2016 03:21

        А игру на двоих, типа Го, на этом принципе нельзя запилить? Не удаляешь, а ставишь шарики своего цвета, и окружить противника не шариками по регулярной сетке, а своим цветом по диаграмме Вороного, как-то так.


        1. PapaBubaDiop
          18.10.2016 03:56

          Так глубоко не думал, потому что не умею выигрывать в Го. Но была мысль сделать типа Lines — на нерегулярную сетку падают каждый ход три цветных шара (всего есть 6 различных цветов), твоя задача за один ход переместить 1 шарик на доске на любое свободное поле (и чтобы к этому полю был проход). 5 и более шаров, соединенных по графу — снимаются с доски. Кстати, Match 3 на ячейках Вороного, в этом году вышла на iPhone и заработала кучу денег. А моя очень похожая игра от 2010 года так и провалялась в магазине, никем не замеченная и теперь удалена.


          1. andrew911
            19.10.2016 23:50

            А что за Match3 такой?


            1. PapaBubaDiop
              19.10.2016 23:56

              Забыл название (
              Помню 4 буквы, первая V…