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=17810)

tirarex 29.01.2013 23:56

Ответ: Искуственный интеллект
 
Конкретного ответа нет :(
пойду гуглить дальше

burovalex 30.01.2013 07:33

Ответ: Искуственный интеллект
 
Цитата:

Сообщение от burovalex (Сообщение 251079)
Ну даже, чтобы пользоваться Астаром, надо научиться пользоваться подтипами.
Код:

Type npc
 Field entity
 Field target
 Field wp.waypoints
 End Type

 Type waypoints
 Field x#,y#,z#
 End Type

 Function CreateNPC()
 npc.npc=New npc
 End Function

 Function NewTarget()
For npc.npc.wp=Each npc.waipoints
;а здесь чтото не правильно, я хотел пройтись по типу waypoints в типе npc
 Next
 End Function

С чем у меня пока проблемы, вкурить не могу..

Блин, ну подскажите как пройтись по типу waipoints в типе npc

burovalex 30.01.2013 11:04

Ответ: Искуственный интеллект
 
Чет я не понял, с трудом разобрался, так что получается.
Если в типе добавить еще один тип - то у них всё равно связи не будет?? 0_о

Получается в любом случае придётся проходить по всему списку и делать выборку?

Platon 30.01.2013 12:07

Ответ: Искуственный интеллект
 
Цитата:

Сообщение от burovalex (Сообщение 251162)
Чет я не понял, с трудом разобрался, так что получается.
Если в типе добавить еще один тип - то у них всё равно связи не будет?? 0_о

Получается в любом случае придётся проходить по всему списку и делать выборку?

Может ты все-таки в справку заглянешь? В блиц-бейсике для структурных типов Type создается один глобальный список, поэтому обьявляя там поле с таким типом, ты будешь иметь лишь указатель (ссылка) на экземпляр, а все создаваемые оператором New экземпляры будут автоматически помещаться в этот глобальный список. Поэтому надо делать свой список, т.е. в твоем случае тип Waypoints должен иметь ссылку на следующий в списке, а тип npc иметь ссылку на начало списка. Гугли односвязный и\или двусвязный список чтобы понять как его строить. По сути список - та же очередь в действительности, где каждый элемент помнит того кто впереди него ( за кем занял ), и того кто позади ( кто за ним занял ). К слову в BlitzMax, который уже ближе к "взрослым" ЯП, есть такой механизм. По-моему тебе стоит бросить блиц-бейсик и юзать блиц-макс, к тому-же, раз ты юзаешь Xors3D, юзать его из BlitzMax будет правильно, все-таки блиц-бейсик намертво связан с блиц3д, и юзать один движок из другого - извращение, имхо.

ЗЫ
вот примерно как можно очередь сделать

Код:


; элемент очереди
Type Element
       
        ; сзади по очереди
        Field BackElement.Element
       
        ; впереди по очереди
        Field FrontElement.Element
       
End Type

; очередь
Type Queue
       
        ; первый в очереди
        Field FirstElement.Element
       
        ; последний в очереди
        Field LastElement.Element
       
End Type

;
; функция входа в очередь
;
Function EnterQueue ( Queue.Queue, Element.Element )
       
        ;
        ; спрашиваешь кто последний
        ;
        If Queue\LastElement <> Null Then
               
                ;
                ; последний запоминает что ты за ним занял
                ;
                Queue\LastElement\BackElement = Element
               
                ;
                ; раз ты последний, за тобой никого нет
                ;
                Element\BackElement = Null
               
                ;
                ; запоминаешь того, кто перед тобой
                ;
                Element\FrontElement = Queue\LastElement
               
        ;
        ; последнего нет - нет и очереди
        ;
        Else
               
                ;
                ; раз очереди нет, ты первый в очереди
                ;
                Queue\FirstElement = Element
               
        End If       
       
        ;
        ; занял очередь, теперь ты последний в очереди
        ;
        Queue\LastElement = Element
       
End Function

;
; функция выхода из очереди
;
Function LeaveQueue ( Queue.Queue, Element.Element )
       
        ;
        ; сзади тебя кто-то есть, ты не последний в очереди
        ;
        If Element\BackElement <> Null Then
               
                ;
                ; сообщаешь тому, кто занимал за тобой, что он теперь стоит
                ; за тем, кто впереди нас
                ;
                Element\BackElement\FrontElement = Element\FrontElement
               
        ;       
        ; сзади тебя никого нет, ты последний в очереди
        ;
        Else
               
                ;
                ; сообщаешь тому, кто впереди нас, что он становится последним
                ; в очереди
                ;
                Queue\LastElement = Element\FrontElement
               
        End If
       
        ;
        ; впереди тебя кто-то есть, ты не первый в очереди
        ;
        If Element\FrontElement <> Null Then
               
                ;
                ; сообщаешь тому, за кем ты занимал,
                ; что за ним теперь не ты, а тот, кто занимал за тобой
                ;
                Element\FrontElement\BackElement = Element\BackElement
       
        ;       
        ; впереди тебя никого нет, ты первый в очереди
        ;
        Else
               
                ;
                ; сообщаешь тому, кто сзади тебя, что он теперь первый в очереди
                ;
                Queue\FirstElement = Element\BackElement
               
        End If
       
End Function


burovalex 30.01.2013 16:24

Ответ: Искуственный интеллект
 
щас, я сначала пиками поизвращаюсь )), не попрёт - буду юзать связанные списки. Всё равно спасибо, взял на заметку )

А блитц я не брошу пока не закончу с проектом. Переделывать муторно, т.к. моя версия пока стабильна, не буду пока ее трогать.

З.Ы. Как говорит мой батя, "НЕ ТРОГАЙ НАЛАЖЕННО РАБОТАЮЩИЙ МЕХАНИЗМ" - блин, правда правд )


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

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