forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Пролема при написании ИИ (http://forum.boolean.name/showthread.php?t=7597)

EvilChaotic 08.01.2009 15:53

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

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

Код:

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

И все готово проверям.......самолет летает и разворачивается как я хотел и вродебы все хорошо, и я полон радости :super:
НЕ проверив какже будут на нем создаватся пули я начал дальше делать боевую систему, и сделал ее

Код:

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

Проверяем и тут этот БАГ пули создаются не на нем а где-т орядом, прчем летят вообще ну туда :wallbash:

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

EvilChaotic 08.01.2009 16:04

Ответ: Пролема при написании ИИ
 
Скрин

NitE 08.01.2009 16:34

Re: Пролема при написании ИИ
 
а зачем писать новый поворот если намного легче исправить стрельбу... кратко вообщем создай 2 пивота чайлда для самолета, один на пушке, другой чуть дальше, и так создавай пули заставляя их летет по вектору...

EvilChaotic 08.01.2009 16:38

Ответ: Пролема при написании ИИ
 
Ну да ) А проблема та в том что пишешь им создаваться на пушке а они создаются вообще где-то в другом место да и по разному :''((

NitE 08.01.2009 16:41

Re: Пролема при написании ИИ
 
)) ну тогда выложи код и медию чтоб можно было проверить, потомучто такого быть недолжно, и ты гдето просто напортачил

IGR 13.01.2009 13:08

Ответ: Пролема при написании ИИ
 
EvilChaotic, ух накодил... если чесно то тут трудно разобратся !!
как вариант, могу посоветовать создать анимацию плавного разворота в 3Д-редакторе, а потом при достижении цели просто проиграть эту анимацию, а с пивотом все оставить как было раньше !!

tormoz 13.01.2009 20:06

Ответ: Пролема при написании ИИ
 
IGR прекращай давать советы
совсем.
Ты уже задрал своим бредом

NitE 14.01.2009 00:20

Re: Пролема при написании ИИ
 
нда, раз уж тему подняли хочу спросить - как может помочь анимация плавного разворота при созданий пуль ?

IGR 14.01.2009 18:23

Ответ: Пролема при написании ИИ
 
Цитата:

IGR прекращай давать советы
совсем.
Ты уже задрал своим бредом
договорились !!
буду только с днями рождениями поздровлять !!

CRASHER 17.01.2009 01:18

Ответ: Пролема при написании ИИ
 
EvilChaotic, я не разбирался в твоём коде, у меня тоже бывали подобные случаи. Я экспортил объекты из макса. И сдвинув локальные оси кординат объекта в редакторе, экспортируя в блитз у меня возникала проблема с кординатами пуль и.т.д. Попробуй проверить векторы кординат твоей модели паралельны кординатным векторам сцены. Мне это помогало ;)

phoenix29 26.02.2009 23:08

Ответ: Пролема при написании ИИ
 
EvilChaotic, я не понял, а функция создания пули здесь есть? Или я что-то просмотрел?
Вобщем у меня тоже бывали подобные глюки и не раз. Ты как позиционируешь пулю? Я просто в коде этого не нашёл, возможно ты этот код не выложил. Когда пулю позиционируешь, то можно не давать её родство с объектом, а позиционировать в координаты(причём глобальные, если объект дочерний) самого объекта, поворачивать пули на углы поворота нужного тебе объекта и просто пускать по Z вперёд) однако если пуля летит в нужном направлении но всё-равно появляется рядом с самолётом, то значит у тебя не отцентрирована сама модель самолёта. Попробуй поставить модель в коорд. 0 0 0 и ту да же сферу, увидишь смещение.

Randomize 27.02.2009 01:21

Ответ: Пролема при написании ИИ
 
CreateBullet(SH\Mesh)
Обрати внимание на функцию.
Ты там извлекаешь координаты меша верно?
Так вот они у тебя скорее всего выдаются локальные, а нужны глобальные.
ЗЫ
EntityX#(mesh) - ни есть правельный способ
EntityX#(mesh, true) - выдаёт глобальные(мировые) координаты
если второй параметр не указан, то там False и блиц выдаёт координаты относительно пивота, которые воспринимаются как глобальные.
Посмотри, может проблема в этом.


Кстати на аватарке ты?
Там просто футболка с эмблемой магазина Castle Rock.
Вот я и подумал может ты тоже из Питера.
Могли бы чёнить вместе замутить.


Часовой пояс GMT +4, время: 10:53.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot