forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   FAQ (http://forum.boolean.name/forumdisplay.php?f=15)
-   -   Object-Handle (http://forum.boolean.name/showthread.php?t=23)

impersonalis 04.09.2005 21:52

Уже многим становятся интересны эти команды, и не зря - они позволяют повысить скорость работы приложения в обработках типов, за счёт ухода от полного перебора ( см http://www.boolean.name/showpost.php...postcount=19 ). Рассмотрим работу с командами ещё раз - подробно.

HANDLE
Когда вы работаете с типом вы используете что-то вроде указателя на данный элемент типа( сомнительный термин, применительно к Блитц):
Код:

Type bot
        Field entity
End Type

ptr.bot=New bot
ptr\entity=1

В данном случае ptr. Так вот - стандартными способами, так или иначе "превратить" переменную в указатель можно только при создании нового элемента типа, или в цикле полного перебора, или используя позиционные команды для элементов.
Что далеко не всегда удобно, и уж точно не универсально.
Команда HANDLE позволяет получить от указателя, универсальное, характеризующее только один конкретный элемент число.
Код:

x_ptr=Handle(ptr)
Как видите - ничего сложного.

OBJECT
Теперь необходимо через хендл элемента типа получить доступ к полям элемента - получить указатель на элемент обратно. Выглядит это так
указатель.имя_типа=Object.имя_типа(хендл_элемента) .
Реализация:
Код:

new_ptr.bot=Object.bot(x_ptr)
new_ptr\entity=2

Мы "сделали" из new_ptr указатель, используя ранее полученный хендл x_ptr, и присвоили полю элемента типа значение 2. И всё работает!


С переменной, хранящей хендл элемента, можно работать как с обычным числом. Что очень удобно. Для закрепления рекомендую посмотреть конкретный пример - ссылка выше.

AsmLover 02.01.2006 02:34

Цитата:

Originally posted by impersonalis@Sep 4 2005, 07:52 PM

HANDLE
Когда вы работаете с типом вы используете что-то вроде указателя на данный элемент типа( сомнительный термин, применительно к Блитц):
Код:

Type bot
        Field entity
End Type

ptr.bot=New bot
ptr\entity=1

В данном случае ptr. Так вот - стандартными способами, так или иначе "превратить" переменную в указатель можно только при создании нового элемента типа, или в цикле полного перебора, или используя позиционные команды для элементов.
Что далеко не всегда удобно, и уж точно не универсально.
Команда HANDLE позволяет получить от указателя, универсальное, характеризующее только один конкретный элемент число.
Код:

x_ptr=Handle(ptr)
Как видите - ничего сложного.

Слово ptr (в С - pointer, указатель) выбрано неудачно и может ввести в заблуждение.

Команда Handle не получает "указатель", а присваивает внутренний блитцевский глобальный индекс - номер экземпляра коллекции (сквозной для всех типов), который уже ссылается на двойной связанный список в исходнике Блитца в С++.

Код:

Type a
 Field a,b
End Type

For i=1 To 10
  a.a = New a
  a\a = i
  If i Mod 2
    z  = Handle (a.a)
    a\b = z
  EndIf
Next

For a.a = Each a
  Print a\a + " : " + a\b
Next

WaitKey


AsmLover 02.01.2006 02:46

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

Код:

Type a
 Field a,b
End Type

For i=1 To 10
  a.a = New a
  a\a = i
  If i Mod 2
    z  = Handle (a.a)
    a\b = z*2
  EndIf
Next

For a.a = Each a
  Print a\a + " : " + a\b
Next

Print

b.a = Object.a (5)
Print b\b

WaitKey


impersonalis 02.01.2006 03:19

Благодарю за замечания.

FrankH 26.06.2008 02:06

Ответ: Object-Handle
 
А как лучше выйти из ситуации, когда юнит(тип) не имеет постоянного Entity или имеет несколько, что меняется в процессе игры. Можно создать хайднутый пивот и назначить ему имя, но можно ли как-то без дополнительных Entity обойтись? Имя(ID) юнита известно, надо только его найти в списке.

tormoz 26.06.2008 03:11

Ответ: Object-Handle
 
хайднутый пивот не нужно, просто пивот на кот. назначь коллизию пикмоде и тд
а вот в имени этого пивота и будет порядковый номер элемента типа

FrankH 26.06.2008 20:08

Ответ: Object-Handle
 
А если существует порядка сто-тысяча ботов в игре, при этом в уровне с игроком находится 5%, остальных можно обрабатывать математически, стоит ли создавать столько пивотов? Тогда надо писать отдельно постоянную параллельную обработку для оффлайн юнитов а по именам выбирать только тех кто в уровне?

tormoz 27.06.2008 01:59

Ответ: Object-Handle
 
Фигасе у тебя аппетиты.
Тогда заведи 2 типа: для невидимых юнитов и для видимых.
Пивот ТОЛЬКО у видимых.
И перекидывай их из одного типа в другой

impersonalis 29.06.2008 03:11

Ответ: Object-Handle
 
Blitz3D > FAQ
где модеры?

Crayzi 22.11.2008 17:32

Re: Object-Handle
 
Код:


Type Bot
 Field Entity
End Type

Код:

ptr.bot=New bot
 x_ptr=Handle(ptr)
 If KeyHit (8)
  new_ptr.bot=Object.bot(x_ptr)
  new_ptr\entity=10
 EndIf
 Text 150,225, ptr\entity,True,True

чёт я непойму почему после щелчка значение меняется только на 1 такт, а потом обнуляется... Объясните по возможности.

impersonalis 22.11.2008 17:41

Ответ: Object-Handle
 
это:
Цитата:

ptr.bot=New bot
x_ptr=Handle(ptr)
надо писать вне цикла, содержащего:
Цитата:

ptr.bot=New bot
x_ptr=Handle(ptr)
If KeyHit (8)
new_ptr.bot=Object.bot(x_ptr)
new_ptr\entity=10
EndIf
Text 150,225, ptr\entity,True,True

Crayzi 22.05.2010 05:42

Ответ: Object-Handle
 
Как проверить существует ли объект, без перебора, потому что если попытатся получить доступ к какому либо значению удаленного объекта, то вылетает мемори аксесс волатион.
Код:

Type test
        Field rrr
        Field hendl
End Type

ptr.test=New test
ptr\rrr=1
ptr\hendl=Handle ptr
ptr.test=New test
ptr\rrr=1
ptr\hendl=Handle ptr
ptr.test=New test
ptr\rrr=1
ptr\hendl=Handle ptr
ptr.test=New test
ptr\rrr=1
ptr\hendl=Handle ptr
For p.test = Each test
        If p\hendl=3 Delete p;----Удаляем 3-й объект.
Next
ptr\hendl=Handle ptr
ptr.test=New test
ptr\rrr=1
ptr\hendl=Handle ptr
new_ptr.test=Object.test(3);-----Выбираем объект для действия.
new_ptr\rrr=200;-----------------Меняем значение поля "rrr" и получаем МАВ.

For p.test = Each test
        Print p\rrr
        Print p\hendl
        Print Handle p
Next

WaitKey


----------------------------------------------------------------


П.с. Под утро меня озарило, проверить будет ли МАВ если попробовать узнать хендл несуществующего объекта, МАВ не выдало, а хендл был равен нулю (нумерация в типах начинается с 1-ци, так что все ок).
Вместо:
Код:

new_ptr.test=Object.test(3)
new_ptr\rrr=200

Надо использовать:
Код:

new_ptr.test=Object.test(3)
If Handle new_ptr <>0;---или If (Handle new_ptr), на ваше усмотрение.
        new_ptr\rrr=200
EndIf


tormoz 22.05.2010 19:30

Ответ: Object-Handle
 
new_ptr.test=Object.test(3)
If new_ptr<>Null


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

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