Разница между видео - год упорного труда
*игра про рисование линий для решения головоломок
*игра про рисование линий для решения головоломок
p.s. сделал сам, тег "моё"
для лл: Рассказываю простым языком, как я адаптировал инструмент управляющий перемещением NPC по игровому миру, что бы не допустить рисования внутри стен
Начну издалека. В игровой индустрии, одним из способов дать возможность не игровым персонажам "правильно" перемещаться по игровому миру, является построение специальной навигационной сетки. Из себя, она буквально представляет сетку в зоне которой они могут двигаться и по которой рассчитывают свой маршрут от точки А, к точке Б.
Причём, при расчёте маршрута, искусственный интеллект NPC, будет искать не самый короткий, с точки зрения расстояния, а самый "Дешёвый" с точки зрения затраты времени на прохождение пути. Объясню, что это значит. На сетке можно сделать зоны помеченные как "трудные" для перемещения, как пример, скорость движения в такой зоне будет снижена. То есть на карте может быть река и мост через эту реку. Так как река будет помечена как "трудный путь", а мост как "обычный", алгоритм просчёта пути оценит, что будет быстрее. Дойти до моста и перейти реку или пуститься вплавь, если мост далеко. Однако, если на пути нет таких зон, "дешёвый" и самый короткий обычно совпадают, что я и использовал. Выглядит навигационная сетка так:
Так причём тут рисование и нахождение пути для не игровых персонажей?
А дело в том, что линии которые рисует игрок, являются физическими объектами, которые реагируют на столкновения. И может случиться крайне не приятный момент, если такую линию нарисовать внутри стены. В самом лучшем случае, такую линию просто вытолкнет, а в худшем она начнёт дёргаться по всей локации, пытаясь высвободиться.
Самый простой способ, не допустить такое поведение, запретить рисовать внутри других физических объектов, прерывая или не давая начать рисовать.
Но тут есть две проблемы:
1) Так как рисование линий происходит путём добавления новых точек, а получаем мы такие точки не мгновенно, а если упрощённо, с периодичностью обновления экрана. То, когда мы получим новую позицию на экране, она может указывать на зону, где можно рисовать, но фактически, между предыдущей точкой и новой может находиться стена. А как мы оговорились ранее, внутри стен рисовать мы не хотим.
2) Игроку нужно нарисовать длинную сплошную линию, но он случайно заходит в запретную зону и рисование сразу прекращается, линия обрывается и её приходиться рисовать по новой. Как итог, игрок после пары попыток сдаётся и удаляет игру.
Понимая проблему, пришло и решение как обеспечить рисование правильной и непрерывной линии. Мы должны проверить, есть ли между предыдущей и новой точкой препятствие. Если такое есть, нам нужно выяснить, существует ли обходной путь.
Вот тут то и пригодился уже готовый, предназначенный для немного иных целей, но имеющий такой нужный нам функционал, механизм поиска пути по навигационной сетке.
Теперь нам осталось просто обратиться к алгоритму поиска пути с вопросом, есть ли между этими двумя точками доступный путь. Если он есть, добавляем точки полученного пути к нашей линии, если нет, находим точки где линия бы оборвалась. Причём, даже если наша новая точка находиться в недоступном для рисования месте, алгоритм всё ровно будет пытаться найти ближайшую точку в зоне, где рисование доступно и наша линия не прервётся. Выглядит это так:
Поиск обходного пути.
Обходной путь не найден.
То есть фактически, я даю команду алгоритму работающему с навигационной сеткой: Дай мне все точки по которым "Агент" прошёл бы этот путь, и если такой путь есть, просто добавляю полученные точки к рисуемой линии.
Вот так, всё оказалось очень просто!
Поиграть в игру, в которой реализована эта механика, можно тут:
Скачать: Google Play
p.s. Суть игры рисовать линии, что бы решать головоломки.
Спасибо, что прочитали!
Всем привет. Хочу поделиться с вами результатом моей долгой и кропотливой работы, которая заняла у меня целый год, но от которой я остался доволен!
Цель игры:
Весь мир - это доска для рисования!
Вам нужно нарисовать линии которые взаимодействуют с миром и использовать различные предметы, для решения головоломок и помочь главному герою, в буквальном смысле, пройти уровень!
Рисование:
Всего в игре есть три вида маркеров для рисования и каждый маркер рисует линию со своей уникальной механикой взаимодействия с миром. И так, о каждом по порядку:
Белый маркер - это просто статичная линия по которой можно ходить, её невозможно сдвинуть и в целом её можно использовать как надёжный каркас для различных конструкций.
Чёрный маркер - это физически активная линия и все объекты нарисованные ей, соответственно тоже будут следовать всем физическим законам, таким как гравитационное, магнитное притяжение, дуновение ветра и конечно же взаимодействие с другими предметами.
Синяя линяя - это, ну если совсем просто, это стеклянное зеркало. Оно хрупкое, не подходит для рисования крепких сооружений, она статична, но она выполняет одну важную задачу, отражать луч лазера и лопать шарики! Но об этом дальше.
Так же в игре есть ластик, им можно стирать все нарисованные линии.
Что бы нарисовать или стереть, нужно нажать на маркер/ластик и провести пальцем по экрану.
Предметы:
В игре для решения головоломок, есть различные предметы, такие как шарики, ящики, динамит и другие, каждый для своей особой задачи и несёт в себе определённую механику.
Только не сбрасывайте их на голову главного героя, ему от этого больно!
Немного расскажу о некоторых предметах:
Шарик - можно прикрепить к любому физически активному предмету. Если вы хотите, что бы предмет устремился вверх и вы его больше никогда не увидели, прикрепите к нему шарик. Шарики боятся лазера и стекла, они от них лопаются.
Ящики - ящики есть двух типов, лёгкие деревянные и железные, но они тяжёлые и магнитятся.
Динамит - взрывается от любого чиха: наступил = взорвался, что то уронил или сам упал = взорвался, лазер зацепил = взорвался. Дико не приятная вещь для главного героя, а к тому же и разрушает все линии в радиусе своего поражения.
А, что бы использовать предмет, его нужно пальцем перетащить в свободное место на локации.
Прочие механики:
Что бы разнообразить игровой процесс, я добавил в игру объекты которые дополняют геймплейную составляющею своим контролируемым взаимодействием с игровым миром, такие как лазеры, вентиляторы, магниты, нажимные плиты и датчики. Вот пара примеров:
Лазер - главный антагонист синего героя. Он может прорезать линии, активировать механизмы, лопать шарики, взрывать динамит и наносить какое то просто колоссальное количество урона! Спасение одно, тонкая полоска стекла от зеркального маркера.
Магнит - это активируемый лазером механизм. Чем больше лазеров на него излучают, тем сильнее он соответственно и магнитит. Притягивает всё железное и чёрные линии.
Вентилятор - так же активируется лазером и просто дует, но так же режет всё, что попадёт в его лопасти.
Нажимные плиты - нажимаются под весом, тем самым посылают сигнал по проводу. Два вида: свободный ход и такие, которые если сжать, то больше не разожмутся.
Главный герой:
Главного героя зовут Бонни, он обычно синий и он очень хочет добраться до того места, которое я ещё не придумал, но наверное домой. Для главного героя я разработал специальную механику зрения, благодаря которой Бонни не просто болванчик на ножках, а является полноценным наблюдателем за действиями игрока и за тем, что происходит на локациях. Так же я снабдил его возможностью выражать свои эмоции. Когда ему хорошо, он улыбается, когда он удивлён, он с трепетом смотрит разинув рот, а когда ему больно или причинён вред он страдает или грустит. Это позволило немного оживить сложившийся геймплей.
Зоны ограничения:
Гемплей в игре так же дополняют зоны ограничивающие функционал в этой области. Например некоторые зоны запрещают рисовать внутри них, другие же запрещают спавн предметов внутри себя. Но рисование в некоторых случаях уже и так имеет ограничения, например в игре отлично проработана механика, которая не даст вам нарисовать черную физическую линию внутри других объектов, что бы не вызвать физических ошибок во взаимодействии с миром.
Мои мысли и размышления:
Это было долго. Нет, прям реально долго создавать, что то с нуля, так ещё и что бы это работало быстро и без багов. Ещё прошу сильно не пинайте за графику, рисую я честно говоря не очень, но я старался сделать всё хоть на каком то уровне исходя из того, что я в принципе умею.
В игре на данный момент уже доступно 50 уровней и дальше проект будет активно развиваться и дополняться. Я буду вам очень благодарен, если вы оцените мою работу, выскажите критику или подкинете мне идей, что ещё можно добавить и реализовать в плане этой механики.
И я так же с удовольствием добавлю и ваши уровни, если вы предложите их в комментариях к посту!
Ссылка где можно скачать игру и потыкать самому:
Скачать: Google Play
(Пока что игра доступна только на Android, но в планах выпуститься и в AppStore)
Пока тестировал игру, наткнулся на такое неожиданное поведение со стороны объектов из пула появляемых при старте сцены.
Думаю, оставить как фичу, потому что понятия не имею, почему так происходит.
Игра моя, тег моё!
Как вам?
Ссылок нету. Поиграть пока нельзя(