Опять немного застрял. Я типы понимал хорошо но вот с типами внутри типов немного туговато. А без нужного знания, как я понимаю совершить такое:
Сообщение от RBK
Удалять ненужные сурфейсы не надо, крась их кистью(чтобы скрыть), и кидай в список свободных, потом из него возьмёшь как понадобится.
|
Невозможно. Кроме того, скорей всего я буду удалять их, потому что по моим расчетам их будет слишком много чтоб хранить все, даже в списке для свободных.
Ну а в целом, я прочитал статейку в Blitz et Cetera по Связанных списках раз пять. Но без вашей помощи не разберусь.
Как я говорил выбрал метод с типами. И реализовал все примерно так:

Global World=CreateMesh() -Главный меш поверхности.
Dim W(512,512,128) -Массив в котором лежат цифры от 0. Какие обозначают ИД
предмета. Ну типа 0-пустота. 1-земля. 2-камень и т.п. Он скорей всего будет
составляется из рисунка(хейтмапы), ибо алгоритм генерирования поверхности
немного сложноват для меня в данный момент. Возможно я этот масив как нибудь
плавно уберу, но пока что без него не обойдусь.
Type Side
Field Surf
Field V1,V2,V3,V4
Field Brush
End Type
Это тип Side в котором хранятся все видимые стороны с какими может
взаимодействовать персонаж. А невидимых нет в памяти. Они будут создаваться по
ходу игры. Например персонаж на равнине выкопал 1 ямку и в место 1-й видимой
поверхности стало видимо 5 которые ее соседями и тут же создались.
А это тип node в котором хранятся кубы земли(или другого материала), а точнее
здесь и обьеденены 6 сторон куба(элементы списка Side). и соседи этого
куба(элементы списка node).
Type node
Field X,Y,Z - Координаты куска земли и соотвецтвенно индекс массива W(x,y,z)
Соседи куба(элементы списка node):
Field FN.Node
Field BN.node
Field LN.node
Field RN.node
Field UN.node
Field DN.node
Стороны куба(элементы списка Side):
Field FS.Side
Field BS.Side
Field LS.Side
Field RS.Side
Field US.Side
Field DS.Side
End Type
Ну и есть функция CreateWorld(Path$), которая по нужной хейтмапе забивает наш массив W(x,y,z) - нужными значениями о которых я говорил выше когда описывал массив.
В конце этой функции вызывается еще одна CoverWorld(), которая и покрывает наш мир вертексами и треугольниками.
Теперь мы подошли к моей проблеме впритык и долгих, возможно ненужных описаний давать больше не буду:

Функция создания нода(куба):
Function CreateNode(X,Y,Z,L,R,B,F,D,U)
Где:
X,Y,Z-Координаты куба.
L,R,B,F,D,U- Переменные которые говорят видима ли для игрока сторона куба
или нет. Название переменной это первая буква слова: L-Left R-Right и так далее...
N.Node=New Node
N\X=X
N\Y=Y
N\Z=Z
If L -Если переменная L имеет значение True - создаем сторону:
B.Side=New Side
B\Surf=CreateSurface(World)
B\V1=AddVertex(B\Surf,X-1,Y,Z)
B\V2=AddVertex(B\Surf,X-1,Y-1,Z)
B\V3=AddVertex(B\Surf,X-1,Y-1,Z-1)
B\V4=AddVertex(B\Surf,X-1,Y,Z-1)
AddTriangle(B\Surf,B\V1,B\V2,B\V3)
AddTriangle(B\Surf,B\V3,B\V4,B\V1)
EndIf
If R Теперь это правая сторона куба
...
и так далее...
If B
...
If F
...
If D
...
If U
...
...
End Function
Вопрос: Как мне в типе Node записать значения LS.Side, RS.Side, FS.Side и т.д. нужными мне елементами из типа Side. И как к ним быстро обращатся без For Each.