Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D > FAQ

FAQ Туториалы и часто задаваемые вопросы

Ответ
 
Опции темы
Старый 04.09.2005, 21:52   #1
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 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 позволяет получить от указателя, универсальное, характеризующее только один конкретный элемент число.
x_ptr=Handle(ptr)
Как видите - ничего сложного.

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 за это полезное сообщение:
Артем Валерьевич (04.05.2010), Bagration (16.01.2008), baton4ik (28.05.2010), Crayzi (10.10.2008), DStalk (03.08.2010), ELIAS (30.03.2009), Harter (17.06.2010), Mr_F_ (30.10.2008), Nex (23.03.2010), Randomize (29.06.2009)
Старый 02.01.2006, 02:34   #2
AsmLover
 
Сообщений: n/a
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
 
Ответить с цитированием
Старый 02.01.2006, 02:46   #3
AsmLover
 
Сообщений: n/a
Причем 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
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Благодарю за замечания.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Старый 26.06.2008, 02:06   #5
FrankH
Разработчик
 
Регистрация: 09.12.2007
Сообщений: 376
Написано 83 полезных сообщений
(для 122 пользователей)
Ответ: Object-Handle

А как лучше выйти из ситуации, когда юнит(тип) не имеет постоянного Entity или имеет несколько, что меняется в процессе игры. Можно создать хайднутый пивот и назначить ему имя, но можно ли как-то без дополнительных Entity обойтись? Имя(ID) юнита известно, надо только его найти в списке.
(Offline)
 
Ответить с цитированием
Старый 26.06.2008, 03:11   #6
tormoz
Гигант индустрии
 
Аватар для tormoz
 
Регистрация: 14.12.2005
Сообщений: 2,785
Написано 1,183 полезных сообщений
(для 4,437 пользователей)
Ответ: Object-Handle

хайднутый пивот не нужно, просто пивот на кот. назначь коллизию пикмоде и тд
а вот в имени этого пивота и будет порядковый номер элемента типа
__________________
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
FrankH (26.06.2008)
Старый 26.06.2008, 20:08   #7
FrankH
Разработчик
 
Регистрация: 09.12.2007
Сообщений: 376
Написано 83 полезных сообщений
(для 122 пользователей)
Ответ: Object-Handle

А если существует порядка сто-тысяча ботов в игре, при этом в уровне с игроком находится 5%, остальных можно обрабатывать математически, стоит ли создавать столько пивотов? Тогда надо писать отдельно постоянную параллельную обработку для оффлайн юнитов а по именам выбирать только тех кто в уровне?
(Offline)
 
Ответить с цитированием
Старый 27.06.2008, 01:59   #8
tormoz
Гигант индустрии
 
Аватар для tormoz
 
Регистрация: 14.12.2005
Сообщений: 2,785
Написано 1,183 полезных сообщений
(для 4,437 пользователей)
Ответ: Object-Handle

Фигасе у тебя аппетиты.
Тогда заведи 2 типа: для невидимых юнитов и для видимых.
Пивот ТОЛЬКО у видимых.
И перекидывай их из одного типа в другой
__________________
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
FrankH (27.06.2008)
Старый 29.06.2008, 03:11   #9
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Ответ: Object-Handle

Blitz3D > FAQ
где модеры?
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Старый 22.11.2008, 17:32   #10
Crayzi
ПроЭктировщик
 
Регистрация: 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
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 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)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Crayzi (22.11.2008)
Старый 22.05.2010, 05:42   #12
Crayzi
ПроЭктировщик
 
Регистрация: 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
tormoz
Гигант индустрии
 
Аватар для tormoz
 
Регистрация: 14.12.2005
Сообщений: 2,785
Написано 1,183 полезных сообщений
(для 4,437 пользователей)
Ответ: Object-Handle

new_ptr.test=Object.test(3)
If new_ptr<>Null
__________________
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо tormoz за это полезное сообщение:
Colossus (06.10.2013), Crayzi (23.05.2010)
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
3D Object Converter v3.80 SAF Болтовня 23 05.03.2008 14:12
Посчет handle HolyDel Blitz3D 0 29.03.2007 03:49


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com