Записи, помеченные ‘gamedev’

Arena. Командный AI.

Воскресенье, 25/04/2010

Пишу “игрушку” с командным взаимодействием между управляемыми компом человечками. Основной принцип заключается в том, что логика для каждого персонажа выполняется функцией, получающей в качестве аргументов список клеток, на которые он может сходить, и список всех видимых ему других персонажей. Он может ходить и стрелять, все просто как кирпич ) Обзор сделан маленьким - круг радиусом в ~2.5 клетки.

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

Интересно проверить, на сколько сложного поведения удастся добиться от этих не особо многофункциональных человечков )

Возможно, что я допишу-таки свой интерпретатор ML-подобного скриптового языка на ocamllex/ocamlyacc, тогда можно будет даже распространять гаму по интернетам на радость фанатам OCaml/SML/etc. %)

Project Jealousy #1. Генерация портретов персонажей.

Воскресенье, 6/09/2009

Новости

Как я уже писал в “Project Jealousy #0“, я программирую 2D Tactical RPG. Основная механика хождения группы по пещерам, стрельба и освещение работают почти хорошо, поэтому теперь первостепенной задачей стал моск/разум существ. Сейчас я пишу скриптовый язык (NV-script) для программирования логики мобов, мувиков + кое-каких дополнительных возможностей (программируемый игроком робот !! А-а-а !!). Ботаю книжку Programming Language Pragmatics. Иногда хочется просто отвлечься от постоянного переписывания парсеров и лексеров, и сделать что-то существенное и интересное.

Портреты персонажей

Очевидно, маленькие персонажики 16 на 16 пикселей, пусть и увеличенные (x2) - это несколько недостаточно для создания атмосферы игры. Конечно, можно привести в пример rogue-like игры, но навязанный минимализм и культура рогаликов - это несколько не мое, поэтому я решил сделать портреты персонажей. Идея отличная, но чтобы нарисовать десятки или даже сотни портретов, надо искать художников, которых у меня наберется всего-то в количестве 0.25 человек. Что делать?

Кстати, три классических вопроса русской интеллигенции: Что делать? Кто виноват? И кто взял мои очки?

Итак, поскольку я планирую генерировать максимально возможное число игровых сущностей, почему бы не генерировать и портреты за одно? Предположим, что портрет должен выглядеть так:

Основная идея - это разделение картинки на составные части: 1) овал лица, 2) глаза, 3) нос, 4) губы 5) волосы (прическа). Заменяя любую из частей лица, мы получаем уже другой внешний вид, другого персонажа. Достаточно даже всего четырех вариантов лиц, глаз, носов и т.д., которые дадут 4^5 = 1024 разных лица. Может быть, они и будут не сильно одушевленно и выразительно выглядеть, но в качестве фотографии на паспорт сойдут. Плюс, наличие персональных лиц позволяет сделать дополнительные приколы с полицией, ищущей опасных преступников по фотке, баунти-хантинг и т.п.

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

Механика

Каждая черта лица представляет собой последоватльное наложение белой основы, (если надо: лицо, прическа, губы), тени и контура (опять же, если надо). В показанных в этой статье картинках такой контур используется для глаз, бровей и носа, а обводка на лице - это часть “белой основы” (методика пока не отработана и изменения еще будут).

Каждая картинка обрабатывается фильтром (red, green, blue, alpha) и наклеивается на идущую перед ней. Полный нераскрашенный портрет выглядит так:

Отдельные части лица приведены на следующем рисунке в порядке их наложения. Пометка “shadow” означает, что картинка является тенью - как правило он выводится полупрозрачной (0.0 < alpha < 1.0).

Последовательным раскрашиванием и наложением картинок, можно достигнуть достаточно разнообразных результатов. От цвета кожи (первый ряд следующего рисунка), до макияжа и анимешно-вижуалкейных цветных волос (второй ряд). Различную степень затененности (и резкости тени) можно использовать в зависимости от типа освещения окружения (день-солнце, пещера). Добавление красно-оранжевого фильтра создаст эффект закатного солнца и т.п. Есть где развернуться.

Пока показан только один тип лица, и все различие сведено к раскашиванию.
В целом, кажется, что получается довольно неплохо.

Из плюсов таких портретов:

  • Разнообразие лиц
  • Похожий стиль каждого изображения
  • Меньше работы художника
  • ?
  • Профит

