Я иногда так ненавижу этот блитц......
Вообщем хотел написать ИИ маленький самолета будущего
Точнее я уже написал но тут меня обломал страшный баг
Я уже второй день умираю, не могу ничего с ним поделать
Моя идея была такая пускай будет стандартный , пивотный ИИ
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
Проверяем и тут этот БАГ пули создаются не на нем а где-т орядом, прчем летят вообще ну туда
Долго и упорно копался пытаясь как-то исправить, пришел к выводу что это все из за моих поворотов
У меня меш позиционируется в пивот и это почему-то вызывает ошбки
Но почему? Он же летает хорошо. Я очень прошу помочь мне. Может есть другие способы написать такое разворот?
Заранее спасибо )