Поиск незакрытых плиток в игре на основе плиток

9

Я работаю над 2D-игрой на основе плиток, и сейчас я пытаюсь заставить работать двумерный эквивалент теневых объемов. У меня проблемы с поиском поверхностей, которые должны отбрасывать тени. Из любой точки игры мне нужно найти либо незакрытые лица, либо всю плитку.

У меня вопрос, как я могу найти эти плитки / края как можно быстрее, учитывая точку?

Изображение, показывающее общую линию видимости и затронутые плитки

Райан С
источник

Ответы:

2

Это не полный ответ, но, надеюсь, это поможет.

Ваша карта / плитка установлена ​​статически или динамически? Если он статичен, я настоятельно рекомендую вам выполнять автономную обработку и предварительно вычислять столько, сколько вы можете таким образом. Вы можете делать это любым способом (радиовещание или что-то более умное), но на самом деле вам не нужно делать очень быстро, потому что все это произойдет в автономном режиме, пока вы «запекаете» свои уровни. Вы можете либо заранее вычислить, какие плитки видны из каждой точки, либо создать какие-то более крупные регионы и все плитки, потенциально видимые из каждой области.

Затем во время выполнения запрос для видимых плиток должен быть очень простым и очень быстрым.

Конечно, если у вас есть динамически созданные уровни, то это не относится вообще :-)

Ноэль Ллопис
источник
1

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

необычайно щедрый
источник
0

Я не уверен, на какой платформе вы работаете, но я не могу придумать ни одной платформы, которая была бы недостаточно быстрой, чтобы просто обвести круг вокруг ваших объектов Lightcasting (если их не много) и определить, плитка, которая должна быть «построена» в вашем круговом алгоритме, является сплошной плиткой и, таким образом, блокирует свет. С этого момента это будет немного сложнее, так как вам придется отслеживать сегменты круга, которые закрыты или нет, но это будет то, что я буду делать. Другим вариантом было бы навести лучи по кругу (снова довольно быстро) в пространстве разрешения плитки и остановить каждый луч, когда он попадает на сплошную плитку.

Кая
источник
Ну, я в основном играю во Flash и Javascript, но в настоящее время я использую метод грубой силы, который через некоторое время начинает тормозить. Я думаю, что если я смогу выяснить, как это оптимизировать, я смогу запустить эту игру довольно гладко.
Райан С
Это должно быть легко выполнимо во вспышке, возможно, ваша грубая сила может быть оптимизирована. Кроме того, как правило, вам не нужно обновлять его каждый кадр, чтобы можно было пересчитать следующую ситуацию за пару кадров
Kaj