Из минусов, очевидно:

  • Разнообразие возможно только в допустимых перделах
  • Шаблонные лица - отсутсвие уникальности героев
  • Дополнительная сложность рисования, необходима совместимость различных черт лица между собой
  • Что-то еще, что может пофейлить идею

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

Project Jealousy #0

Четверг, 23/07/2009

Пока студентов учить не нужно и лето, работаю над игрой в стиле.. внимание.. Turn-based Tactic/RPG с возможными элементами Horror/Bloody-mess XD Звучит пафосно, это да.

Первоначальная идея была взята из супер-отличной коллекции идей геймдизайна “Three Hundred Mechanics “: (#086 - Darkness Creatures) и заключалась в управлении командой персонажей в данджене, в темных лабиринтах которого игрока дожидаются кровожадные мобы. Хотя эта идея была только отправной точкой, подсказав дизайн игры, основанный на освещенности игрового поля: каждый персонаж видит только небольшую область вокруг себя, а остальная часть карты погружена во мрак.

Управление командой персонажей - пошаговое с использованием Очков Действия (Action Points, AP), аналогичное системе Fallout/Fallout 2.

Язык реализации - OCaml (Objective-CAML) - клевый язык программирования, позволяюший использовать функциональную, объектно-ориентированную и императивную парадигмы. При этом он компилируется в высокопроизводительный исполняемый файл, часто сравнимый по скорости работы с программой на C/C++. Но в отличие от С++ тут есть “Сборщик мусора”, функциональные кошерности, суперудобная (хотя и не очевидная по началу) обработка данных по шаблону (pattern matching), и вообще много всего того, что должно быть в современном языке программирования %) Все это сильно повышает выразительность языка - по существу, каждая строчка кода несет смысл, и программируя думаешь о том, что тебе хочется получить, а не о том, что от тебя требует традиция языка/компилятора. У меня сложилось очень приятное впечатление. Существуют реализации компилятора OCaml под Linux/Windows/Mac. Имеется достаточно удобная стандартную библиотека. Для целей геймдева есть реализации SDL и OpenGL. Все работает как часы )

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

Ах, да, назваение Jealousy Project - это временное название, отчасти появившееся из-за песни X Japan - Silent Jealousy. В прочем, какая разница-то.. ))

Двухмерные толстяки

Среда, 7/01/2009

Go team sea slug!

Сейчас, собственно, хочу расказать о способе автоматической генераци небольших 2D персонажей, который хочу использовать в своем .. возможно-проекте.

Цель - провести автоматизацию создания изображений персонажей и NPC по неболшому числу входных пареметров. В данном случае - по мускулистости, толстости и упрощенному скелету.

За основу берется двухмерный скелет (см. картинку ниже) и по нему генерируется плоская картинка. Способ “облепливания мясом” достаточно простой. На каждую “кость” скелета нанизывается от 1 до 3 (можно и более) трапеций. Схема примерно такова:

В результае получаем следующее:

Сильные и жирные. Для этого размеры трапеций генерим по формулам вида

radius (Base, A, B) = Base * (1.0 + (A * Muscles) + (B * Fat))

где Muscles и Fat считаем константами для каждого отдельного пермонажа. А переменные Base, A и B - параметры, специфические для каждого участка тела. Эти параметры подгоняются, пока результат не начинает походить на настоящих жирных и тощих людей.

Учитывая, что картинки предполагаются маленькими, особой точности не нужно.

Для получения сглаженного изображения - строится увеличенная картинка (например, x4), потом уменьшается до нормального масштаба.
Результат для разного телосложения примерно такой:

Далее я пока не решил, как лучше развивать этот метод для получения финальных спрайтов. Один из возможных - использовать эти полученные картинки как маски (трафареты) для специально созданной квадратной “2д-текстуры”, и эти маски будут выхватывать из “текстуры” центральный кусок, соответствующий по размеру - размеру персонажа. Для предметов и сложных шмоток, надетых на персонажа, можно сделать отдельные трафареты, как и для персонажа, и вырезеть, скажем на “стальной” “текстуре” - доспехи, и т.п. .. Способов масса.

На рисунке ниже используется вариант с общей текстурой.
Получилось несколько коряво из-за того, что в первоначальной модели одежда не была предусмотрена. Но это - корее дкмонстрация идеи.

Все это может добавить разнообразия и в картинку, и в геймплей (броня разного размера и т.п.). Это вполне посильный труд, как мне кажется. Кстати, все это я писал на языке программиравания OCaml. Он клев.

Go team sea slug!