Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D > 3D-программирование

3D-программирование Вопросы, касающиеся программирования 3D мира

Ответ
 
Опции темы
Старый 08.10.2011, 20:02   #16
Halk-DS
Разработчик
 
Аватар для Halk-DS
 
Регистрация: 09.08.2006
Адрес: Украина
Сообщений: 431
Написано 65 полезных сообщений
(для 53 пользователей)
Ответ: Создание больших массивов.

Самим ярким для моего моска выдался этот вариант:
Сообщение от RBK Посмотреть сообщение
Можно и в типах, например:
Type material

field mesh ;сетка загружаемого мира, работать лучше с поверхностями.
field surface ;собственно поверхность
field p1, p2, p3, p4 ;вершины квада поверхности

field brush ;кисть которой закрасим поверхность

;другие переменные 
End Type

Type node

field x,y,z ;координаты узла

field FrontNode.node ;соседние узлы
field BackNode.node
field LeftNode.node
field RightNode.node
field TopNode.node
field BottomNode.node

field FrontMaterial.material ;поверхности этого узла
field BackMaterial.material
field LeftMaterial.material
field RightMaterial.material
field TopMaterial.material
field BottomMaterial.material

;другие переменные
End Type
Поэтому хотел спросить конкретнее, 1 кубик (node) имеет в себе 6 сторон(6 елементов из типа material). А судя из этого:
field mesh ;сетка загружаемого мира, работать лучше с поверхностями.
На каждую сторону кубика будет приходить по 1-му мешу. Стоит ли создавать так много мешей? Или лучше создать:
Global World=CreateMesh()
И все созданные сурфейсы в типе material просто обьеденить в 1 созданный меш World?

Но после этого встает еще один вопрос. Если я зделаю:
ClearSurface(N\Surface)
Delete N
Останутся ли в памяти компьютера какието переменные?
Тоесть я просто неувидел никакой команды вроде:
FreeSurface(Surface) или DeleteSurface(Surface). А нужны ли они вообще? Или их вполне заменяет ClearSurface
(Offline)
 
Ответить с цитированием
Старый 08.10.2011, 22:53   #17
RBK
Знающий
 
Аватар для RBK
 
Регистрация: 06.12.2010
Адрес: Луганск
Сообщений: 252
Написано 112 полезных сообщений
(для 166 пользователей)
Ответ: Создание больших массивов.

На каждую сторону кубика будет приходить по 1-му мешу. Стоит ли создавать так много мешей?
Нет mesh в типе material один и тот-же, для каждой стороны создаём сурфейс.
Но после этого встает еще один вопрос. Если я зделаю:

ClearSurface(N\Surface)
Delete N
Удалять ненужные сурфейсы не надо, крась их кистью(чтобы скрыть), и кидай в список свободных, потом из него возьмёшь как понадобится.
__________________
AMD Sempron(tm) 1.41Ггц, 1024МБ ОЗУ, GeForce 6200 128МБ, WinXP SP3.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Hulk-DS (09.10.2011)
Старый 09.10.2011, 03:38   #18
LLI.T.A.L.K.E.R.
Мастер
 
Аватар для LLI.T.A.L.K.E.R.
 
Регистрация: 24.06.2009
Адрес: Набережные Челны
Сообщений: 930
Написано 292 полезных сообщений
(для 504 пользователей)
Ответ: Создание больших массивов.

А так вроде Меш по новой составлять нужно будет.
FreeSurface не предусмотрели
(Offline)
 
Ответить с цитированием
Старый 13.10.2011, 00:16   #19
Halk-DS
Разработчик
 
Аватар для Halk-DS
 
Регистрация: 09.08.2006
Адрес: Украина
Сообщений: 431
Написано 65 полезных сообщений
(для 53 пользователей)
Ответ: Создание больших массивов.

Опять немного застрял. Я типы понимал хорошо но вот с типами внутри типов немного туговато. А без нужного знания, как я понимаю совершить такое:
Сообщение от 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.
(Offline)
 
Ответить с цитированием
Старый 13.10.2011, 00:50   #20
Markova
ПроЭктировщик
 
