Ладно начнем...
Во-первых: весь мой уровень построен в виде матрицы пользовательского типа, каждый элемент матрицы содержит тип геометрии (если например куб уничтожен, то на его место ставится "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: Я привел сильно упрощенный алгоритм (в нем нет "тумана войны" и повертексного создания геометрии) но думаю для вашей игры это лучше всего (кстати, в моей игре в загружаемых картах неразрушимая геометрия строится этим же способом).
Вот и все