|
FAQ Туториалы и часто задаваемые вопросы |
04.09.2005, 21:52
|
#1
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Уже многим становятся интересны эти команды, и не зря - они позволяют повысить скорость работы приложения в обработках типов, за счёт ухода от полного перебора ( см http://www.boolean.name/showpost.php...postcount=19 ). Рассмотрим работу с командами ещё раз - подробно.
HANDLE
Когда вы работаете с типом вы используете что-то вроде указателя на данный элемент типа( сомнительный термин, применительно к Блитц):
Type bot
Field entity
End Type
ptr.bot=New bot
ptr\entity=1
В данном случае ptr. Так вот - стандартными способами, так или иначе "превратить" переменную в указатель можно только при создании нового элемента типа, или в цикле полного перебора, или используя позиционные команды для элементов.
Что далеко не всегда удобно, и уж точно не универсально.
Команда HANDLE позволяет получить от указателя, универсальное, характеризующее только один конкретный элемент число.
Как видите - ничего сложного.
OBJECT
Теперь необходимо через хендл элемента типа получить доступ к полям элемента - получить указатель на элемент обратно. Выглядит это так
указатель.имя_типа=Object.имя_типа(хендл_элемента) .
Реализация:
new_ptr.bot=Object.bot(x_ptr)
new_ptr\entity=2
Мы "сделали" из new_ptr указатель, используя ранее полученный хендл x_ptr, и присвоили полю элемента типа значение 2. И всё работает!
С переменной, хранящей хендл элемента, можно работать как с обычным числом. Что очень удобно. Для закрепления рекомендую посмотреть конкретный пример - ссылка выше.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
Эти 10 пользователя(ей) сказали Спасибо impersonalis за это полезное сообщение:
|
|
02.01.2006, 02:34
|
#2
|
|
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 позволяет получить от указателя, универсальное, характеризующее только один конкретный элемент число.
Как видите - ничего сложного.
|
Слово 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
|
|
|
02.01.2006, 02:46
|
#3
|
|
Причем 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
|
|
|
02.01.2006, 03:19
|
#4
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Благодарю за замечания.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
26.06.2008, 02:06
|
#5
|
Разработчик
Регистрация: 09.12.2007
Сообщений: 376
Написано 83 полезных сообщений (для 122 пользователей)
|
Ответ: Object-Handle
А как лучше выйти из ситуации, когда юнит(тип) не имеет постоянного Entity или имеет несколько, что меняется в процессе игры. Можно создать хайднутый пивот и назначить ему имя, но можно ли как-то без дополнительных Entity обойтись? Имя(ID) юнита известно, надо только его найти в списке.
|
(Offline)
|
|
26.06.2008, 03:11
|
#6
|
Гигант индустрии
Регистрация: 14.12.2005
Сообщений: 2,785
Написано 1,183 полезных сообщений (для 4,437 пользователей)
|
Ответ: Object-Handle
хайднутый пивот не нужно, просто пивот на кот. назначь коллизию пикмоде и тд
а вот в имени этого пивота и будет порядковый номер элемента типа
__________________
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
26.06.2008, 20:08
|
#7
|
Разработчик
Регистрация: 09.12.2007
Сообщений: 376
Написано 83 полезных сообщений (для 122 пользователей)
|
Ответ: Object-Handle
А если существует порядка сто-тысяча ботов в игре, при этом в уровне с игроком находится 5%, остальных можно обрабатывать математически, стоит ли создавать столько пивотов? Тогда надо писать отдельно постоянную параллельную обработку для оффлайн юнитов а по именам выбирать только тех кто в уровне?
|
(Offline)
|
|
27.06.2008, 01:59
|
#8
|
Гигант индустрии
Регистрация: 14.12.2005
Сообщений: 2,785
Написано 1,183 полезных сообщений (для 4,437 пользователей)
|
Ответ: Object-Handle
Фигасе у тебя аппетиты.
Тогда заведи 2 типа: для невидимых юнитов и для видимых.
Пивот ТОЛЬКО у видимых.
И перекидывай их из одного типа в другой
__________________
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
29.06.2008, 03:11
|
#9
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: Object-Handle
Blitz3D > FAQ
где модеры?
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
22.11.2008, 17:32
|
#10
|
ПроЭктировщик
Регистрация: 26.06.2007
Сообщений: 194
Написано 21 полезных сообщений (для 25 пользователей)
|
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 такт, а потом обнуляется... Объясните по возможности.
|
(Offline)
|
|
22.11.2008, 17:41
|
#11
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: 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
|
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
22.05.2010, 05:42
|
#12
|
ПроЭктировщик
Регистрация: 26.06.2007
Сообщений: 194
Написано 21 полезных сообщений (для 25 пользователей)
|
Ответ: 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
Последний раз редактировалось Crayzi, 22.05.2010 в 12:33.
|
(Offline)
|
|
22.05.2010, 19:30
|
#13
|
Гигант индустрии
Регистрация: 14.12.2005
Сообщений: 2,785
Написано 1,183 полезных сообщений (для 4,437 пользователей)
|
Ответ: Object-Handle
new_ptr.test=Object.test(3)
If new_ptr<>Null
__________________
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо tormoz за это полезное сообщение:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 22:03.
|