Показать сообщение отдельно
Старый 26.11.2005, 20:38   #69
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ладно начнем...

Во-первых: весь мой уровень построен в виде матрицы пользовательского типа, каждый элемент матрицы содержит тип геометрии (если например куб уничтожен, то на его место ставится "0", для вашего случая можно в матрицу добавить поле для точки привязки, чтобы обрабатывать столкновения);
Type PlaneMatrix
	Field GeomType%, Pivot%
End Type

dim Matrix.PlaneMatrix(Width,Height)
For i = 1 to Width
 * For j = 1 to Height
 * * *Matrix.PlaneMatrix(i,j)= New PlaneMatrix
 * * *'здесь можно присвоить тип геометрии (Matrix(i,j)\GeomType%=GeomType1)
 * * *'тлт создать пивот для обработки столкновений
 * Next
Next
Во-вторых: вся геометрия (квадратная) разделена на вертикальные линии (т.к. кол-во объектов по вертикали меньше чем по горизонтали);

В-третьих: линия геометрии имеет свой тип (или список), в котором хранится mesh (это на всякий случай),для кажной линии создается свой меш, и surface, все объединяется в масиив этого типа (Plane.PlaneLine(N), где N число линий);
Type PlaneLine
	Field Surface%, Mesh%
End Type
Далее есть дополнительный тип, который отвечает за то, какие линии карты будут обрабатываться:
Type PlaneLineUpd
	Field I% 'это номер линии, т.к. поле это матрица, то i - номер столбца
End Type
Добавление лини для обработки осущ. след функцией:
Function UpdateLine(I%)
	For plu.PlaneLineUpd = Each PlaneLineUpd
 *If plu\I=I Then Return
	Next
	plu.PlaneLineUpd=New PlaneLineUpd
 * *plu\I=I
End Function
Потом, в главном цикле перестраиваются линии, которые изменились:
For plu.PlaneLineUpd = Each PlaneLineUpd
	UpdatePlaneLine(plu\I)
	Delete plu
Next
Вот функция перестраивания линии:
Function UpdatePlaneLine(I)
 *Local Z%, K%, Surf% ',Mesh%
 *Local X#=GetX#(I)

 *Surf%=DarkPlane.PlaneLine(I)\Surface%
 *'Mesh%=DarkPlane.PlaneLine(I)\Mesh%
 *ClearSurface(Surf)

 *For K=0 To MatrixHeight
 * *Z=GetZ#(K)
 * *AddBoxToSurface(Surf%,Matrix(I,K)\GeomType%,X,PoleY,Z) 'PoleY
 * *'AddBoxToSurface(Mesh%,Matrix(I,K)\GeomType%,X,PoleY,Z)
 *Next
End Function
Функция добавления бокса к мешу:
Function AddBoxToSurface(Mesh%,GeomType%,X#,Y#,Z#) 
local TempMesh%=0
	Select GeomIndex%
 *Case GTNothing%
 *  return
 *Case GTBlock1%
 *	TempMesh%=CopyEntity%(Block1)
 *Case GTBlock2%
 * * * * * * * * *TempMesh%=CopyEntity%(Block2)
	End Select
 * * *PositionEntity(TempMesh%,X#,Y#,Z#)
 * * *AddMesh TempMesh%,Mesh%
End Function
Функцию добавления бокса к поверхности я приводил раньше (используйте метод, котторй вам больше понтавится),в моём случае добавление происходит повертексно, чтобы не рисовать лишние грани кубов (это заметно при включении каркасного режима), с паралельным наложением UW координат, и установкой нормалей для получения качественной освещенности.

Рекомендации: можете добавлять торько разрушаемые кубы к мешу, а неразрушаемые объединить в один (как сделал Жека).

PS: Я привел сильно упрощенный алгоритм (в нем нет "тумана войны" и повертексного создания геометрии) но думаю для вашей игры это лучше всего (кстати, в моей игре в загружаемых картах неразрушимая геометрия строится этим же способом).

Вот и все
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием