В игре сейчас можно выделять отряды и отдавать им приказы, все бегают, радуются и дерутся (правда, немного топорно). ИИ пока не управляет отрядами, однако, вражеские солдаты всё равно в бой вступают, завидев врага. Из игры будет вырезана РПГ часть и элемент глобальной стратегии(не сможем выбирать какую область атаковать). Скорее всего, будет просто несколько уровней, на которых игрок должен уничтожить отряды врага. Сейчас работа идёт над Интерфейсом и менюшкой. Музыки скорее всего не будет. Звуки будут наверное. Возможно, будет парочка заклинаний, которые сможем кастить на уровне... В общем, нифига не успевается. Замкнутых крепостей не будет т.к. ни я ни художник не успеем сделать механику осады и осадные машины.
Замесы будут размером не более 500х500 болванчиков, иначе ФПС слишком низкий. Из-за моих кривых лап. https://vk.com/beezoya
Сообщение отредактировал puksus - Суббота, 18 Марта 2017, 18:27
Подошёл вплотную к вставке юнитов и искусственного интеллекта в игру. Для полноценного ИИ моих сил недостаточно, поэтому я придумал вот такую примерную систему положений:
1)На этапе создания карты я буду делить карту на области и задавать областям номера(у разных областей может быть одинаковый номер). 2)Центр замка имеет номер 0, присоединённые к нему области имеют номер 1. Если между текущей областью и главной областью есть ещё области, то присвоить этой области номер соседней наиближайшей к главной области номер + 1. Область снаружи замка называется открытым полем и имеет максимальный номер. 3)Таким образом, чем дальше от центра замка область - тем больше её номер и тем меньше её ценность как для нападающих, так и для защищающихся 4)Ценность области для нападающих уменьшается при увеличении количества вражеских войск в ней 5)Ценность области для нападающих увеличивается, если в ней имеются бреши в стенах или уже была начата осада той области. 6)Ценность области для защищающихся увеличивается при увеличении числа врагов около неё. 7)Если область осаждена, то для защищающихся ценность областей непосредственно примыкающих к ней с тем же или меньшим номером, увеличивается. При этом ценность самой области для защищающихся сильно увеличивается. 8)Если для защищающихся в области слишком много вражеских юнитов, то она помечается как захваченная - тогда все дружеские солдаты отступают из неё в соседние с таким же или меньшим номером. Ценность вплотную прилегающих к данной области с тем же или меньшим номером увеличивается. 9)Если вражеские войска ушли из захваченной области или в соседних областях скопилось достаточно солдат чтобы перебить засевших в ней врагов и если данная область имеет достаточную ценность, то дружественные войска постараются её снова занять. 10)Если враг захватил область с номером 1, то главная область получает огромный бонус к ценности - к ней стягиваются войска со всех остальных областей, чтобы предотвратить захват. 11)ценность области для вражеской осадной техники и лучников уменьшается при наличии в ней врага. Таким образом, сначала в область врывается пехтура, перебивает врагов, а затем туда втягиваются лучники и осадная техника. 12)Вражеская кавалерия старается вести боевые действия в открытом поле - ценность открытого поля для кавалерии значительно увеличивается.
1)Игра основана на отрядах, можно управлять только отрядом целиком, понятие отдельного юнита на уровне управления не существует вовсе. Это нужно для ускорения расчёта ИИ и поиска пути, и для возможности построения сложных структур типа "в первой линии мечники, а во второй - копейщики с большим радиусом атаки, которые сами по себе слабые, но смогут атаковать из-за спин мечников, значительно облегчая положение мечников." 2)Каждый отряд может иметь разные уровни агрессивности: Для агрессивных отрядов при поиске пути возрастает ценность тайлов, в которых находится враг. Для неагрессивных - наоборот уменьшается. 3)Поиск пути - алгоритм А* с кое-какими оптимизациями. 4)При движении отряда между точками пути, сначала происходит разворот отряда, затем движение. 5)Если при поиске пути происходит поворот - ценность этого тайла уменьшается. Таким образом, отряд старается подойти к цели, сделав как можно меньше поворотов. 6)Если при поиске пути тайл геометрически ближе к цели, его ценность увеличивается. Таким образом, отряд старается подойти к цели таким образом, что на первый взгляд путь ближе, даже если это неверно. 7)После построения пути по клеткам, удаляются промежуточные точки пути, если на пути нет препятствия. Проходы осуществляются до тех пор, пока невозможно будет удалить какую-либо точку из пути. Таким образом отряды смогут идти в любом направлении, а не только вперёд\назад\влево\вправо. 8)Отряды не ищут путь каждый кадр. Они делают это по таймеру. Таймер для каждого отряда после срабатывания рандомизируется, чтобы как можно равномернее распределить пересчёт пути между кадрами для отрядов. 9)Отряды время от времени пересчитывают путь заново, чтобы реагировать на динамические изменения карты. (уточнение пункта 8) 10)Каждый отряд имеет ценность для врага в текущей области. Чем больше отрядов рядом с текущим - тем меньшую он имеет стоимость для рукопашных бойцов и большую для стрелковых(по маленьким отрядам велика вероятность промаха). Каждый тайл имеет стоимость. Чем больше вражеских лучников могут простреливать данный тайл - тем меньше его стоимость. 11)Кавалерия старается атаковать небольшие отдельные отряды врага, при этом ценность лучников для кавалерии увеличивается, стоиммость копейщиков - уменьшается. Уменьшается ценность вражеских отрядов, если на пути кавалерии к цели стоят копейщики. 12)Копейщики стараются идти между союзными отрядами и вражеской кавалерией. Такие тайлы имеют большую ценность для копейщиков. 13)Щитовики стараются идти между союзными отрядами и вражескими лучниками. Такие тайлы имеют для щитовиков большую стоимость. 14)Стоимость тайлов и для вражеских и для дружественных рукопашных войск возрастает при наличии рядом осадной техники или лучников. Таким образом, юниты имеют приоритет защищать осадную технику или лучников от врага и атаковать вражеских. 15)Ценность тайлов для осадной техники или лучников резко уменьшается при наличии рядом врага 16)Ценность тайлов увеличивается, если рядом мало союзных войск и много вражеских или наоборот. Таким образом, отряды постараются мочить слабые отряды противника и защищать свои слабые. 17)Ценность тайлов уменьшается, если между вражеской кавалерией и отрядом нету дружеских копейщиков. 18)Приоритет осадной техники - стены, приоритет атаки - сломать стены. Поэтому для осадной техники расчитывается путь до стены с максимальной ценностью атаки. Ценность атаки стены увеличивается с уменьшением номера области, от которой данная стена ограничивает. И уменьшается с количеством вражеских войск вокруг. 19)Ценность атаки стены резко падает, если уже был разрушен участок стены, ведущий из той же области в эту же - нет смысла сносить все стены подчистую, лучше пойти бить стены, ведущие в область с меньшим номером, чем текущая область. 20)Ценность тайлов для поиска пути равна 0, если отряд не может пройти через него не нарушая строй(например, узкие проходы). Костыль, но иначе возникнут трудноразрешимые детали реализации движения по таким местам.
1)каждый юнит имеет свои параметры - атака, защита, защита от выстрела, урон, здоровье и т.д. 2)Чем больше разность между атакой юнита и защитой противника - тем больше вероятность попасть по сопернику при ударе. 3)Атака кроме урона может иметь иные эффекты. Например, атака копейщиков может оттолкнуть соперника, если тот находится на достаточном расстоянии. И их атака резко уменьшается, если враг подошёл вплотную. Такми образом, отряд копейщиков сможет некоторое время сдерживать противника, не давая ему приблизиться, но если противник пробился через стену копий, то засчёт низкой защиты копейщиков, их быстро перережут. 4)Приоритет юнита - защита. Такми образом, если в юнита прилетает вражеский удар, то юнит прекращает свой удар и пытаестя защититься. Таким образом, маленький отряд из элитных солдат будет обречён, если количество вражеских солдат слишком велико - юниты просто не смогут ударить, пытаясь блокировать все входящие удары. Таким образом резко возрастает стоимость бьющих через спину дружеских копейщиков. Исключения - берсерки людей, эти чуваки вообще не парятся о защите. 5)вражеская кавалерия расталкивает врагов при движении, её урон увеличивается в зависимости от скорости движения. Такми образом, естественным для кавалерии приоритетным построением является клин - он позволит пройти сквозь отряд врага. Чего не будет при построении кавалерии линией - пусть она даже нанесёт большой урон врагу, врезавшись в строй, но её сразу же перебьют, ибо кавалерия эффективна только в разгоне. 6)Если броня юнита может полностью поглотить входящий урон, то есть шанс, что юнит не станет его блокировать, а просто продолжит свою атаку. 7)Если рядом с юнитом есть враг, повёрнутый боком или спиной, юнит с большей вероятностью атакует его. 8)Если рядом с юнитом за спиной или сбоку есть враг, то юнит будет иметь приоритет развернуться к нему, однако, предварительно завершив текущее действие. 9)Атаковав сбоку или со спины, юнит получает бонус к атаке. 10)Каждый юнит старается занять своё место в строю. Если юнит отстал от отряда, его скорость временно увеличивается, чтобы он смог догнать. При этом путь до своего места не расчитывается - просто считать потенциальные поля. Если юнит очень сильно отстал от отряда или слишком долго не может вернуться в строй из-за неполноценности потенциальных полей - то подключается полноценный поиск пути. 11)Если отряд вступил в бой, то расстояние, на которое юнит может отойти от своего метса в отряде, определяется агрессивностью отряда.
Осталось только это всё реализовать))
Добавлено (28 февраля 2017, 00:42) --------------------------------------------- Я вот сел писать это хозяйство и понял, что за месяц будет невозможно это доделать. Скорее всего, вместо стратегии будет тауэр дефенс с отрядами по типу Kingdom Rush (только более продвинутой боёвкой) и элементами экономики между уровнями. Ещё поглядим... Лучше сделать проще, но качественно. А то слишком большой кусок хочу проглотить.
Добавлено (02 марта 2017, 05:58) --------------------------------------------- Всё-таки остаётся исходная идея
Я научил мобов искать путь и сражаться. Устроил тут у себя битву 300х300 - забавно было наблюдать. Когда художник нарисует мне нормальных болванчиков - запилю видосик и покажу!
Охх.. Как посмотрю на список задач - плохо становится) А до конца конкурса - месяц
Справитесь. У меня вот тоже недавно темнело в глазах от мысли, что придётся пилить мобам ИИ, а вот пилится на ура! Главное - сесть и делать! https://vk.com/beezoya
blackcatkpi, да, людоедов. Просто я как-то не допёр до этого слова. Спасибо)
Добавлено (20 февраля 2017, 16:14) --------------------------------------------- Реализовал систему частиц. На скрине видно, что в результате бомбардировки частицами были повалены деревья.
Частицы после остановки навсегда рендерятся в текстуру уровня - то есть пролитая юнитами кровь, упавшие на уровень стрелы и т.д. и.т.п останутся на уровне навсегда и при этом не будут жрать ФПС.
Частицы умеют сталкиваться с объектами, нанося им повреждения, отскакивать от стен, распадаться на другие частицы при разрушении, оставлять следы на поверхности при столкновении с землёй и испускать другие частицы во время полёта.
Сделал, что все объекты теперь имеют анимацию смерти и реагируют на столкновения с частицами. Теряя здоровье или умирая, объекты также могут испускать частицы. https://vk.com/beezoya
Сообщение отредактировал puksus - Понедельник, 20 Февраля 2017, 16:15
У лобстера, похоже, не такой уж и плохой проект относительно того, что на конкурсах выкладывают. Так что от себя попрошу, чтобы он не вылетел. https://vk.com/beezoya
Я, конечно, не организатор, но моё скромное мнение заключается в том, что из перечисленного вами, жадные и ненормальные подходят под тему конкурса, особенно ненормальные. Ну а если герой - прям олицетворение зла, то баллов за соответствие теме будет чуть больше. Наверное. Потому что если имелось ввиду олицетворение зла, то ограничение по теме было бы слишком жёстким - в этом нету смысла. https://vk.com/beezoya
Сообщение отредактировал puksus - Вторник, 14 Февраля 2017, 02:08
Пишу на Visual Studio (с++), с нуля. Графическая библиотека - SFML, её же позже использую и для звуков.
Добавлено (09 февраля 2017, 00:46) --------------------------------------------- Добавил объекты(в данном случае деревья) на карту, абсолютно все объекты не привязаны к сетке тайлов и отбрасывают тени. Сделал плавную смену дня и ночи. +новые тайлы от художника (деревья - пока что просто временные болванки, я их из гугл картинок вырезал, нормальные деревья будут позже)
Возможно, сюжет и название изменятся, но не факт.
В общей сложности, за сегодня было написано 500 чистых строчек кода. Побил свой рекорд. Жаль, завтра мне в универ, и столько пахать над проектом уже не получится.
Добавлено (13 февраля 2017, 02:36) --------------------------------------------- Реализованы пещерные тайлы - такие тайлы, на которые вообще не проникает солнечный свет. Такие тайлы можно осветить только с помощью факелов и других источников света, потому что в пещерах стоит кромешная тьма. Сделал неполную реализацию зданий(связанных между собой тайлов). Например, башня является зданием. Идея такая, что если какому-то тайлу, принадлежащему башне, наносится урон, то вместо этого урон получит вся башня. Кроме того, здания можно поставить под углом кратным 90 градусам и навесить на них источники света.
В игре также будут представлены здания для добычи ресурсов - и их можно будет уничтожить в процессе осады для подрыва экономики врага - хоть какой-то способ нагадить противнику, если известно, что битва заведомо проиграна. Копмухтар тоже будет мочить здания игрока при удобном случае.
Идея игры была изменена. Теперь мы играем за вождя ящеров-каннибалов, которые проснулись от многовековой спячки после отступления большого ледникового периода и начали мочить людишек, которые тоже стараются селиться на немногочисленных оттаявших зонах, ибо жить во льдах не очень-то весело. Вот и получается, что люди вынуждены селиться на зелёных территориях, а ящеры тому только рады - им тоже кушать надо.
Были продуманы игровые юниты, получилось по 7 типов юнитов для людей и для ящеров, но их типы и количество ещё может смениться. В игре будет подобие сюжета, которое ещё не придумано.
Новое название "The Swamps"
В ближайшее время планируется дописать здания, вставить системы частиц, разрушение тайлов(при этом будут генерироваться частицы, отлетающие на некоторое расстояние и остающиеся на уровне навсегда), сделать новые типы источников света - переменной мощности(мерцающие, костёр например) и конечного времени жизни.
Обновил описание. Просьба сменить название и описание в списке проектов. https://vk.com/beezoya
Сообщение отредактировал puksus - Понедельник, 13 Февраля 2017, 02:47
А у меня две очешуенные новости: 1) Я оптимизировал код рендеринга текстур прямо на уровень - теперь нет копирования текстур из видюхи на оперативу и обратно
2) Я сделал, мать его, динамическое освещение, Всю ночь над своим быдлокодом просидел, ха! динамическое освещение
Освещение считается всеми ядрами процессора. К сожалению, мне мозгов не хватило засунуть всё на GPU - в шейдере пока только смешиваю результат... Но всё равно показывает 400 кадров в секунду. Если убрать источник света - 500 кадров.
Пока ещё немного кривовато, но... пойду-ка я спать лучше!
Добавлено (07 февраля 2017, 16:53) --------------------------------------------- Исправил все баги с освещением, сделал основу для того, чтобы все игровые объекты, включая перонажей, деревья, да вообще все объекты также отбрасывали тени (причём на производительности это почти не отразится даже при огромном количестве объектов), загрузил в игру курсор)
Gudleifr, я сам решу, какого рода игру мне писать и какая в ней будет заложена механика. Объекты рендерятся прямо на карту и не привязаны к тайлам. Я не буду это обсуждать.
ЦитатаGudleifr ()
Не исключаю, что Вы здесь самый крутой знаток SFML. Иначе, наверное, раздел бы, все-таки, создали.
Да ну? Во-первых, в моей игре двукратное увеличение, значит, 32 пикселя превращаются в 64, во вторых, как тогда будет выглядить перемещение объектов (например, персонажей)? Резкими скачками визуально длиной в 64 пикселя? В третьих, а что тогда делать, когда несколько персонажей находятся в одном тайле?
В общем, то, что объекты не привязаны к сетке - также не обсуждается.
ЦитатаGudleifr ()
Это к ценителям. Но то, что технические тонкости SFML не относятся к общим проблемам программирования, это точно.
Вы не сказали, в какой раздел форума следует писать с такой проблемой. Я подходящего вообще не вижу.
Кроме того, насчёт конкретной проблемы так ни слова и не было сказано. https://vk.com/beezoya
Положение объектов не привязано к сетке уровня. Если бы оно было привязано, тогда действительно имело бы смысл делать так, как вы сказали. Поэтому в моём случае заготовка текстур заранее не имеет смысла вовсе.
ЦитатаGudleifr ()
А для подобных вопросов о SFML нет специального раздела форума?
Ну подскажите, что за раздел. Вижу только раздел про движки и конструкторы. Я бы не назвал sfml движком и тем более конструктором. https://vk.com/beezoya
Gudleifr, а если труп свалился на стыке тайлов? Кроме того, нужно будет ещё рендерить упавшие на уровень стрелы, следы, скажем, от взрыва фаербола. Загатавливать 1000 текстур подо все комбинации?
В общем, я уже чётко решил, что подобные объекты должны рендериться прямо на карту, это не обсуждается. Из этого встал вопрос копирования обычных текстур, ибо SFML отказывается создавать рендер таргет для каждого тайла. Поэтому вопрос стоит конкретно о копировании текстур.
Хотя у меня есть ещё одна идея - делать рендер таргет не каждому тайлу, а скажем, целым блокам размерами 32х32 тайла. Если вопрос о копировании не будет решён - возможно, перепишу под использование подобных блоков. https://vk.com/beezoya
Gudleifr, да, грубо говоря, хранится каждый пиксель карты.
Если брать карту размером 180х180 тайлов (этого хватит с лихвой) и каждый тайл размером 32х32 пикселя, то всё хозяйство будет жрать 126 метров видеопамяти. Думаю, это не проблема даже для слабого компа. https://vk.com/beezoya