В ходе написания кода игры к 13-му гамирону столкнулся с проблемой.
Имеется карта из тайлов, на тайлы в ходе игры может капать кровь, падать трупы и т. д. и т. п. И я хочу чтобы эти изменения оставались на уровне навсегда. Поэтому вместо того, чтобы рисовать кучу объектов типа крови и трупов, я решил каждому тайлу прицепить свою собственную текстуру, на которую буду прямиком рендерить всё что нужно.
Сначала я прицепил каждому тайлу объект sf::RenderTexture - и всё было бы отлично, но оказалось, что, когда число тайлов превысило штук 80 (а это очень мало), то прога вылетала с ошибкой при больших размерах уровня.
Тогда я решил цеплять к тайлам обычные текстуры, ну и теперь рендеринг чего-то в этот тайл выглядит вот так:
//renderTileScreen - временный экран по размеру тайла, куда рендерим то что нам нужно //tile->tilePaintTexture - текстура тайла //копируем старое содержимое drawTexture(&renderTileScreen, tile->tilePaintTexture, TILE_SIZE/2.0f, TILE_SIZE/2.0f); //добавляем новое drawTexture(&renderTileScreen, tex, drawX, drawY, angle, scaleX, scaleY);
//SLOOOOOOW //применяем изменения renderTileScreen.display(); sf::Image tempImage = renderTileScreen.getTexture().copyToImage(); tile->tilePaintTexture.loadFromImage(tempImage);
Здесь сначала мы рисуем то, что нужно во временный рендер таргет, затем копируем его содержимое в оперативку, и из оперативки пересоздаём текстуру тайла. Вся эта процедура чудовищно медленная. Можно ли как-то сказать прямиком видеокарте "а скопируй-ка мне эту текстуру вот в эту"? https://vk.com/beezoya
Сообщение отредактировал puksus - Понедельник, 06 Февраля 2017, 13:00
Кстати, не помешает художник. Я уже написал себе в ВК об этом сообщение, но вряд ли там кто откликнется. В общем, проект я постараюсь довести до конца (на прошлом конкурсе ведь довёл). Также попытаюсь довести игру до Steam. Художнику дам треть всего гонорара, если он будет. Это с учётом приза, фалки и стима. Разумеется, если игра ни в чём из 3-х не заработает, то треть от нуля - нуль, так что...
Но если что - намалюю сам себе каракулей, а когда швабрикан появится - заставлю его перерисовать)
MysticPurple, спасибо
Добавлено (04 февраля 2017, 21:00) --------------------------------------------- А в принципе, не так уж и плохо получается, вот нарисовал себе болотную травку и более-менее доволен)
Хочу сделать так, чтобы трупы и кровь навсегда оставались на уровне, причём в любом количестве - то есть я буду их прямо в текстуры тайлов рендерить. Рендеринг получится намного тяжелее и нужно будет хранить текстуру каждого тайла отдельно, но я думаю, результат того стоит.
Добавлено (06 февраля 2017, 00:12) --------------------------------------------- Реализовал рендеринг объектов прямо в текстуру уровня. Пятна на скрине не рисуются отдельно, вместо этого они были прямиком занесены в текстуры тайлов. Таким образом я могу рисовать хоть бесконечность трупов на карте без потери производительности.
Есть только одно но: поскольку sfml отказался делать 100500 рендер таргетов - для каждого тайла, то пришлось проворачивать всё обычными текстурами - в результате код подразумевает копирование данных с видеокарты в оперативку и обратно, что чудовищно медленно. Если проблема не будет решена - то чтобы не просаживать ФПС слишком сильно - буду делать ограничение на количество отрисованных в карту объектов на кадр. Остальные будут выстраиваться в очередь и будут рисоваться как отдельные объекты до тех пор, пока не наступит их черёд...
rgs_haker, ну не знаю, к предыдущему гамирону я некоторое время ломал голову насчёт темы, и то соответствия теме особо не было, а к этому придумал себе проект примерно секунд за 5. falcoware, а мона мне тоже маленькую крупицу коррупции?? https://vk.com/beezoya
Название: The Swamps Хирург Ниндзя Качок 6: Нежить. Жанр: Стратегия Action RPG + стратегия. Разработчики: Puksus(код), JEXXX(графика) Среда разработки: Visual Studio 2010 + SFML Платформа: Windows
Сюжет. Мы играем за вождя ящеров-людоедов, которые проснулись от многовековой спячки после отступления большого ледникового периода и начали мочить людишек, которые тоже стараются селиться на немногочисленных оттаявших зонах, ибо жить во льдах не очень-то весело. Вот и получается, что люди вынуждены селиться на зелёных территориях, а ящеры тому только рады - им тоже кушать надо.
Геймплей. Вид сверху, сратегия. Управляем отрядами. За убийство врагов получаем черепки, на которые можем вызывать подкрепления. Цель - уничтожить определённые отряды противника.
0.0.1 -основа проекта -рисование текстур прямо в уровень
0.0.2 -объекты -освещение -тени
0.0.3 -смена идеи игры -частицы
0.0.4 -персонажи сражаются, движутся
0.0.5 -отряды, управление отрядами
0.1.0 Конкурсная версия -звуки -уровни -куча мелких изменений
AlexanderBekker, спасибо за ответ, в принципе, почти очевидный алгоритм с очередью. Думаю, проще будет просто запустить его из центра каждого источника света. Солнечный свет будет сложнее обработать, потому что я хочу сделать солнце под произвольным углом, а не вертикально сверху. Но я что-нибудь придумаю. Может, буду просто пускать параллельные лучи сверху через равные промежутки и искать столкновения.
Сейчас больше всего стоит вопрос по пересчёту освещения после изменений на уровне. Я подумал тут и решил, что необязательно пересчитывать ВСЮ область освещения от каждого источника. Можно просто пересчитать ту часть координатной четверти в начале из источника света, в которой находится изменённый кусок.
Добавлено (04 января 2017, 12:52) --------------------------------------------- Хотя, как тогда быть, если между изменённым куском и источником есть препятствие? Тогда получается, нужно брать ВСЮ четверть, а не её часть? https://vk.com/beezoya
Сообщение отредактировал puksus - Среда, 04 Января 2017, 12:53
Игровой мир состоит из множества блоков в 2д. Блоки могут быть полупрозрачными. Наподобие террарии. Также имеются игровые объекты - персонажи, всякие передвигающиеся объекты и прочее. Источников света может быть много + солнечное освещение. Любой блок в любой момент может быть уничтожен либо добавлен. Поскольку главной фичей игры планируется бешеный геймплей с тотальным мочиловом - уничтожение блоков будет происходить очень часто.
Изначальная хотелка 1. Сделать динамическое освещение с плавными тенями от блоков. 2. (ОБЯЗАТЕЛЬНАЯ)Сделать ПРИ ЭТОМ освещение персонажей вот как тут Клац
Долго думал и сделал такие выводы. 1. Поскольку блоков на экране очень много, то даже если каким-то чудом запихну пересчёт карты теней в шейдер (а я даже этого пока что не умею) - всё равно будет тормозить, поэтому решил сделать освещение статическим с пересчётом только на тех кадрах, в которых было уничтожение\установка блока. 2. Из-за второй хотелки одной карты теней будет недостаточно. Дело в том, что если хранить лишь карту теней, то, освещая персонажа, мы не сможем узнать, под каким углом и от скольки источников на персонажа падал свет, не говоря даже о том, что цвет источников света может быть разным. Значит, освещение персонажа надо делать либо по другим алгоритмам, чем освещение уровня, либо придумать другой метод.
Конечная хотелка с учётом выводов 1. Сделать статическое поблоковое(НЕ попиксельное!) освещение как в террарии с обновлением лишь на тех кадрах, когда уничтожался или добавлялся блок. 2. Оставить при этом мегакрутое освещение персонажей.
Собственно Вопросы 1. Я придумал алгоритм, который будет шустро пересчитывать освещение от источника света. Просто нарезать "круги" вокруг источника освещения всё большего радиуса и смотреть, найдено ли препятствие. В конце каждого кадра мы знаем, какие блоки были добавлены и удалены в течение кадра. Нужно как можно эффективнее пересчитать освещение блоков с учётом того, что источников света может быть много. Как? Если есть простой способ упихать это дело в шейдер, то как? 2. Насчёт красивого освещения персонажей, я решил делать цикл по каждому источнику света. Затем проводить одну или несколько линий(например, от головы и от ног) от персонажа до этого источника света. Если на пути не было блоков - осветить тем методом, как по ссылке. Если часть линий была перекрыта блоками - осветить, но слабее. Если на пути всех линий были непрозрачные блоки - игнорить источник света. Можно ли сделать это эффективнее или проще?
Жанр: бешеный психодельный экшн Платформа: Windows Среда Разработки: Visual Studio 2010 + SFML Особенности: Планируется разнесение уровня на кусочки, а также очень динамичный напряжённый игровой процесс, лёгкий троллинг игрока, зимняя новогодняя тематика, слизняк Вова.
Сюжет: Раннее утро, идёт лёгкий снегопад, посреди леса стоит домик, но... только не это! Сюда ползёт слизняк Вова, наверняка он опять решил устроить какую-нибудь пакость... Немного отвлечёмся и скажем, что в том домике живёт Хирург Ниндзя Качок, который после победы над Хирургом Ниндзей Качком Нежитем решил уединиться и прожить остаток жизни в тишине и покое. Но смотрите, пока вы это читали, слизняк Вова проник в домик и высосал силу у нашего героя, и теперь он стал Пациентом Плоскостопным Дрыщом! Ну нет, вы ему этого не простите, уже пятый раз за месяц вам приходится отбирать у него обратно свою силу, сейчас вы ему покажете! Оденьте свой халат, достаньте свою хирургическую пилу и дайте достойный отпор силам слизняка Вовы. <Примечание: По задумке, слизняк Вова является одним из ключевых персонажей второй части игры, которая не факт что вообще будет когда-нибудь написана>
Геймплей: По сути в игре будет только одна локация - область вокруг домика игрока включая сам домик. Игровой процесс будет заключаться в том чтобы отбиваться от полчищ слизняка Вовы. После каждой волны идёт босс, победив которого мы сможем прокачать одну из характеристик героя, а также нам дадутся скальпели, за которые мы можем купить новое оружие, броню, предметы, заклинания или улучшить дом. Игровой мир будет состоять из небольших блоков. в игре можно будет сражаться 3-мя способами: 1) будет холодное оружие, одноручное, двуручное, будут щиты. 2) скальпели. Вначале игры мы можем их кидать, позже можем купить скальпелемёт и стрелять ими. Однако скальпели - одновременно игровая валюта, поэтому использовать скальпели в бою = тратить в бою деньги. 3) магия. Магия будет довольно мощной, однако будет тратить психику героя. (Также психику героя смогу повредить некоторые типы врагов, но далеко не все). Чем меньше психики осталось у игрока - тем в более бешеном темпе прут враги, тем их больше и тем они сильнее. Поэтому с магией надо очень аккуратно. Также мы сможем покупать гантели, гранаты и прочую ересь, которую можно кидать во врагов.
Ветка хирурга отвечает за психику героя (то есть на способность творить заклинания), а также за ряд других мелких, но при определённых условиях полезных факторов. Полностью вкачав этот навык мы сможем призывать потоки метеоритов, которые разнесут весь уровень в щепки, и будем быстро восстанавливать психику, убивая врагов. Пациент - медработник - врач - хирург Ветка ниндзи определяет скорость передвижения, скорость ударов и блоков, точность метания скальпелей и стрельбе из скальпелемёта. Полностью вкачав этот навык мы сможем мельтешить по всему экрану, осыпая врагов ударами с разных сторон. Плоскостопный - почти балерун - прыгучий - ниндзя Ветка качка определяет грубую силу. Чем мы качокистее, тем лучшую броню сможем одеть и тем более тяжёлое оружие использовать. Полностью прокачав этот навык мы сможем отшвыривать врагов за пределы экрана здоровенной дубиной или можем взять двуручный меч в одну руку, а тяжеленный щит - в другую. Дрыщ - не качок - недостаточно качок - качок
Добавлено (19 декабря 2016, 14:30) --------------------------------------------- проект переносится на следующий новый год, потому что у меня нет времени. Зачастую ложусь в 4 ночи, чтобы сделать лабы. https://vk.com/beezoya
Сообщение отредактировал puksus - Четверг, 05 Января 2017, 00:46
Пичаль, я думал зимой развлекусь) Просто так чего-то не тянет проекты пейсать, вот почему-то обязательно надо чтоб над головой угрожающе висел дедлайн) https://vk.com/beezoya
falcoware, вы меня неправильно поняли, я не жаловался, а просто просил обновить. Ну да проехали.
Добавлено (04 октября 2016, 13:00) --------------------------------------------- Ну вот, теперь можно скачать с торрента, там лежит более новая версия с улучшенным балансом, без рекламы и со свободным исходным кодом. http://rutracker.org/forum/viewtopic.php?t=5290126 https://vk.com/beezoya
Сообщение отредактировал puksus - Вторник, 04 Октября 2016, 13:00
Ordan, так и сделаю, а то чувак жалуется на отсутствие логики в сюжете, зная только его часть, причём описанную в кратком содержании. https://vk.com/beezoya
Gudleifr, я как раз и отказался от стены текста в начале, вся предыстория будет открываться по мере прохождения. Как и основные события игры. Чё вас тут конкретно не устраивает? Что я заранее кратко растрындел часть сюжета? https://vk.com/beezoya
Короче: стрельба на левой клавише, аптечки - серые ящички.
Вы не любите игры с сюжетом? или не любите Исаака, который родил Иакова, который родил Иуду, который родил фареса, который родил есчрома, который родил арама, который родил аминадава, который родил наасона, который не родил потому что мужык? https://vk.com/beezoya
Сообщение отредактировал puksus - Воскресенье, 02 Октября 2016, 20:51
Думал сделать пролог к игре, который бы рассказывал предысторию, но шваб сказал, что не стал бы в начале игры читать огроменную стену текста. Поэтому предыстория также будет включена в игру. То есть, некоторую часть игры мы будем играть и параллельно нам рассказываться предыстория. Тогда основные события спустя 200 лет после начала предыстории будут закономерным продолжением игры, просто уже за другого персонажа.
Если коротко о сюжете, то была в энном году третья мировая ядерная война между господствующими корпорациями. Мы работаем в одной из них "подопытным кроликом", чтобы хоть както содержать семью. Соперничающие корпорации запустили космическую программу, улетели в космос, взяв лишь самых нужных людей, а остальных кинули. Тем более всем было пофиг на основное население планеты. В результате войны земля раскололась пополам, была сожжена атмосфера, находиться на улице более нескольких минут стало невозможно из-за радиации, сверхнизкой температуры и отсутствия кислорода в воздухе. Однако глав герой вместе с горсткой учёных в этот момент находился в укреплённом подземном бункере-лаборатории, выполняя свою обычную работу. Когда звездолёты корпорации взмыли в космос, многие были сбиты вражескими ракетами. Один из подбитых звездолётов упал неподалёку от бункера, и его удалось затащить внутрь и отремонтировать. Места в нём на всех не хватало, началась бойня на право улететь на нём. Главный герой с горсткой людей выживает и улетает на нём. Он ставит себе цель отомстить корпорациям за сломанную жизнь и убитую семью. Тем временем корпорации продолжают осваивать космос и воевать друг с другом за власть, территорию и ресурсы. Для работы на космических станциях создаются клоны. Клонам вживляют чип, который считывает весь их опыт работы и воспоминания и закачивает на сервер. Когда клон умирает, новому клону вживляется чип и с сервера скачивается опыт и воспоминания предыдущего клона. Однако, со временем клоны становятся не нужны ввиду всё большей автоматизации производства, и их начинают утилизировать... Что касается главного героя, он множество лет летает по галактике, пытается выжить и выжидает подходщего момента. Вот однажды Произошёл бой на станции клонирования, на которой заодно стои сервер воспоминаний. Игрок захватывает эту станцию и угоняет в космос, использует её для создания армии клонов, в итоге когда цель почти достигнута и корпорации чуть не были побеждены, клоны, ведомые собственными желаниями, предают и убивают главного героя. Однако дело всё ещё не было проиграно. Кучке выживших удалось изобрести новые двигатели и улететь далеко от войны корпораций, куда те дотянуться не могли. Там дело было продолжено. Пока корпорации воевали и уничтожали друг друга, сообщество клонов стремительно развивалось. В итоге одна из корпораций победила остальных и захватила своими роботами огромные территории. Их роботы были способны генерировать новые технологии. Чтобы избежать неминуемой смерти, сообщество клонов внедрило вирус в сеть корпорации, который смог уничтожить модель синтеза системы, то есть, роботы утратили возможность синтезировать технологии и самообучаться. Чтобы добраться до системы, где обосновались клоны, на старых двигателях понадобится 200 лет. Это я хотел сделать в качестве пролога, но решил непосредственно засунуть в игру. Описал кратко, на самом деле можно было бы в 3 раза более развёрнуто всё описать. Основными действиями уже будут события спустя 200 лет, мы будем играть за рядового боевого клона, пилота истребителя, и будем воевать, собственно, с ордой боевых роботов. Ну и концовка будет далеко не жизнерадостной.
Добавлено (02 октября 2016, 19:50) --------------------------------------------- Я очень люблю читать чужие чейнджлоги и составлять свои. Так что буду в шапке вести чейнджлог своего проекта, потому что это очень весело и забавно. Ведь сегодня проект вошёл в версию 0.0.3 (Ого!)
falcoware, я знаю. Баланс исправил для того, чтоб игра стала меньшим шлаком. Исходник выкладываю потому, что обещал. Короче, я понял, что ни описание, ни саму тему обновлять не будут, вопрос снят. https://vk.com/beezoya
falcoware, я сегодня сделал ребаланс игры чтобы сделать геймплей более "играбельным" и залил его вместе с исходным кодом на rutracker.org. Осталось подождать проверки тамошним модератором. Можно ли обновить тему на фалко на новую версию заодно впихнув исходник? https://vk.com/beezoya
Сообщение отредактировал puksus - Суббота, 01 Октября 2016, 19:14
если не примут - ёсть облако майл ру, просто тогда деньги капать не будут, ну да и ладно.
Добавлено (28 сентября 2016, 16:05) --------------------------------------------- отредлактировал шапку, добавил ссыль на скачивание. Что-то я несусветно тупанул с описанием проекта на фалко
Добавлено (29 сентября 2016, 22:37) --------------------------------------------- Фалко не отвечает на просьбу сменить описание. Никто не качает( Короче, на выходных выложу на торрент, заадно вместе с исходным кодом, хоть мне и стыдно свои обильные быдлокостыли показывать.. Очень стыдно. Но всё равно выложу.
Допиливаться проект не будет. Вместо этого буду с нуля пилить вторую часть, эта была своего рода разминкой. После второй части, если та увидит свет, буду уже пилить своего любимого хирурга ниндзю качка 2. Если проект примут на фалко, впихну в шапку ссыль на скачивание. Если нет - всё равно впихну. Прошу админов перенести в готовые проекты что-ли... Шапку отредактирую попозже. https://vk.com/beezoya
Название: Sparks Of The Void 2 жанр: шутер\симулятор среда разработки: Visual Studio 2010 + SFML способ распространения: выложу в стим и одновременно раскидаю по торрентам
Для чего буду писать: Сначала я думал с нуля переписывать эту свою конкурсную игру, но решил оставить её в покое и сделать вторую часть. Причина, по которой я буду делать этот проект - это написать нормальный движок, и на базе этого движка сделать усовершенствованный, на котором я уже буду реализовывать вот эту идею. То есть, этот проект пишется только для того, чтобы написать хирурга ниндзю качка более качественно, набраться опыта так сказать. Потому что на тот проект у меня большие планы и большущая куча идей)
Временное описание: Игра будет представлять собой динамичный безжалостный шутер, полностью основанный на псевдофизике. В перерывах между миссиями мы сможем собирать свои корабли, собирать и настраивать оружие и прочие девайсы для них. В игре будет присутствовать сюжет. Сюжет будет безжалостным, конец игры печальным, а игра хардкорной, игрок не сможет почувствовать себя супергероем. Любые повреждения корабля напрямую отразятся на его поведении. Полосок здоровья как таковых не будет. То есть, повреждение оружия может вызвать потерю урона, внутренний взрыв боеприпасов или просто выведение оружия из строя. При повреждении системы охлаждения двигателей, двигатели начнут очень быстро перегреваться, повреждение кабины может вызвать полную или частичную потерю управления, повреждение грузового отсека может повлечь за собой потерю хранящихся в нём предметов, причём если внутри были взрывоопасные предметы, например, патроны для орудий, то произойдёт взрыв внутри самого корабля и т.д. То же касается и врагов. Корабли будут состоять из множества зависящих друг от друга компонентов, а не единой анимированной картинки. В игре не будет ни одной статичной текстуры, кроме, разве что, частиц. Главный герой - пилот суперсовременного космического корабля, молчаливый вояка до мозга костей без чувства юмора. Воевать будем с ордой старых боевых роботов. Миссии постараюсь сделать как можно оригинальнее и разнообразней. Также прикручу к игре шейдеры и хорошенько поработаю над освещением. Запилю нормальные столкновения и сделаю физику взрывов более реалистичной и менее очевидной, чем в первой части. Возможно, будут миссии в атмосферах планет, а может и не будут.
Текущая версия 0.0.3 (Ого!)
Версия 0.0.3 (02.10.16) -отдельная программа для создания файлов с описанием физического тела на основе бмп изображений и заданной палитры материалов -тайлы -материалы -физическое тело (маска материалов) -многокадровые текстуры -вывод отдельной текстуры на экран -вывод отдельной многокадровой текстуры на экран
Версия 0.0.2 (не помню когда) -отдельная программа для конвертации bmp файлов c файлом альфа канала в собственный формат текстур. -текстуры
Версия 0.0.1 (не помню когда) -векторы, операции с участием векторов -обработка клавиатуры и мыши -работа с рандомными числами -работа со временем -создание пустого окна