коварные боты
Итак, оружие есть - надо и поохотиться )
Создадим тип для ботов
Type bot
Field entity
End Type
Далее как обычно:
Function create_bot(x#,y#,z#)
b.bot=New bot
b\entity=CreateSphere()
PositionEntity b\entity,x#,y#,z#
Return True
End Function
Для простоты визуализация бота будет сведена отображению на экране сферы.
Function update_bot()
v#=0.3
For a.bot=Each bot
PointEntity a\entity,user
MoveEntity a\entity,0,0,v#
Next
End Function
Тут всё ясно как день. За исключением, быть может, команды PointEntity entity,target[,roll#] . Так как основы создания искусственного
интеллекта на базе нейроподобных сетей здесь рассматривать не имеет смысла. А ур-ий, по которым бот, так или иначе, будет за вами двигаться,
можно придумать достаточно много, то ограничимся результатом работы самой простой (в исполнении Блитца) команды. После её выполнения объект
entity будет развёрнут "лицом" (т.е. в сторону положительного направления Z-оси) к объекту target. Это допустимо, так как в нашем случае
действие происходит на плоскости.
Не забываем про главный цикл программы
Чуть не забыл (куда это добавлять - должно быть уже очевидно, если нет - в конце я прилагаю исходный код всей программы):
Collisions BOTT,TERRT,2,3
Collisions BOTT,USERT,2,3
Collisions BOTT,BOTT,2,3
Collisions USERT,BOTT,2,3
Collisions SHOTT,BOTT,2,1
а в функции создания мира
Можно запустить и посмотреть. Как видно, на некотором расстоянии от игрока, бот остановится и начнёт совершать непонятные движения - это он
наткнулся на прозрачную сферу, которой окружён игрок.
Перепишем ф-цию обновления выстрелов:
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
For q.bot=Each bot
If q\entity=bot_h
FreeEntity bot_h
Delete q
Exit
EndIf
Next
EndIf
Next
End Function
Фууу... меня очень угнетает цикл с перебором всех ботов в поисках записи о подбитом, но объяснять как это можно сделать проще, а главное
быстрее здесь не буду (есть небольшой трюк с использованием недокументированных команд и именами объектов). И чтобы превратить игру в
бесконечно долгую, перепишем условие уничтожения бота:
FreeEntity bot_h
Delete q
create_bot(EntityX(user)+Rnd(-100,100),2,EntityZ(user)+Rnd(-100,100))
Exit
Теперь за каждого убитого бота около игрока (в радиусе 100) будет "респиться" новый бот.
Причём сколько было ботов при загрузке - такое их кол-во и будет поддерживаться в игре.
Перепишем функцию создания мира:
c_bot=Input("input Amount")
For i=1 To c_bot
create_bot(Rnd(-100,100),2,Rnd(-100,100))
Next
При загрузке будет запрос на ввод кол-ва ботов.
Попробуйте указать 20 и ничего не делайте - вскоре боты заблокируют вас полностью.
Понаблюдайте за обработкой коллизий.