Показать сообщение отдельно
Старый 04.09.2005, 06:32   #13
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
коварные боты

Итак, оружие есть - надо и поохотиться )
Создадим тип для ботов
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. Это допустимо, так как в нашем случае
действие происходит на плоскости.
Не забываем про главный цикл программы
Чуть не забыл (куда это добавлять - должно быть уже очевидно, если нет - в конце я прилагаю исходный код всей программы):
Const BOTT=4;for bot
EntityType b\entity,BOTT
	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
а в функции создания мира
create_bot(10,2,50)
Можно запустить и посмотреть. Как видно, на некотором расстоянии от игрока, бот остановится и начнёт совершать непонятные движения - это он
наткнулся на прозрачную сферу, которой окружён игрок.
Перепишем ф-цию обновления выстрелов:
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 и ничего не делайте - вскоре боты заблокируют вас полностью.
Понаблюдайте за обработкой коллизий.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием