|
3D-программирование Вопросы, касающиеся программирования 3D мира |
17.03.2011, 22:54
|
#1
|
Нуждающийся
Регистрация: 14.02.2011
Адрес: Украина, Луганск
Сообщений: 67
Написано 0 полезных сообщений (для 0 пользователей)
|
Как обратиться к экземпляру структуры по индексу?
Как в нижеприведенном коде обратиться к полям динамически создаваемым экземплярям структуры door.doortype по индексу?
map=LoadAnimMesh("pri.b3d")
Type doortype
Field mesh
Field state
End Type
For i=2 To CountChildren(map)
child=GetChild(map,i)
name$=EntityName(child)
If Left$(name$,4)="dver" ; проверка имени объекта данного в максе
door.doortype=New doortype
door\mesh=child
door\state=1
EndIf
Next
Этот пример считывает чайлды - т.е. двери с карты уровня. Вот например допустим я хочу обратиться к полю door\state третьей двери. Как это сделать?
door(3)\state - не получается, как по другому?
|
(Offline)
|
|
17.03.2011, 23:24
|
#2
|
Ференька
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,742
Написано 5,461 полезных сообщений (для 15,675 пользователей)
|
Ответ: Как обратиться к экземпляру структуры по индексу?
Насколько я знаю, это не предусмотрено.
Можешь сделать массив и совать ссылки на объекты класса door туда, потом уже по индексу обращаться.
Вдруг не знал:
Ко всем объектам класса можно обратиться так
For d.doortype = Each doortype
EntityColor(d\mesh,255,0,0); например
next
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**
* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена
|
(Offline)
|
|
17.03.2011, 23:36
|
#3
|
ПроЭктировщик
Регистрация: 20.06.2009
Адрес: Україна
Сообщений: 152
Написано 10 полезных сообщений (для 24 пользователей)
|
Ответ: Как обратиться к экземпляру структуры по индексу?
Да. Только через
For <indef.type> Each <type>
В Блице иначе никак...
__________________
Blitz3D, XNA, WebGL, OpenGL, Unity3D
PC: ASUS A55VM Core i3 (2.4Ghz), 6 Gb RAM, Nvidia GF 630M GT 2Gb
|
(Offline)
|
|
18.03.2011, 00:38
|
#4
|
Мастер
Регистрация: 27.01.2008
Адрес: Россия, СКФО, ЧР, Грозный
Сообщений: 1,144
Написано 578 полезных сообщений (для 2,207 пользователей)
|
Ответ: Как обратиться к экземпляру структуры по индексу?
Ну, вариант первый это использовать массив, а вариант второй может быть такой:
Function GetEntityHandle%(num) d.door=first door
for i=1 to num-1 d.door=after door next return handle(d.door) end function
че-то вроде этого, фунцкция должна возвращать хэндл объекта по списку, однако возможно надо подработать, так как писал по памяти.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
18.03.2011, 09:56
|
#5
|
|
Ответ: Как обратиться к экземпляру структуры по индексу?
Type Door
Field ID%
End Type
Local Door.Door, i%
For i = 1 To 10
Door = New Door
; Функция Handle формирует индексную карту
; записывая туда указатель на объект под его порядковым номером
; возвращает соответственно порядковый номер
Door\ID = Handle(Door)
Next
; Достаем из карты объект по индексу - порядковому номеру (1...N)
Door = Object.Door(3)
; Обязательно проверяем на нуль
; т.к. после удаления обьекта слот карты остается
; и под тем же индексом уже будет нуль
If Door <> Null Then Print(Str(Door\ID)) Else Print("Слот пустой!")
; Ну и еще один трюк, удаление всех объектов встроеным циклом
Delete Each Door
WaitKey()
End
И пример подобной карты на блице
Type Door
; обязательные поля для размещения в индексной карте
Field Link.Door, Index%
; тут какие-то свои поля
End Type
;
; Кол-во слотов в индексной карте
;
Const MapSize% = 1024
;
; Создает дверь с индексом Index и размещает в карте Map
;
Function NewDoor.Door(Map.Door[MapSize], Index%)
Local Door.Door
Door = New Door
Door\Index = Index
Index = Index Mod MapSize
Door\Link = Map[Index]
Map[Index] = Door
Return Door
End Function
;
; Удаляет дверь по индексу Index из карты Map
;
Function DeleteDoor(Map.Door[MapSize], Index%)
Local Temp.Door, Door.Door
Temp = Null
Door = Map[Index Mod MapSize]
While Door <> Null
If Door\Index = Index Then
If Temp <> Null Then
Temp\Link = Door\Link
Else
Map[Index Mod MapSize] = Door\Link
End If
Delete Door
Exit
End If
Temp = Door
Door = Door\Link
Wend
End Function
;
; Возвращает дверь по индексу Index из карты Map
;
Function GetDoor.Door(Map.Door[MapSize], Index%)
Local Door.Door
Door = Map[Index Mod MapSize]
While Door <> Null
If Door\Index = Index Then Return Door
Door = Door\Link
Wend
Return Null
End Function
;
; Пример
;
Local DoorMap.Door[MapSize]
Local Door.Door, i%
For i = 1 To 10
Door = NewDoor(DoorMap, i)
Next
Door = GetDoor(DoorMap, 3)
If Door <> Null Then Print(Str(Door\Index)) Else Print("Слот пустой!")
DeleteDoor(DoorMap, 3)
Door = GetDoor(DoorMap, 3)
If Door <> Null Then Print(Str(Door\Index)) Else Print("Слот пустой!")
WaitKey()
End
Т.е. получается массив однонаправленных списков, список растет в случае добавления обьекта в уже занятый слот, зависит от размера массива и функции распределения указателей (в данном элементарном случае это Mod)
|
|
|
18.03.2011, 12:17
|
#6
|
Разработчик
Регистрация: 02.04.2007
Сообщений: 353
Написано 54 полезных сообщений (для 289 пользователей)
|
Ответ: Как обратиться к экземпляру структуры по индексу?
Слушай - ты вообще двери тупо расставить хочешь или что? Они у тя открываться то будут? Открываться чем? Открываться как?(Все поворотные , или половину опускающихся, или половину на ключах или от погоды зависят...) Дистанция или пики? Связывай события !!!
Если дистанс меньше значения то
если нажата кнопка или мышка или зачесалось в ухе тогда
передать хендл обьекта в переменную "текущая дверь"
если статус текущей двери "закрыт" тогда открыть
иначе закрыть.
ну или чтото типа того %)))
Чето последнее время у всех туго с дверьми стало!!! (задачка для 3-текласника!)
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
18.03.2011, 12:34
|
#7
|
Разработчик
Регистрация: 19.05.2009
Адрес: Россия Иркутская область
Сообщений: 350
Написано 51 полезных сообщений (для 66 пользователей)
|
Ответ: Как обратиться к экземпляру структуры по индексу?
Сообщение от Alex_Noc
Чето последнее время у всех туго с дверьми стало!!! (задачка для 3-текласника!)
|
Видать игры такие пошли в последнее время что одни двери
__________________
|
(Offline)
|
|
18.03.2011, 12:38
|
#8
|
Элита
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,158
Написано 502 полезных сообщений (для 1,012 пользователей)
|
Ответ: Как обратиться к экземпляру структуры по индексу?
можно порще, пикаем дверь (он возращает хандл),а потом ето хандл используем например в TurnEntity
|
(Offline)
|
|
18.03.2011, 14:10
|
#9
|
Разработчик
Регистрация: 02.04.2007
Сообщений: 353
Написано 54 полезных сообщений (для 289 пользователей)
|
Ответ: Как обратиться к экземпляру структуры по индексу?
Ага Костян )), это ты мой пост прочитал ), ибо я поэтому и сказал что много чето парок с дверьми - отвечал недавно на подобный вопрос.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 09:07.
|