Показать сообщение отдельно
Старый 10.06.2007, 15:01   #4
Diplomat
Дэвелопер
 
Регистрация: 07.09.2005
Сообщений: 1,519
Написано 66 полезных сообщений
(для 164 пользователей)
Re: Реализовал много травы

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

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. Сори, при вставке кода почему-то гибнут отступы табуляции.


__________
Добавлено:

Изменил теги, пропатчил код.
(Offline)
 
Ответить с цитированием