Magnetic Force - прототип
- Я жив!!! :)
- Идея написать мега-удобный мультиплатформенный движок все еще не дает мне спать по ночам. Одну любопытную методику как раз протестирую на этом прототипе. После чего уже буду применять ее в будущих проектах. По такому случаю пару недель возился с установкой и настройкой виртуалки (для портирования под OS X и iOS). Сейчас все работает, проекты даже компилируются и запускаются на реальном айпаде.
- Параллельно изучал вэб-технологии. Полгода назад в этом вообще был полный ноль. Теперь знаю html, css, javascript, php, sql. Сейчас сижу за ASP.NET и Ajax. По ходу изучения экспериментировал с сервисом Droppages. В результате появился простенький персональный сайт - gambala.droppages.com. Ничего сверхъестественного - описания анонсированных игр, программ, и заметки с комментированием через Disqus.
- Привел в порядок свои заметки - в том числе идеи всех будущих игр. Получился список из 14 проектов. Для многих детально проработаны сценарии, причем действие почти всех игр происходит в одном мире - будут моменты, когда дальнейшая судьба главных героев одной игры раскрывается совсем в другой игре.
- Неспешно изучаю музыкальную грамоту. Иногда подключаю midi-клавиатуру и сочиняю. Музыка в этом прототипе - одно из моих "произведений".
- Озабоченный вопросом неподдельного искуственного интеллекта в играх, где-то с месяц изучал нейронные сети. Результаты спорные - надо провести реальные тесты. В будущих версиях прототипа попытаюсь реализовать тру-ИИ на нейросетях.
Ну а теперь, то, ради чего я создавал этот пост - прототип + интерактивчик :)
Magnetic Force
Hotseat-игра для двух игроков. Каждый управляет своей высокотехнологичной сферой, способной излучать магнитные волны. Эти самые волны позволяют сфере притягиваться к металлическим сферам, размещенным на уровне. Есть мертвые зоны - в них невозможно достать волнами до металла, поэтому, попав туда, сфера уже не сможет выбраться и просто упадет. В прототипе, если это произошло, сфера респаунится.
Первый игрок управляет стрелками, второй - wasd. Выход из игры по Esc.
...и это все! :) Прототип же. А вам я предлагаю решить его судьбу. Есть несколько направлений, по которым можно развивать проект. Ниже приведен опрос. Выберите самые приоритетные, на ваш взгляд, направления. Три победителя будут реализованы в следующей версии игры - теперь уже v0.2
P.S. Напротив каждого направления указана степень сложности. Чем больше знаков "!", тем сложнее направление, и тем дольше придется ждать следующую версию игры.
А еще - можно похимичить!
Козинака в Несыти использовал xml для хранения некоторых параметров игры. Такой подход иногда применяется в играх и позволяет "простым смертным" создавать свои собственные моды, изменяя xml-файлы. Я же с детства был помешан на базах данных. Это привело к тому, что все данные этой игры хранятся в SQLite БД. Которую можно спокойно открыть, например, вот этой утилитой. При желании можно очень много всего изменить:
- Добавить на уровень новые детали (растительность, спрайтовое освещение, задники - нужно только положить изображения-спрайты в папку Data и зарегистрировать их в соответствующих таблицах).
- Добавить физические тела - например, насыпать тонну маленьких легких кубиков.
- Добавить поддержку третьего и четвертого игрока. Правда, управление пока только на клавиатуре.
- Позволить одному игроку управлять не только одной-одинокой сферой, но и целым роем!
Если будут желающие, я могу в спойлере описать структуру всех таблиц.
- 15 января 2012, 12:04
- 04
имхо управлять целым роем интереснее.
идея - если делать рой, то при намагничивании шары притягиваются друг к другу, при размагничивании разлетаются по действием гравитации. при столкновении роев друг с другом, шары ударяются и разлетаются. цель игры - разбить рой противника.
Хорошо, мне идея с роем тоже нравится. Но как задать критерий победы? Как определить, что рой разбился и больше не соберется?
просчитывать расстояние между шарами. если оно больше допустимого - рой развалился.
Между каждым и каждым шаром? Может лучше добавить "королеву роя"? Если шар удаляется от королевы слишком сильно, он деактивируется. Когда останется 5%-10% от начальных шаров - рой распался.
нет, скорее между контролируемой точкой, если делать через нее, но мне самому это вариант не нравится.
можно между каджым с каждым просчитывать. если шаров не 1000, то это это для процессора раз плюнуть
Тогда можно определять координаты "центра роя", как среднее координат всех шаров. И от центра уже плясать.
да, так будет гораздо лучше)
сделай все плавнее и медленнее, сейчас все адски быстро.
Попробуйте открыть базу данных игры и поиграться со значениями столбца Density в таблице PecoDynamicBody. Это плотность шаров.
попробую)
например, есть шар - ядро, а вокруг него рой. но это как-то слишком избито. лучше имхо так:
группа наиболее сближенных друг с другом шаров являет собой ядро. это легко организовать естественным образом - например мы управляем невидимой точкой пространства, шары стремятся к ней, и долетя врезаются друг в друга, сбиваются в кучу, формируя круг. кажется будто они просто сбились в кучу друг с другом.гравитация у точки действует всегда, но слабо, можно ее усиливать.
Хорошая мысль, надо будет попробовать. Скорее всего я сделаю так - добавлю меню выбора уровня и состряпаю разные уровни с разной механикой.
Я бы в первую очередь попробовал всё-таки с ядром. Это как-бы протагонист игрока, иначе непонятно как поражение считать.
Есть шар и рой вокруг него. Рой, это не шары, а заряженные частицы. У каждой частицы есть уровень заряда, отображается он силой свечения. Частица постоянно наращивает свой заряд, до максимального значения. Шар для перемещения тратит энергию своих частиц - дёрнулся, частички пригасли. При столкновении двух шаров их сталкивающиеся частицы поглощают друг друга (более заряженные остаются жить) поэтому важно столкнуться с другим шаром в тот момент, когда он разряжен. Уничтоженные частицы медленно восттанавливаются.
В таком случае лучшей стратегией будет сидеть на месте в окружении полностью заряженных частиц. Чтобы этого избежать вводим ещё одну функцию - временно собирание роя частиц в кучку, при этом уже нельзя тратить их энергию. Это позволит разогнаться и толкнуть другой шар только своим шаром, собрав в полёте свои частички в кучку (она сама окажется позади из-за движения).
Таким образом каждый игрок стоит перед выбором - ударить и подставиться из-за последующей разрядки или выждать рискуя потерять инициативу и получить толчок от более активного товарища.
...можно за пропущенные толчки тоже понижением заряда штрафовать.
Путаница, конечно, и не факт, что заработает, но целью должна быть система: размахнулся - подставился, попал - получил преимущество.
Короче я за композитного протагониста с разными состояниями, но всё же цельного.
Выглядит приятно, но боюсь мне сейчас не с кем попробовать поиграть. :(
я сам с собой двумя руками попробовал - слишком резко все
Последовал примеру - поиграл сам с собой. :)
Удивился, что надо тыкать кнопкой для каждого импульса - ожидал, что шар будет постоянно притягивать в сторону нажатой кнопки. Но, в принципе, наверное так и надо, иначе пропадает спортивная составляющая управления.
Смерть блёкла, хочется какого-нибудь эффекта. А ещё хочется карты побольше, со скроллом чтоп! :)
P.S. А почему именно такое название шаров? о_О Если русскоговорящий разработчик называет что-то "Йоба-болз", то это настораживает. :D
прототип же :)
почитай про наше обсуждение идеи с роем выше, может есть идеи
Название рабочее - просто первое что пришло в голову. Потом подберем что-нибудь подходящее под сформировавшуюся концепцию игрового процесса.
Это энергия слишком быстро заканчивается. Я сейчас думаю, надо бы ее вообще убрать. Пусть сфера излучает волны всегда.
а как ты будешь нейронные сети организовывать, не слишком ли это ресурсоемко?
Месяц изучения нейронный сетей, это пора энтузиазма и веры в то, что они всемогущи. Я потратил на них больше, даже записался и проучился на курсах при МГУ (http://www.neuroproject.ru). После того, как потрогаешь их ближе, становится понятно, что к играм их применять сложно и, главное, совершенно не нужно. Громоздко, ресурсоёмко, трудноупровляемо и трудноотлаживаемо. Применить можно для реализации адаптивных фишек, которые легче, быстрее и качественнее реализовать специализированными алгоритмами.
Главное отличие нейросетей от алгоритмов - обучаемость. Меня всегда раздражало в играх, что ИИ играет по одним и тем же правилам. Конечно, можно выбрать сложность, но все равно - гораздо лучше, когда ИИ учится вместе с вами.
Насчет ресурсоемкости - можно ведь использовать их вместе с мат. алгоритмами. Например, в нашем случае - раз в полсекунды нейросеть будет решать, в какую сторону лететь - навстречу противнику или от противника. А дальше - будут работать обычные алгоритмы, которые будут оценивать, лететь вверх или вниз, сжимать рой или расширять, и так далее.
ну так это не обязательно именно методом нейронных сетей решать, есть много других задач в теории искусственного интеллекта
Да, но смогут ли другие способы "учиться" на своих ошибках?
А не много ли места будет жрать такая сеточка на диске?
В твоей предметной области "ошибки" можно формализовать и перечислить, а также собрать на них набор стандартных реакций с некоторыми адаптивными параметрами типа амплитуды и прочего. Нейронная сеть нужна там, где нужно принести то, не знаю чего, причём там, не знаю где. И то, для этих задач нужно долго и кропотливо селекционировать нужную архитектуру сети.
тебе ведь, надеюсь, не нужно использовать распознавание образов?
действительно обучаемость вполне можно алгоритмизировать без всяких нейронных сетей, нейронная сеть это уже очень сложная структура не совсем для игр предназначенная.
Мне нужно, чтобы ИИ мог учиться вместе с игроком. Все! Никаких распознаваний образов и прогнозов изменения курса доллара. Как сказал Козинака, "ошибки" можно формализовать и перечислить, так что нейросеть в большинстве случаев не нужна будет.
я о том и говорю, что нейросеть не нужна.
Адаптивность и обучаемость в данном случае проще сделать обычным алгоритмом - ни то, ни другое не является нейросетевым ноу-хау. Для того, чтобы управлять шаром ты только на подбор оптимального размера персептрона (если ты им собираешься это делать) потратишь такое количество времени, что быстрее и легче будет продумать конкретные пути адаптивности поведения шара и реализовать прямым алгоритмом.
- потому что ИИ в большинстве игр это не ИИ, а набор скриптов, отличающийся сложностью и количеством оных.
Почему-то не нравится название, но не пойму, почему. :)
Переименовал в Magnetic Force.
Выпустил мини-апдейт 0.1.1:
смеха радидля тестов физического движка.По результатам опроса выбраны три приоритетных направления. Вот, что появится в версии 0.2:
а как же идея с роем?
Рой будет неплохо вести себя в этой версии, а вот когда появятся всякие цепи, качели, геймплей изменится, и, думаю, рою будет в нем неуютно.
Блин, нет, чтоб модингом заняться, так туда же: физика, физика... :'(
Публика возжелала... Но вообще, поддержке модинга я планирую уделять много внимания. Сейчас в игре открытая БД, потом сделаю закрытую игровую и поддержку модов-плагинов, как в серии TES. Для этого даже код уже написан наполовину.
сумасшедшие кубики носятся по всей комнате с пугающей скоростью, так и должно быть?
да, на то они и сумасшедшие) похоже я слегка переборщил с прыгучестью.
Нужно забить на этот опрос и все что там перечислено и попробовать реализовать идею с роем, может получиться интересно. А добавление физических объектов не спасет текущую версию (мягко говоря неинтересную), пустая трата времени. imho
Эхх... Рой или физика? Дилемма... Если добавить физику, получится аналог hotseat'а из игры Gish. Который, в свое время, был достаточно интересен. Говорите, сейчас это уже не спасет?.. ммм...
А может создать дополнительную ветку проекта? Благо, система управления версиями позволяет. Кстати, такая концепция пойдет?
Два режима игры ИМХО спасут ситуацию
Звучит свежо и здорово)
Ты только с физикой не переборщи. :)
Весьма интересный вопрос. Помниться раньше тоже в нем капался.
В нос закапывал? :)
по поводу ИИ, есть численный метод обучаемости:
1. Через каждый заданный промежуток времени в ячейку таблицы (ты как раз БД любишь) записывается расстояние до противника. Например, раз в секунду. В соседнюю ячейку записывается индекс записи.
2. Пусть x - индекс записи, y(x) - расстояние до противника. Таким образом у нас получается таблично заданная функция зависимости расстояния от времени.
4. Экстраполируем функцию на основе последних n значений. Получаем ожидаемое расстояние до противника согласно его действий в течение n последних секунд.
Это не обучаемость, это экстраполирование траектории. Обучаемость появится, если эта экстраполяция будет зависеть от прошлых действий пользователя и одну и ту же траекторию будет экстраполировать по-разному.
под противником и имею в виду пользователя, ИИ ведь для НПС пишется.
неточно выразился. главное, что нужно экстраполировать на основе прошлых действий игрока, а не накручивать нейронные сети которые будут делать то же самое)