Viaceslav(C)
> плиз опиши ситуацию более детально, не думаю, что тут что то сложное в
> реализации, главное понять, чего хочет фантазия :)
Так ёжкин же кот! Наоборот! =))
С реализацией я сам справлюсь. Мне нужны идеи, идеи о механике, о принципах обрушения блоков.
Ну, сходу можно придумать три пути реализации физики -
1) какие-то очень простые правилы, вроде Boulder Dash или как я понимаю майнкрафта (хотя я в него не играл). Т.е. одни блоки падают, другие удерживаются и т.д. Плюс - игроку будет легко понять что к чему.
2) симулировать сопромат (с некоторой степенью точности). Моменты, эпюры, заделки. Тем более здесь все уже разбито на блоки. Ну и т.к. мир двумерный и без непрямых углов, то наверное все сводится к определению эквивалентной нагрузки на стыках блоков.
3) нечто среднее между этим, т.е. физику не симулируем, но вместо этого используем некий велосипед, похожий по конечному результату на симуляцию физики. Правда ничего такого сходу не удалось придумать.
Допустим, мы хотим чтобы линия камней
##.... ###### ##.... ##....
не разваливалась, а
##..... ####### ##..... ##.....
ломалась, причем у основания.
Тогда
##.........## ############# ##.........## ##.........##
Должна разваливаться посередине, а
##.........## ##.###.....## ##..#......## ############# ##.........## ##.........##
видимо должна разваливаться под "столиком".
Как это сделать без честного расчет нагрузки?
kipar
О, вот это уже по существу.
В начале по вариантам:
> какие-то очень простые правилы
Первый вариант слишком примитивен, так как он не даёт необходимости строить надёжно. Почти любая постройка будет либо абсолютно надёжна, либо падать всегда, пока не упадёт.
> симулировать сопромат
Говоря откровенно, я наверное не потяну это. Теоретически, при грамотной настройке, это было бы лучшим вариантом. Но не потяну.
> нечто среднее между этим
Так что, выходит, остаётся именно это. В эту сторону и буду копать, делая простые правила, отдалённо похожие на реальную физику. Осталось определиться с ними, с этими правилами.
Теперь по конкретным примерам. Понимаешь, физика должна быть понятна игроку без десятков рисунков. Её принцип должен быть понятен. Прост, настолько, чтобы его можно было объяснить парой-тройкой предложений!
Ну вот например то, что в проекте сейчас: есть два типа блоков, кубиков: стабильные и не стабильные. Чтобы второй тип кубиков не падал, он должен прикрепляться к первому типу. Прикрепляться может и через длинную цепочку, конструкцию. Если в таком объединении, в такой конструкции количество нестабильных блоков превышает количество стабильных (* коэффициент), то конструкция падает.
Вот это базовый вариант правил, к которым я иду на сейчас. Как думаешь, эти правила можно усовершенствовать, не усложняя существенно?
sb3d
> Говоря откровенно, я наверное не потяну это. Теоретически, при грамотной
> настройке, это было бы лучшим вариантом. Но не потяну.
Меня тоже этот вариант пугает, но у меня есть ощущение, что там надо один раз разобраться, и все сведется к системе уравнений. И в результате может получиться с точки зрения кодирования даже проще, чем свои велосипеды.
sb3d
> есть два типа блоков, кубиков: стабильные и не стабильные. Чтобы второй тип
> кубиков не падал, он должен прикрепляться к первому типу. Прикрепляться может и
> через длинную цепочку, конструкцию. Если в таком объединении, в такой
> конструкции количество нестабильных блоков превышает количество стабильных (*
> коэффициент), то конструкция падает.
> Вот это базовый вариант правил, к которым я иду на сейчас. Как думаешь, эти
> правила можно усовершенствовать, не усложняя существенно?
Ну, например сделать два параметра - "стабильность" против "массы". Скажем, если над нашим туннелем лежат тонны песка, то этот туннель обрушится раньше, чем если бы наверху был воздух (или камень). Т.е. можно сначала посчитать общий вес блоков (причем разные блоки весят по-разному), и сравнивать его с "стабильностью", т.е. общим числом стабильных (или скажем полустабильных) блоков.
Но я не очень представляю себе, как это применять не к одной линии блоков, а к сложной конструкции, ведь по сути весь уровень это одна большая конструкция, а проверять устойчивость надо у отдельных элементов. Как эти элементы выделять?
kipar
> Как эти элементы выделять?
Сейчас конструкция считается на 31*31 блоков квадрат, где в центре текущий блок. Наверное, не очень понятно. В общем, идёт цикл по всем блокам. И для каждого блока выявляется его индивидуальная конструкция, то есть те окружающие его блоки, с которыми он соединён и которые "физического" типа.
> Ну, например сделать два параметра - "стабильность" против "массы".
Выходит, мы думаем одинаково. Я именно к такому варианту иду. =)
Крупный минус всей этой "физики" в том, что не важна конфигурация конструкции. А важно лишь соотношение стабильных и не стабильных блоков. Даже пусть с поправкой на их стабильность и массу. В общем это меня пока печалит, то, что форма конструкции роли не играет в прочности.
Вот если бы какое-либо совсем простое правило на _форму_ соединений блоков... Только чтобы совсем простое, уже сейчас всё запутанно и без поллитра не понять, усложнять очень не хочется.
Как вариант, возьми box2d, запрети квадратам поворачиваться. Задай стабильные блоки статичными, а нестабильные - динамичными. Задай джоины между блоками, чтобы каждый блок мог иметь до 4х джоинов со своими соседями. В джоинах смотри силу реакции, если натяжение слишком большое, то разрывай джоин.
Таким образом исходное положение задаётся твоей сеткой квадратиков, рогаликовскими блоками. Игрок ходит или ставит блок, игрок - тоже квадрат с каким-то весом. После того как игрок походил (и может быть объединить ходы монстров и игрока в один, или вызывать пересчёт после хода каждого монстра), строить копию уровня в box2d, задавать квадратики и между ними - джоины. Запускаешь просчет, ждешь пока система успокоится. Потом смотришь с какой силой натянуты джоины. Если натяжение выше предела - удаляешь джоин, продолжаешь просчёт опять до успокоения. Потом берешь box2d квадратики в финальном положении и апроксимируешь их к рогаликовским квадратам на экране.
В этом случае блоки просто будут падать вниз, не будет перекатывания и поворотов. Можно ещё подумать как задать правила для box2d так, чтобы даже с возможностью поворота (например, задавать не квадраты а шары или многоугольники) после успокоения блоки можно было однозначно перевести в клеточки рогаликовские (без всяких поворотов квадратов или застревания между двумя положениями в сетке)
"Всё украдено до нас", используй существующие 2д физические движки
soflot
> Запускаешь просчет, ждешь пока система успокоится. Потом смотришь с какой
> силой натянуты джоины. Если натяжение выше предела - удаляешь джоин,
> продолжаешь просчёт опять до успокоения.
Можно же проще - разрывы блоков делать по данным box2d, а вот перемещение (падение) блоков уже по своим правилам, вертикально вниз.
Правда есть проблема: если отваливается
#...... ####### #.....# #...... #......
такая штука, то по правилам неквадратной физики она должна будет упасть как-то так ("уголком"):
#...... ##..... #...... #...## ####..#
А по любым двумерным упадет так:
#...... ##..... #...... #.##### #.....#
Хотя если мы предположим, что удара все связи разрушаются, то будет так:
#...... ##..... #...... #.....# #.#####
Какой из этих вариантов лучше? Мне кажется второй/третий, т.к. он "понятен" исходя из логики рогалика. Но выглядит конечно непривычно.
sb3d
> Вот если бы какое-либо совсем простое правило на _форму_ соединений блоков...
> Только чтобы совсем простое, уже сейчас всё запутанно и без поллитра не понять,
> усложнять очень не хочется.
У меня была идея локально считать для каждого блока "нагрузку" и распостранять ее по каким-то законам на соседние, но она не подходит - для любой сложной конструкции получается ерунда.
sb3d
> Крупный минус всей этой "физики" в том, что не важна конфигурация конструкции.
> А важно лишь соотношение стабильных и не стабильных блоков. Даже пусть с
> поправкой на их стабильность и массу. В общем это меня пока печалит, то, что
> форма конструкции роли не играет в прочности.
Я рекомендую сделать набор типичных ситуаций (балка закрепленная на одном конце, на двух концах, столик закрепленный снизу) и подумать, какие должны получаться для них результаты и как можно добиться чтобы они получались. Но имхо вариант с box2d тоже заслуживает как минимум попытки реалиации.
soflot
> Как вариант, возьми box2d, запрети квадратам поворачиваться.
не взлетит для большого мира.
это же миллионы квадратиков - не знаю какой физдвиг сможет это потянуть.
ffinder
> это же миллионы квадратиков - не знаю какой физдвиг сможет это потянуть.
какие миллионы? Не больше нескольких тысяч, кроме того обрабатывать не каждый кадр а в случае события (вообще в рогаликах событийная система программирования рулит и педалит)
Не обязательно выделять тонну памяти на локации, можно делать множкство карт с подкартами, состоящих действительно из миллионов частиц, кубиков.
При генерации создаются файлы карт, при взаимодействии игрока, обсчитывается только какой то раздел, обновляя определенную информацию в определенном файле.
war_zes
> какие миллионы? Не больше нескольких тысяч
Кубиков может быть значительное их количество. Посмотри нулевой пост, там я написал в целях: живой, изменяющийся мир. Могут быть подвижки пластов земли, образование вулканов и провалов. К тому же миллион кубиков это всего лишь 1000*1000 карта, что конечно же очень небольшой участок. Понимаешь сам, я карту планирую заметно более большую.
Ко всем:
Попробую ответить подробно чуть позже, а пока я выложил демонстрацию физики. Игра играет сама, показывает сама, от вас ничего не требуется. Качайте в нулевом посту. Скажите, что вы думаете на счёт этой демонстрации "физики". Косяки? Проблемы? Какие-то моменты непонятны?
Тут лежит ссылка на ргхост.
sb3d
Немного странно что можно во время падения вниз каждый ход менять траектории. Хотя конечно больше шансов выжить.
А так напомнило Террарию в аскии немного.
П.С. А если поковыряться в настройкам то все-таки можно поиграть:3
хы. прикольно выглядит. думал, будет ужаснее (это первая дема из этой темы что я посмотрел).
по поводу упрощенных расчетов нагрузки и обвалов... вот набросал минут за 40 немного говнокода (скомпилить под винду нет возможности):
рассчитывает и показывает нагрузку на каждый блок в зависимости от того с чем граничит (не рассматривается случай цепляния блока к верхнему блоку)
ну а уже от нагрузок - можно плясать дальше.
что выводит на экран:
т.е. на самом деле нужно всего лишь рассматривать несколько случаев:
карниз слева, карниз справа и мост (арка) относительно этого плясать. боксы 2д/3д не нужны.
а насчет огромного мира. физику не нужно считать для блока за километр от игрока (что не исключает метаморфозы мира на этом расстоянии - например под действием извержения вулканов)
AvrDragon
> Немного странно что можно во время падения вниз каждый ход менять траектории.
Можно пытаться менять, но он же её не меняет? =) А так да, ты прав, при падении надо сделать автоматическую смену кадров.
Tamahome
> вот набросал минут за 40 немного говнокода
Ого, спасибо. Буду изучать, подумаю. Пока, по первым тестам, работает он не совсем так, как нужно.
Во первых, рассчёт не однороден, а может и глючит.Смотри, нижняя линия явно перегружена, да ещё и ассиметрично:
Далее, строим мостик на толстой опоре, пусть внизу устойчивая порода, а опора и мост из неустойчивых материалов. Смотри, что даёт рассчёт:
То есть обрушение выходит должно начаться не на мостике, и даже не у основания моста, а у основания опоры.
В любом случае огромное спасибо! Буду думать на счёт вот такого варианта учитывания формы конструкций.
Viaceslav(C)
> Не обязательно выделять тонну памяти на локации, можно делать множкство карт с
> подкартами
Всё таки идея одного большого мира, одной огромной карты выглядит приятнее, согласись. Но таки да, если не хватит быстродействия или памяти, придётся разбивать на подкарты с дверками.
soflot
> Как вариант, возьми box2d
Да, это вариант. Была бы правильная без скидок физика. Но, тут уже заметили принципиальный недостаток: когда у меня по всей карте пойдёт землятресение, сдвиги пластов, образование вулканов и ущелий - то бокс2д будет дико тормозить, ибо будут в самом деле миллионы кубиков.
kipar
> Какой из этих вариантов лучше? Мне кажется второй/третий, т.к. он "понятен"
> исходя из логики рогалика. Но выглядит конечно непривычно.
Сейчас падает третьим вариантом. Мне он показался наиболее логичным, так как есть конструкция не просто падает, но и как-бы разрушается от удара о землю.
Tamahome
> а насчет огромного мира. физику не нужно считать для блока за километр от
> игрока (что не исключает метаморфозы мира на этом расстоянии - например под
> действием извержения вулканов)
А как тогда считать физику за километр, если там события? Считать её по упрощённой схеме плохо, так как у упрощённой схемы может быть другое поведение. Нам же не нужно, чтобы устойчивая вблизи конструкция падала, если отойти от неё?
Тема в архиве.
Тема закрыта.