Tower Defense + Box2D

    Если бы вы писали Tower Defense игру, пришло бы ли вам на ум воспользоваться для этого физическим движком, например Box2D? Как бы вы реализовали движение юнитов, поведение башен? Что еще полезного вы бы извлекли из физического движка в такой игре?

    Над этими и другими вопросами я начал думать несколько месяцев назад, в результате чего родилась довольно таки интересная игра.

    Я большой поклонник Tower Defense игр. Все начиналось давным-давно с Green TD, карты для Warcraft 3, потом я перепробовал много игр на flashtowerdefense.com, а после того, как появился андроид смартфон, часто проводил время за играми из маркета.

    Идея


    Как-то раз я подумал о том, что неплохо бы и самому написать такую игру. Хотелось придумать что-то необычное, а то, как говорит один мой друг, «роботы уже задолбали». С ним сложно не согласиться, в основном на маркете в этой категории почти везде роботы, зомби и мифические существа. Хотелось чего-то более светлого и мирного. Еще у меня была навязчивая идея использовать в игре физический движок, во-первых для того, чтобы проще было обрабатывать столкновения, а во-вторых добавить чего-то нестандартного и интересного.

    В результате был придуман следующий сюжет: вместо монстров и зомби, идущих по карте, у меня были фрукты, падающие с дерева, вместо башен-роботов — башни-животные. Траектория падения фруктов задавалась ветками, растущими на дереве и гравитацией. Фрукты по пути вниз несколько раз отскакивали от веток, изменялась их скорость и направление, за то время, пока они падали, башни-животные должны были их разбить.

    Я сделал пять видов башен:

    Белка. Кидает по фруктам орехи, обычная башня, хорошая скорость атаки и урон. Несмотря на то, что никакими особыми способностями башня не обладает, пройти любой уровень без нее очень сложно, она полезна как в самом начале игры, так и в конце.

    Белая лиса. Пускает во фрукты замораживающий вихрь, тем самым замедляя их скорость падения. Без этой башни практически нереально пройти любой уровень на сложности, отличной от easy. Все-таки не удалось полностью обойтись без магии, в своей игре я очень сильно хотел замораживающую башню.

    Рыжая лиса. Стреляет из лука стрелой, которая пролетает насквозь через все фрукты на ее пути. Эту башню нужно ставить с умом, так чтобы она за один выстрел попадала по максимальному количеству фруктов. На некоторых уровнях есть ключевые места под эту башню, и задача игрока — разглядеть их.

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

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

    Box2D


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

    Далее я опишу, в каких именно объектах я использовал Box2D, и какие свойства необходимо было задать:
    Название Свойства Box2D Изображение
    Фрукт b2CircleShape
    b2_dynamicBody
    groupIndex = -1
    Ветка b2_staticBody
    b2PolygonShape
    Башня b2_staticBody
    b2CircleShape
    isSensor = true
    Стрела b2_dynamicBody
    b2PolygonShape
    isSensor = true
    Камень b2_dynamicBody
    b2CircleShape
    Стены, пол,
    потолок
    b2_staticBody
    b2PolygonShape

    b2_staticBody означает, что объект неподвижен, на него не действует гравитация и другие силы. Это относится к башням, веткам и границам.

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

    isSensor = true говорит о том, что объекта как-бы не существует, при столкновении с ним другие объекты не отскакивают, а проходят сквозь него. Когда происходит такое событие, библиотека дает об этом знать, что как раз нужно для той ситуации, когда фрукт попадает в радиус действия башни, или стрела проходит сквозь яблоко. Все фрукты имеют одинаковое отрицательное значение groupIndex, благодаря этому они никогда не сталкиваются друг с другом, но успешно отскакивают от веток и границ.

    b2CircleShape объект имеет круглую форму, b2PolygonShape — форму многоугольника, в моем случае все такие объекты — прямоугольники.

    Должен признаться, что внедрерие Box2D в Tower Defense игру было не простым делом, я столкнулся со множеством проблем, например кто-нибудь из вас догадывается, как с помощью Box2D реализовать замораживающую башню? (на самом деле ответ на этот вопрос требует решения задачки 9-го класса по физике и заслуживает отдельного поста). Немалое количество времени потребовалось, чтобы подобрать подходящие физические параметры для всех объектов. Но в итоге все получилось, и я могу с уверенностью сказать: «Tower Defense + Box2D = Yeah!»

    Результат


    Я назвал свою игру Forest Tower Defense и выложил на андроид маркет. Желающие могут скачать ее бесплатно. Там же можно посмотреть скриншоты и видео к игре. Графика получилась мультяшная, поэтому детям игра тоже может понравиться.

    Всем любителям Tower Defense игр я советую попробовать, ведь это единственная игра такого жанра с подобной механикой.

    Мне очень интересно услышать ваше мнение, советы по улучшению и идеи новых фич.

    UPD: Разработка игры велась по принципу, описанному в этой статье, поэтому есть версия для Windows с использованием Qt.
    Поделиться публикацией

    Комментарии 43

      +4
      Зеленые кусты на зеленом фоне совсем не видно. И вообще один сплошной зеленый цвет, все сливается. Надо бы разнообразить.
        0
        Дело в том, что на разных экранах цветопередача может сильно отличаться, я тестировал на смартфонах LG и Motorola, вроде ничего не сливается, мой друг попробовал на Samsung, у него сливается. Обязательно подумаю над этим.
          +1
          Nexus One. Еще некоторые люди плохо отличают схожие оттенки цветов.
            0
            Я сделал фон игры немного светлее, новая версия уже на маркете. По-моему картинка стала лучше, а вам как кажется?
            image
              0
              Да, так гораздо лучше видно игровые элементы. Но возможно все-таки стоит нанять художника, если есть лишние средства.
            0
            Используйте прием, который подарила нам природа — цвета объектов, которые дальше, светлее, в дымке, пастельнее.
          +12
          Чтобы полностью обойтись без магии лиса могла бы швыряться снежками.
            0
            Попробуйте Sprout TD для WC3
              0
              К сожалению, сейчас у меня нет времени для игр за компом, все что я могу себе позволить — это поиграть на смартфоне, пока еду в транспорте :)
              +16
              Белая лиса

              Это же песец!
                0
                Песец со снежком! Впишется отлично!
                  –1
                  Да, и способности у него должны быть соответствующие. Например, заклинание Армаге… то есть я хотел сказать Полный Песец.
                    0
                    Армагеддон — скилл тигра, а не какого-то там хилого песца.
                  +1
                  >как с помощью Box2D реализовать замораживающую башню?
                  А что в этом сложного?
                    0
                    Если просто уменьшить линейную скорость, то фрукт сойдет со своей траектории под действием гравитации
                      0
                      Я бы уменьшал квант времени при пересчете положения (если такое возможно).
                        0
                        Возможно, но тогда замедляться будут все фрукты, а не только те, что заморожены.
                          +1
                          Я имел в виду что только для замороженных фруктов.
                          Это потребовало бы модификации движка (скорее всего).

                          Ну или как вариант — модификация линейной скорости и гравитации только для определенных фруктов (скажем, добавить ускорение вверх для замороженных фруктов).
                        0
                        Уменшить скорость и каждый шаг движка прикладывать силу, чтоб уменьшить гравитацию?
                          0
                          Box2D позволяет уменьшать гравитацию для отдельно взятых тел, но нужно найти зависимость коэффициента гравитации от линейной скорости, чтобы траектория сохранилась. Прикладывать силу можно с таким же успехом, но опять нужна формула, по которой расчитывается ее значение.
                      +3
                      Ох, звучит интересно, жаль нет версии для компа)
                      0
                      На моей балалайке с низким разрешением (240х320) вылазит вот такой небольшой баг (пунктирная линия из пикселей по диагонали).
                      И ещё совсем неверно откалиброван экран.
                      Кнопки не жмутся. Жмутся, если тыкать рядом.

                      А так, идея и оформление понравились. Цвета радуют.
                        +5
                        Если хотите сделать Tower Defence такой, чтобы фанаты вас назвали богом, посмотрите на gemcraft. На мой взгляд, оно ближе всего к идеалу.

                        Ключевые моменты: комбинация башен, трапов и гемов, спешалы гемов, возможность смешивать гемы. Единая шкала успеха: пропуск моба — не «минус одна жизнь», а минус сколько-то маны, она же используется для строительства, она же получается с мобов.

                        Возможность саммона большего числа врагов для увеличения прироста маны.

                        … и ещё много очень важных и тонких мелочей.
                          +1
                          Для меня идеальный Kingdom Rush. Но у автора есть главное — интересная идея, которая может заинтересовать к примеру более младшую целевую аудиторию.
                            +6
                            Пофигу на младшую целевую аудиторию. Либо игра делается для гиков и фанатов, либо это унылая казуальщина для самых маленьких и их родителей.

                            Жанр tower defence подразумевает хардкор. До определённого момента это был режим тетриса (проигрыш в финале), постепенно нашли такую модель уровней, когда прогрыш либо откладывается на неопределённое время (забыл название игры — с лазерными башнями и атакующими принтерами со звёздочками), либо возможен выигрыш (gemcraft в endurance режиме). В любом случае игра должна быстро эволюционировать (игрока) от тупого «натыкать башен побольше» к стратегическому подходу и осознанию закономерностей развития.
                          0
                          Вам бы скооперироваться с хорошим художником, найти издателя, поработать над левелдизайном и геймдизайном — получился бы качественный продукт с интересной задумкой и небанальным сеттингом.
                          А пока очень сыровато.
                            0
                            Может быть, вы посоветуете издателя, которого эта игра заинтересует?
                            +1
                            Если не сложно, то добавьте ролик с игровым процессом в пост. А то не у всех есть устройства с Андройдом.
                              +1
                              На маркете видео есть
                              0
                              Есть нечто похожее: Diet Defense
                                0
                                Почему 2 песца не могут атаковать одну цель?
                                  +1
                                  Такова природа песцов. Их основное предназначение — замедлять цель. Если цель уже замедлена, то зачем напрягаться? :) Мне было проще сделать именно так. Но если вам кажется, что это неправильно, то как вы предлагаете? Если целей много, могут ли песцы атаковать одну? Если они атакуют одну цель, должна ли она замедляться сильнее?
                                    +1
                                    Стандартное для всех продвинутых TD: выбор режима атаки — «near to exit», «most HP», «least HP», «random», «far to exit».

                                    В некоторых продвинутых версиях есть ещё «область атаки» — можно сужать сектор атаки до части круга.
                                      0
                                      Озвучьте, пожалуйста, названия продвинутых TD игр (желательно с ссылками).
                                        0
                                        gemcraft (на хороший уровень оно выходит начиная с chapter zero и, разумеется, labirynth).
                                        xenotactics (общий офигенный уровень и тонкая физика с возможностью мультиводства)
                                        Onslaught (безумно развитая система комбо)

                                        Это выдающиеся. Есть всякие «средние», типа vectord, mini tower defence, mishrum revolution, front_line, Balloon tower defence, desktop tower defence и т.д.

                                        Ну и не забываем dungeon keeer, во второй части там даже был похожий уровень, общая идея окапывания там была доведена почти до совершенства.
                                      0
                                      Я про дамаг. Про замедление — не знаю, но вот дамаг было бы правильнее совмещать. Например, если между 2мя лисицами летит всего 1 враг, то атакует его только одно, а вторая фапает на сие зрелище — думаю, что это неверно
                                    +1
                                    Очень люблю ежиков :) Качаю)
                                      0
                                      Если верить той статье, то у вас должны ещё получиться версии под линукс и мак. Где они?
                                        0
                                        +1, тоже хочу под линукс
                                        0
                                        Ну, в TD есть ещё обычно «прокачка» башен.
                                        Это или как в GemCraft магическое «спекание» нескольких камней в один для повышения характеристик чуть не до бесконечности, так и более классическая «экспа» с получением башнями новых уровней за плату или без…

                                        Соответственно — можно, к примеру, давать апгрейдить характеристики: белка повышает скорострельность или число одновременно кидаемых желудей, песец — радиус заморозки (банально более крупный снежок), лиса — начнёт как натуральный «эльфийский лучник» держать в воздухе несколько стрел разом, к ёжику могут в гости прийти родственники и устроить натуральный ад из иголок, медведь — может повысить дальность атаки и т.д.
                                          0
                                          да, нужно ещё не забывать про такую клёвую штуку, как booldhound гемы. Количество убитых гемом мобов переносится в + к дамейджу с коэфицентом, определяющимся уровнем гема.
                                          0
                                          а я со своим планшетом скачать не могу

                                          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                          Самое читаемое