Показать сообщение отдельно
Старый 08.01.2009, 15:53   #1
EvilChaotic
Мастер
 
Аватар для EvilChaotic
 
Регистрация: 05.04.2008
Сообщений: 910
Написано 530 полезных сообщений
(для 3,006 пользователей)
Печаль Пролема при написании ИИ

Я иногда так ненавижу этот блитц......
Вообщем хотел написать ИИ маленький самолета будущего
Точнее я уже написал но тут меня обломал страшный баг
Я уже второй день умираю, не могу ничего с ним поделать

Моя идея была такая пускай будет стандартный , пивотный ИИ

Type FlyObject
	Field Mesh%,P_Mesh% :Меш, пивот в меше
	;AI Data
	Field Target%,TField% ;пивот за которым будет гонятся самолет
End Type
Сделаем функцию его создания.
Function CreateHawk(x%,y%,z%)
	SH.FlyObject= New FlyObject
	SH\Mesh% = CopyEntity(SerpHawk_Mesh%): ShowEntity SH\Mesh;Меш
	SH\P_Mesh%=CreatePivot() ; Пивот в нем
	SH\Target%=CreatePivot() ; его цель
	SH\TField%=CreatePivot() ; и пивот рядом с корорым будет появлятся цель
	PositionEntity SH\P_Mesh%,x,y,z ;ставим пивот в меше
	PositionEntity SH\Mesh,EntityX(SH\P_Mesh,1),EntityY(SH\P_Mesh,1),EntityZ(SH\P_Mesh,1);в него ставим сам меш
	PositionEntity 	SH\TField%,x,y,z ; ставим поле
		tx# = EntityX(SH\TField%)+Rand(-100,100) загадываем числа
		tz# = EntityZ(SH\TField%)+Rand(-100,100)
	PositionEntity SH\Target,tx#,TerrainY(Terrain,tx#,0,tz#)+Rand(20,50),tz# ;ставим цель в любое место рядом с SH\TField

End Function
И вот что я хочу сделать и в этом и заключается главная проблема
Я очень хотел сделать хорошую систему разворотов, вот так:
вот летит она к пивоту по прямой достигает близкой дистанции <20
Пивот Target перепозиционируется по случайным числам он разворачивается к нему, летит, достигает и так бесконечно

Сам разворот я хочу сделать такой и я его сделал
достигнув одного пивота он должен тутже устремляться в другой но меш при этом должен плавно разворачиваться к пивоту.



Сделаем функцию апдейта самолета

Function UpdateSH2()
	For SH.FlyObject = Each FlyObject 
		If EntityDistance(SH\P_Mesh,SH\Target)<20 ;проверяем не достиг ли самолет цели если дотиг то
			tx# = EntityX(SH\TField%)+Rnd(-100,100);*0.6 ; згадываем числа
			tz# = EntityZ(SH\TField%)+Rnd(-100,100);*0.6
		PositionEntity SH\Target,tx#,TerrainY(Terrain,tx#,0,tz#)+Rand(20,50),tz# ; перепозицыонируем пивот
		EndIf
		CurvePointEntityXY(SH\Mesh,SH\Target,0.6,0.6) ;плавно направляем меш на пивот
		PointEntity SH\P_Mesh,SH\Target ;мгновенно направляем пивот который отвечает за путь
		MoveEntity SH\P_Mesh,0,0,0.12 ;двигаем этот пивот
		PositionEntity SH\Mesh,EntityX(SH\P_Mesh,1),EntityY(SH\P_Mesh,1),EntityZ(SH\P_Mesh,1); ставим меш на пивот
	Next
End Function
И все готово проверям.......самолет летает и разворачивается как я хотел и вродебы все хорошо, и я полон радости
НЕ проверив какже будут на нем создаватся пули я начал дальше делать боевую систему, и сделал ее

Function UpdateSH()
	For SH.FlyObject = Each FlyObject 
		dst%=300
		dent%=0 
		If EntityDistance(PlayerMesh%,SH\P_Mesh)<dst%
			dst% = EntityDistance(PlayerMesh%,SH\P_Mesh)
			dent% = PlayerMesh%
		EndIf
			If dent<>0
				If SH\Otkat=0
					If EntityDistance(dent%,SH\P_Mesh)<dst% And EntityDistance(dent%,SH\P_Mesh)>50
						CurvePointEntityXY(SH\Mesh,dent%,0.8,0.8)
						PointEntity SH\P_Mesh,dent%
							SH\Reload_Time%=SH\Reload_Time%+1
							If SH\Reload_Time%>20
								CreateBullet(SH\Mesh)
								SH\Reload_Time%=0
							End If
					ElseIf EntityDistance(dent%,SH\P_Mesh)<50
						SH\Otkat=1
					End If
				Else ;SH\Otkat=1
						SH\TimeOtkat%=SH\TimeOtkat%+1
							If EntityDistance(SH\P_Mesh,SH\Target)<40
								tx# = EntityX(SH\TField%)+Rnd(-100,100);*0.6
								tz# = EntityZ(SH\TField%)+Rnd(-100,100);*0.6
								PositionEntity SH\Target,tx#,TerrainY(Terrain,tx#,0,tz#)+Rand(20,50),tz#
							EndIf
						CurvePointEntityXY(SH\Mesh,SH\Target,0.6,0.6)
						PointEntity SH\P_Mesh,SH\Target
						If SH\TimeOtkat%=>1500
							SH\Otkat=0
							SH\TimeOtkat%=0
						End If	
				End If
			Else
				If EntityDistance(SH\P_Mesh,SH\Target)<20
					tx# = EntityX(SH\TField%)+Rnd(-100,100);*0.6
					tz# = EntityZ(SH\TField%)+Rnd(-100,100);*0.6
					PositionEntity SH\Target,tx#,TerrainY(Terrain,tx#,0,tz#)+Rand(20,50),tz#
				EndIf
					CurvePointEntityXY(SH\Mesh,SH\Target,0.6,0.6)
					PointEntity SH\P_Mesh,SH\Target
			EndIf
		MoveEntity SH\P_Mesh,0,0,0.12
	PositionEntity SH\Mesh,EntityX(SH\P_Mesh,1),EntityY(SH\P_Mesh,1),EntityZ(SH\P_Mesh,1)

	Next
End Function
Ив от теперь самолет умеет заходить на атаку если видит врага , ну и просто летать. Настал главны момент: теперь можно сделать чтобы он еще и стрелял ) Впиши все нужное в тип и поехали
If SH\Reload_Time%>20
	CreateBullet(SH\Mesh)
	SH\Reload_Time%=0
End If
Проверяем и тут этот БАГ пули создаются не на нем а где-т орядом, прчем летят вообще ну туда

Долго и упорно копался пытаясь как-то исправить, пришел к выводу что это все из за моих поворотов
У меня меш позиционируется в пивот и это почему-то вызывает ошбки
Но почему? Он же летает хорошо. Я очень прошу помочь мне. Может есть другие способы написать такое разворот?
Заранее спасибо )
__________________

EvilChaotic About
(Offline)
 
Ответить с цитированием