forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Как обратиться к экземпляру структуры по индексу? (http://forum.boolean.name/showthread.php?t=14438)

Drayfer 17.03.2011 22:54

Как обратиться к экземпляру структуры по индексу?
 
Как в нижеприведенном коде обратиться к полям динамически создаваемым экземплярям структуры 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 - не получается, как по другому?

ABTOMAT 17.03.2011 23:24

Ответ: Как обратиться к экземпляру структуры по индексу?
 
Насколько я знаю, это не предусмотрено.
Можешь сделать массив и совать ссылки на объекты класса door туда, потом уже по индексу обращаться.

Вдруг не знал:
Ко всем объектам класса можно обратиться так
Код:

For d.doortype = Each doortype
    EntityColor(d\mesh,255,0,0); например
next


ІГРОГРАЙКО 17.03.2011 23:36

Ответ: Как обратиться к экземпляру структуры по индексу?
 
Да. Только через
Код:

For <indef.type> Each <type>
В Блице иначе никак...:P

Hurrit 18.03.2011 00:38

Ответ: Как обратиться к экземпляру структуры по индексу?
 
Ну, вариант первый это использовать массив, а вариант второй может быть такой:

PHP код:

Function GetEntityHandle%(num)
d.door=first door

for i=1 to num-1
 d
.door=after door
next
return handle(d.door)
end function 

че-то вроде этого, фунцкция должна возвращать хэндл объекта по списку, однако возможно надо подработать, так как писал по памяти.

Venom2 18.03.2011 09:56

Ответ: Как обратиться к экземпляру структуры по индексу?
 
Код:

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)

Alex_Noc 18.03.2011 12:17

Ответ: Как обратиться к экземпляру структуры по индексу?
 
Слушай - ты вообще двери тупо расставить хочешь или что? Они у тя открываться то будут? Открываться чем? Открываться как?(Все поворотные , или половину опускающихся, или половину на ключах или от погоды зависят...) Дистанция или пики? Связывай события !!!
Если дистанс меньше значения то
если нажата кнопка или мышка или зачесалось в ухе тогда
передать хендл обьекта в переменную "текущая дверь"
если статус текущей двери "закрыт" тогда открыть
иначе закрыть.
ну или чтото типа того %)))
Чето последнее время у всех туго с дверьми стало!!! (задачка для 3-текласника!)

maxturbo 18.03.2011 12:34

Ответ: Как обратиться к экземпляру структуры по индексу?
 
Цитата:

Сообщение от Alex_Noc (Сообщение 183160)
Чето последнее время у всех туго с дверьми стало!!! (задачка для 3-текласника!)

Видать игры такие пошли в последнее время что одни двери :)

RegIon 18.03.2011 12:38

Ответ: Как обратиться к экземпляру структуры по индексу?
 
можно порще, пикаем дверь (он возращает хандл),а потом ето хандл используем например в TurnEntity

Alex_Noc 18.03.2011 14:10

Ответ: Как обратиться к экземпляру структуры по индексу?
 
Ага Костян )), это ты мой пост прочитал ), ибо я поэтому и сказал что много чето парок с дверьми - отвечал недавно на подобный вопрос.


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot