Использование полупрозрачных тайлов при процедурной генерации карты для roguelike игры
Авг 16
Обычно при создании roguelike игры для отображения карты используются ASCII символы. Это вызвано двумя причинами: простотой реализации и наследственностью от прародителей жанра, которые были выполнены в подобном стиле псевдографики. Такая roguelike игра обычно выглядит следующим образом:
DoomRL – современная roguelike игра
Также существуют roguelike игры, которые вместо псевдографики рисуют игроку тайловую карту. Примерно такую:
Dungeon Crawl Stone Soup (DCSS)
В данной статье пойдет речь о том, что создать более продвинутую тайловую карту не сложнее, чем создать карту, как это реализовано в DCSS.
Ignite – обновленные корабли
Авг 5

В ходе дискуссии на rlgclub.ru, было принято решение, что корабли в игре будут изображены не схематично, а как надо. Выше изображение – картинки кораблей Солар в игре: фрегат, перехватчик, еще один фрегат и шатл.
Чтобы много не писать текстом, подготовил такую вот картинку с дизайном легких кораблей Бруторов.
Ignite – скриншот дня
Авг 5
Добавил нормальное перемещение – клик по карте передает изменение координаты игрока и вместе с ним двигает камеру. 3 других кораблика добавлены для теста, чтобы я мог вокруг них полетать.
На данный момент приостановил реализацию идеи с инерционностью движения – тупо не могу нормально реализовать плавный поворот в реальном времени. Либо доковыряю потом, либо придумаю упрощенную модель поворота.
Добавил боевой overlay (круги вокруг корабля), которые отмеряют расстояние. Принимаю идеи по его модификации в пользу увеличения полезности.
Ignite 0.35a – предварительные итоги/направления работы
Авг 4
И так, у нас в планах космос и схематическая, приятная графика с кучей спец эффектов. Перед тем, как я рискну показывать свою работу публике, необходимо сделать некоторые изменения/доработки в игровом движке. Перечисляю их тут скопом и, возможно, разработке некоторых из них будет уделено немного больше времени в отдельных постах.
Пространство. Космическое пространство в игре разделено на “блоки”. Во-первых – все пространство вселенной разделено на солнечные системы. Вне систем игры нет, встреч в самом открытом космосе (как это было, например в Master of Orion) не будет. Во-вторых, отдельно взятая космическая система – это тоже не непрерывная зона. В памяти игры информация о солнечной системе будет представлять собой набор разнообразных космических объектов, которые “содержит” эта система в себе: солнце(-а), планеты и их луны, различные аномалии. Вокруг этих объектов будет создаваться пространство в котором и будут происходить всевозможные игровые события. Это пространство будет очень большим (на данный момент я собираюсь ограничить его до 128000^2 единиц, при размере космического корабля в 48^2 единиц). Пространство двухмерно.
Перемещение в пространстве. Все события в игре происходят по-шагово. В свой ход можно переместиться в пространстве и осуществить выстрел из орудий (если они готовы к стрельбе и есть цели). Для перемещения, игрок выбирает точку на экране, куда бы он хотел переместиться. В зависимости от координаты этой точки, координат игрока, направления движения игрока и его скорости, принимается решение, нужно ли осуществлять поворот корабля. Корабль летит только вперед, не может “стрейфиться” и т.д. при достаточной угловой скорости корабля (скорости поворота), корабль сможет выполнять достаточно резкие маневры. При недостаточной скорости поворота, корабль постарается максимально точно достичь пункта назначения, но не факт, что его характеристики позволят сделать это.
Стрельба. В игре будет несколько видов орудий и их свойства различны. Основными свойства: повреждения и его тип, дальность стрельбы, угловая скорость орудия и размер базовой цели. От угловой скорости и размера базовой цели зависит шанс попадания по противнику. Размер базовой цели – это размер цели, которая будет поражена с 100% вероятностью при ее угловой скорости не превышающей угловую скорость поворота турели орудия. При размере цели > размере базовой цели орудия, влияние угловой скорости на шанс промаха снижается, наоборот – увеличивается. Т.е. более компактные орудия имеют больший шанс попадания, чем огромные неповоротливые махины, но имеют меньший урон.
Так же будут влиять некоторые факторы ведения огня. Например, трассировочные патроны, заряженные в скорострельное осколочное орудие, с течением времени будут увеличивать шанс попадания по одной и той же цели из-за того, что системы наведения смогут автоматически корректировать ведение огны по трассеру. Тоже самое характерно для неимпульсных лучевых орудий, но последние с течением времени могут существенно перегреться и выйти из строя. Я буду стараться, чтобы все виды вооружений имели сходные особенности и не было безликих турелей с повреждением Х типа Y.
// да, почти все, кроме особенностей оружия я выдрал из EVE-online, а они из учебника по физике для 9-го класса.
Внешний вид и камера. В центре отображаемого пространства находится ваш корабль. Фактически он не двигается в пространстве, а это пространство будет двигаться вокруг него (но вы, конечно, этого не заметите
). Фоном для всего происходящего будет одна из десятка нарисованных мною картинок космоса.
Содержимое демки. В демке будет 2 солнечные системы. Будет возможность перелететь из одной в другую и выполнять пару-тройку боевых миссий.
Фотография – лепестки розы
Авг 2
Каждый букет, который застаивается у меня дома (при времени t > 15 мин ), удостаивается чести быть запечатленным на мою камеру. Вообще фотографировать природу – это здоровское удовольствие, т.к. твои модели не жалуются, не просят посмотреть фотки спустя 7 кадров, не считают, что они недостаточно хорошо выглядят, и вообще на природе можно просто помолчать и быть укушенным за ногу.
Иногда, в результате подобных фото сессий получаются такие фотографии:
Фото Лепестки розы, выдержка 30 сек, диафрагма F/9.0, фокусное расстояние 50мм, макрофильтр +3
Съемка велась в полной темноте при использовании штатива и самопального “софтбокса”, изготовленного по-технологии, указанной в этом посте. Если так подумать, то я могу составлять подобные схемы сразу из двух источников
(а если победить лень и сделать нормальный софтбокс… (: ).
Ignite – лытдыбр
Авг 2
Эй, обо мне написали в новостях на Roguetemple.com ! Хоть это и просто обыкновенная ссылка на этот сайт, но я благодарен вам, ребята, за это упоминание о моей персоне и проекте, который освещается здесь – это одна из тех вещей, которые мотивируют меня на дальнейшую работу. Большое спасибо!
Использование телефона в качестве фонарика
Авг 2
Часто бывает такая ситуация, когда при фотосъемке необходимо использовать дополнительный источник света. И, зачастую, эта проблема или решается в лоб – покупкой дополнительного оборудования, или не решается вообще. Но оборудование кроме того, что может влететь в койпеку, так еще и накладывает ограничения на свое использование, т.к. софтбокс в карман не положишь. В этом случае, при не сильно большой площади фотографируемой картинки, нам на помощь приходит портативный фонарик или, что еще лучше, современный мобильный телефон.
Современные мобильные телефоны (подчеркиваю: современные) могут с легкостью заменить фонарик, освещая ваш путь домой, так и представить из себя небольшой софтбокс, который можно использовать, например, для подсветки цветка. В этом отношении хороши топовые модели современных телефонов с тачскринами больших размеров (например, в 4 дюйма): это iphone или телефоны на базе ОС Android.
Фонарик на таких телефонах включается через дополнительное (бесплатное) приложение. На iphone есть собственный фонарик, но нам нужен вариант, когда будет светить вся поверхность экрана, а не точечный источник света. Подобные приложения можно взять на AppStore или AndroidMarket`e, но, я думаю, это вам и так известно, если вы являетесь владельцем подобного телефона.
Кстати, при наличии IPad`a или любого другого планшета, из него с легкостью можно сделать софтбокс чуть большего, чем мобильник, размера. Полноценного софтбокса эти трюки, конечно, не заменят, но для решения узко-специализированных задач вполне могут подойти.
- – -
И отдельным абзацем. Кто-то, зачем-то решил, что ниже представленная фотография является черезчур хорошей и выбрал ее в качестве фотографии месяца на DeviantArt`e в своей личной коллекции.

Эта фотография была сделана в офисе одного моего хорошего друга (который точно читает этот блог, хе-хе), когда он пригласил меня туда, чтобы пощелкать ночной Донецк с высоты полета среднего голубя. Как вы можете заметить, в итоге этот аквариум занял больше моего внимания, чем Донецк в не очень освещенную пору суток.
Просто запись в уютный бложек
Авг 1
Вы замечали, что даже при отсутствии облаков на небе, присутствующие в воздухе капельки влаги и прочих газов выбеливают цвет неба ближе к горизонту, даже несмотря на кристальную голубизну над головой. Этот эффект дает в итоге градиентный переход “синий-голубой” от верхнего края снимка до линии горизонта.
Сегодня 1 августа – день рождения моей матери. Я ее очень люблю, намного больше, чем позволяю себе показать. Пойду поздравлю ее, пускай она будет здорова и счастлива.
Еще несколько слов о фотографии
июля 31
Сегодня на несколько часов выбрался “на природу” поснимать. Как всегда отбор прошло несколько фотографий, и первая из них (в хронологическом порядке):

Эту фотографию я делал зажав между плечом и ухом мобильник, держа голову на расстоянии в 15 см от земли – то еще было зрелище со стороны. По приходу домой немного кропнул в Лайтруме, чтобы не было видно краев одуванчика (а это именно он). Не имея краев, фотография приобретает некоторую ирреальность, которую я часто пытаюсь “ухватить за хвост”.

Не знаю, как называют это растение умные дядечки биологи, но я сегодня нашел его вдоволь и просто называл “растение”
Ничего сюрреалистичного у этой фотографии я не откопал, просто мне нравится форма, текстура и то, как получилась эта фотография при переводе ее в оттенки черного и белого.

И последняя фотография – мои робкие эксперименты по съемке макрофотографий с открытой на максимум диафрагме. В следствии этого глубина резкости резко стремится к своему минимум (на этой фотографии глубина резкости 1-2 мм), а фон с многими частями основного объекта съемки расплывается в нерезкость очень активно. В целом, результатом я чрезвычайно доволен.
Ignite – система “обертки” и контейнеров
июля 29
При своей работе Ignite использует множество ресурсов, в том числе и графические файлы, которые требуют особого ухода: загрузку, хранение, доступ и высвобождение от них памяти. Для реализации этих функций, я использую систему “обертки”. Она состоит в том, что все ресурсы игры перед использованием автоматически заносятся в реестр, обращаясь к которому, можно получить доступ к любому, хранимому там, ресурсу или инициализировать его подгрузку из локального хранилища. Этим ресурсом может быть изображение (я использую .jpg для непрозрачных изображений из-за высокой степени сжатия и .png для рисунков с прозрачностью), шрифт или любая переменная созданная при работе программы.
|
1 2 |
Обращение к объекту выглядит следующим образом:
init.getImage("solar_frigate", "images/ships/solar_frigate.png"); |
Загрузка ресурсов может быть вызвана в определенный момент времени (это, например, всем известный экран загрузки) или прямо во-время выполнения программы. Кствти, такая загрузка ресурсов через систему “обертки” дала значительное увеличение производительности не только при рисовании на форме, но и как замена стандартной загрузки в PictureBox. Обращение в систему ведется через имя ресурса, которое регистрируется при его загрузке в реестр. По-завершении работы программы, реестр очищается.
Также ignite для вывода информации на экран и организации взаимодействия с пользователем использует систему визуальных контейнеров и объектов. Контейнеры имеют функционал по созданию и работе с объектами, а также хранят массив ссылок на последние. Такой объект описывает любой графический элемент, который может быть выведен на экран.
Кстати, касательно вывода на экран, вся информация по прорисовке объектов хранится в нем самом в виде перегружаемой функции, которая отвечает за его отрисовку. Т.е. объект-картинка и объект-текст будут иметь разные функции draw(), отвечающие за прорисовку объекта. Точно также реализуется алгоритм реакции на любые “внешние раздражители”: наведение мышки, клик по объекту, реакция на нажатие клавиш клавиатуры… А те объекты, которые не имеют столь продвинутого функционала, не имеют данных функций.
Контейнер также имеет функцию draw(), которая отвечает за последовательный вызов всех необходимых функций для прорисовки объектов в необходимом порядке (с учетом слоев).
Каждое окно имеет свой собственный контейнер с объектами, присущими только этому окну, а перебором активных окон уже занимаются основные циклы программы.
|
1 2 3 |
Например, так выглядит блок вызова отрисовки из основного цикла:
activeContainer.draw(buffer);
if (secondaryContainer != null) secondaryContainer.draw(buffer); |
Такой модульный подход при проектировании позволяет уменьшить нагрузку на процессор с одной стороны, а также разбить огромные процедуры (связанные, например, с выведением информации на экран или обработкой боевой ситуации) на множество гораздо более мелких процедур, в которых будет выполняться непосредственно только то, что необходимо для работы конкретного объекта. Уменьшение размеров процедур также положительно влияет на простоту поиска ошибок и дальнейшие модификации кода.


