с учетом наложения на неровную поверхность ландшафта, все начинает выглядеть крайне коряво - трава висит в воздухе / тонет под землей и отчетливо видна "травяная плоскость".
|
Можно забить в массив - карту травы данные о конфигурации пейзажа в точке, и размещать там типовые травяные полянки: густые, редкие, изогнутые под горы и впадины и т.п. Для того, чтоб трава не очень "висела", можно сделать кусты более вытянутыми по вертикали, так, чтоб в нормальном состоянии трава была частично погружена в землю.
Однако идея динамического размещения травы всё же вызывавет у меня заряд скепсиса. Более высокую производитльность она покажет только на картах, где общее количество травы крайне велико и несоизмеримо превосходит видимую травяную плоскость. Представить себе производительную реализацию такой огромной карты и всех прочих ёё элементов на Блице я не решаюсь.
1) При большом размере квадратов возникает эффект "травяных пашен" ... Думаю, можно поэкспериментировать с изменением формы и частичным взаимным перекрыванием участков, добившись лучшего результата.
|
Согласен. Взаимное перекрытие- это разумная идея. В теории несложно представить себе взаимно смещенные на полгабарита кластеры-пашни, у которых кусты не пересекаются, потому что растут, к примеру, соответственно по "чётным и нечетным координатам". На производительность никак не повлияет.
2) Какой оптимальный размер для квадратов?
|
ИМХО- максимально большой из красивых.))
3) Каким установить время проявления новых участков? Небольшим - трава будет резко появляться, малым - кол-во видимых участков увеличится, что отрицательно скажется на FPS.
|
ИМХО- при скорости фейдинга, заведомо большей, чем скорость перехода игрока с кластера на кластер, т.е. в ситуации, максимально приближенной к практике- это не принципиально.
4) Как быть с прозрачностью?
|
Альфаканал фтопку.
В плане кода.
0. Думаю, "
Flip 0" будет несколько полезней для подсчёта ФПС.
1.[blitz]DX# = S\X - PlayerX# / GrassGridCellSize#
DZ# = S\Z - PlayerZ# / GrassGridCellSize#
Distance# = Sqr(DX# * DX# + DZ# * DZ#)[/blitz]
Эмпирика показывает, что следует избегать столь тяжелых математических конструкций. Так, EntityDistance будет выполняться на порядок быстрее.
2. Мне не вполне понятна этимология генезиса институции типа ActiveSquare в ситуации с предварительно загенереной картой растительности. Работа напрямую с массивом кластеров травы будет проходить несколько быстрее, кроме того, код станет явно проще.
Примитивно говоря, можно так, как приведено ниже. Нужен доп. массив- карта видимости кластеров, и скорость фейдинга травы по понятным причинам должна быть достаточно велика ( я увеличивал до 0.5).
MapX=PlayerX/GrassGridCellSize#
MapZ=PlayerZ/GrassGridCellSize#
AnalyzedDis=GrassRadius+FadingTimeInSeconds#*PlayerSpeedPerSecond#+2
For x=MapX-AnalyzedDis To MapX+AnalyzedDis
For z=MapZ-AnalyzedDis To MapZ+AnalyzedDis
If x>=0 And x<GrassGridSize And z>=0 And z<GrassGridSize Then
;!---такой метод определения дистанции до точки- непроизводителен
;!---и уступает ЁнтитиДистансу в несколько раз
If Abs(x-MapX)<GrassRadius And Abs(z-MapZ)<GrassRadius Then
If BushMapVisible#(x,z)<1 Then
If BushMapVisible#(x,z)=0 Then ShowEntity BushMap(x,z)
BushMapVisible#(x,z)=BushMapVisible#(x,z)+PrevFrameRenderingTimeInSeconds# / FadingTimeInSeconds#
EntityAlpha BushMap(x,z),BushMapVisible#(x,z)
EndIf
Else
If BushMapVisible#(x,z)>0 Then
BushMapVisible#(x,z)=BushMapVisible#(x,z)-PrevFrameRenderingTimeInSeconds# / FadingTimeInSeconds#
EntityAlpha BushMap(x,z),BushMapVisible#(x,z)
If BushMapVisible#(x,z)<=0 Then HideEntity BushMap(x,z)
EndIf
EndIf
EndIf
Next
Next
P.S. Сори, при вставке кода почему-то гибнут отступы табуляции.
__________
Добавлено:
Изменил теги, пропатчил код.