Уход от полного перебора
Как и обещал, расскажу, как улучшить цикл обработки выстрелов.
В Блитце есть недокументированные команды Handle и Object. Благодаря команде Handle можно получить
"указатель" на объект типа (использование термина "указатель" весьма спорно для Блитца). Например:
P.Player=New Player
pHANDLE=Handle(P)
а затем, используя сохранённое значение (здесь в переменной pHANDLE) получить доступ к элементу типа:
P.PLAYER=Object.PLAYER(pHANDLE)
*******
Модифицируем функцию create_bot
Function create_bot(x#,y#,z#)
b.bot=New bot
b\entity=CreateSphere()
EntityType b\entity,BOTT
PositionEntity b\entity,x#,y#,z#
NameEntity b\entity,Handle(b)
Return True
End Function
Командой NameEntity присвоим объекту B\entity имя - в данном случае, совпадающее с хендлом элемента типа,
содержащего данный объект.
Теперь модифим кусок функции update_shot()
Function update_shot()
vs#=1
max_dist#=1000
For a.shot=Each shot
MoveEntity a\entity,0,0,vs#
a\dist#=a\dist#+vs#
bot_h=EntityCollided(a\entity,BOTT)
If a\dist#>max_dist#
FreeEntity a\entity
Delete a
ElseIf EntityCollided(a\entity,TERRT)<>0
FreeEntity a\entity
Delete a
ElseIf bot_h<>0
FreeEntity a\entity
Delete a
bhandle=EntityName(bot_h)
bc.bot=Object.bot(bhandle)
Delete bc
FreeEntity bot_h
create_bot(EntityX(user)+Rnd(-100,100),2,EntityZ(user)+Rnd(-100,100))
EndIf
Next
End Function
Здесь мы получаем указатель на элемент типа из имени бота (имени объекта, который его визуализирует - сферы)
bhandle=EntityName(bot_h)
далее удалям запись об этом боте (удаляем соответствующий элемент типа)
bc.bot=Object.bot(bhandle)
Delete bc
И, наконец, удаляем сам объект (используя его хендл)
Таким образом, мы избавились от цикла и сохранили прежнюю функциональность, повысив при этом
производительность.