Аватар для Markova
 
Регистрация: 11.10.2011
Адрес: Мурманск
Сообщений: 154
Написано 74 полезных сообщений
(для 218 пользователей)
Ответ: Создание больших массивов.

без For Each не как, это же типы, можно исхитрится, через память…
Function PokeString(bank,offset,s$)
PokeInt bank,offset,Len(s$)
For i = 1 To Len(s$)
PokeByte(bank,offset+i+3, Asc(Mid$(s$,i,1)))
Next
End Function

Function PeekString$(bank,offset)
l = PeekInt(bank,offset)
s$ = ""
For i = 1 To l
s$ = s$ + Chr$(PeekByte(bank,offset+i+3))
Next
Return s$
End Function
но опять же For Each а выглядит всё жутковато, не ужели это
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)
будет шесть раз, а если бы надо было сделать триста сторон у тристостороника, а для чего тогда тип создавать?
(Offline)
 
Ответить с цитированием
Старый 13.10.2011, 00:51   #21
IGR
Blitz's Shame !!
 
Регистрация: 31.03.2007
Сообщений: 3,639
Написано 832 полезных сообщений
(для 2,013 пользователей)
Ответ: Создание больших массивов.

пиши не
If L -Если переменная L имеет значение True - создаем сторону:
B.Side=New Side
...

а сразу
N\LS=New Side
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Hulk-DS (13.10.2011)
Старый 13.10.2011, 01:10   #22
Halk-DS
Разработчик
 
Аватар для Halk-DS
 
Регистрация: 09.08.2006
Адрес: Украина
Сообщений: 431
Написано 65 полезных сообщений
(для 53 пользователей)
Ответ: Создание больших массивов.

Сообщение от Markova Посмотреть сообщение
без For Each не как, это же типы, можно исхитрится, через память…
Может я в статье неправильно понял, но помойму мне как то должны помочь команды Object() и Handle() для того чтоб не перебирать уйму типов, а обратится конкретно к нужному мне, который я записал. Статья

Сообщение от Markova Посмотреть сообщение
не ужели это будет шесть раз, а если бы надо было сделать триста сторон у тристостороника, а для чего тогда тип создавать?
Я б тогда запустил цикл на For J=1 to N где N-кол-во углов, а это:
B\Surf=CreateSurface(World)
B\V[J]=AddVertex(B\Surf,X-1,Y,Z)
AddTriangle(B\Surf,B\V[J-2],B\V[J-1],B\V[J])
запихнул б в отдельную функцию. (типа код корявый но думаю мысль понятна)

Сообщение от IGR Посмотреть сообщение
пиши не
If L -Если переменная L имеет значение True - создаем сторону:
B.Side=New Side
...

а сразу
N\LS=New Side
Спасибо. Прямо в яблочко. Задавать понял как. А как теперь к ним обращаться без For Each?
п.с. А если тип уже создан, как его добавить? Оо
(Offline)
 
Ответить с цитированием
Старый 13.10.2011, 01:16   #23
RBK
Знающий
 
Аватар для RBK
 
Регистрация: 06.12.2010
Адрес: Луганск
Сообщений: 252
Написано 112 полезных сообщений
(для 166 пользователей)
Ответ: Создание больших массивов.

Зайди в ICQ
__________________
AMD Sempron(tm) 1.41Ггц, 1024МБ ОЗУ, GeForce 6200 128МБ, WinXP SP3.
(Offline)
 
Ответить с цитированием
Старый 13.10.2011, 01:51   #24
IGR
Blitz's Shame !!
 
Регистрация: 31.03.2007
Сообщений: 3,639
Написано 832 полезных сообщений
(для 2,013 пользователей)
Ответ: Создание больших массивов.

ну так же и обращятся !! у тебя уже сохранен указател на сайд !! форич тут ненужен !!
N\LS\field_твоего_типа_сайд = значение
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо IGR за это полезное сообщение:
Hulk-DS (13.10.2011), RBK (13.10.2011)
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 05:40.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com