Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2003.03.27;
Скачать: [xml.tar.bz2];

Вниз

Ai и GlScene   Найти похожие ветки 

 
Jedi Knight   (2002-10-25 17:03) [0]

Вообще я плохо разбираюсь в вопросах искусственного интеллекта и у меня такой вопрос:
Как сделать, чтобы враг (В моем случае TIE-Fighter,из Star Wars) садился на хвост и проявлял хоть какие нибудь признаки ума (Стрелял, например не постоянно, а только когда впереди него враг, чтобы распознавал своих/чужих и т.д.)

Примечание:
У меня все происходит в космосе, поэтому вопрос о столкновениях бота с землей отпадает, пока.


 
Sapersky_   (2002-10-26 01:07) [1]

Распознавать своих/чужих - элементарно, просто смотрим в массив (или где там хранятся корабли)... для большей реалистичности можно сделать "вероятность распознования", зависящую от расстояния, квалификации пилота и т.д. После выбора цели садимся на хвост... я в своё время делал так: вычисляется вектор, направленный от позиции AI к позиции цели. Проверяется, насколько он соответствует реальному вектору направления AI. Если не соответствует, AI-корабль поворачивает в нужном направлении - до тех пор, пока угол между векторами не будет меньше опр. величины. Когда будет - стреляем. Одновременно проверяется расстояние до цели - если больше радиуса действия оружия, ускоряемся и т.д.
Могу прислать код процедуры, которая всё это делает (Direct3DRM). Довольно кривой, правда :(.


 
sany   (2002-10-26 01:51) [2]

Sapersky_, если несложно, то можешь и мне выслать, я делаю игрушку типа "гонки на выживание" на delphiX (вид сверху), но пока до разработки ИИ я ещё не добрался, а так я пока плохо в этом разбираюль то мне будет очень полезно посмотреть пример. Зарание спосибо. Если можешь то загляни сюда: http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1035493503&n=9 может чем поможешь?


 
Jedi Knight   (2002-10-26 18:24) [3]

Прислать - это хорошо, только на чем это написано ?(GlScene, OpenGl, DirectX)


 
Джастер   (2002-10-26 21:32) [4]

Он же сказал Direct3DRM, значит это DirectX


 
Sapersky_   (2002-10-26 23:25) [5]

Вставлю прямо сюда, оно небольшое:

procedure GetAimingInfo(Const ASPos, ASDir, TargetPos : TD3DVector;
Var xPr, yPr, zPr, Dist : Single);

// ASPos, ASDir - позиция и направление AI-корабля
// TargetPos - положение цели
// xPr, yPr, zPr - проекции вектора направления AI
// на оси, построенные по вектору, направленному от AI к цели
// Фактически, коэффициенты, показывающие, на сколько нужно поворачивать:
// xPr - вправо/влево, yPr - вверх/вниз,
// zPr - если <0, то мы летим в противоположную сторону :), и нужно развернуться
// Dist - дистанция до цели

Var axZ,axX,axY : TD3DVector;

function Projection(which,to_ : TD3DVector): Single;
begin
Result:=VectorMagnitude(which)*VectorDotProduct(which,to_);
end;

begin
axZ:=VectorSub(ASPos,TargetPos); // вектор от AI к цели
Dist:=VectorMagnitude(axZ); // дистанция до цели
axZ:=VectorNormalize(axZ);
axX.y:=0; axX.x:=-axZ.z; axX.z:=axZ.x; // горизонтальный перпендикуляр к вектору цели
axY:=VectorCrossProduct(axZ,axX); // вертикальный
axY:=VectorNormalize(axY); axX:=VectorNormalize(axX);
xPr:=Projection(ASDir,axX); // проекции реального вектора направления
yPr:=Projection(ASDir,axY); // на три полученные оси
zPr:=Projection(ASDir,axZ);
end;

По полученным данным выполняется прицеливание, например, вот горизонтальное:

If (xPr>acc) then Ships[ShipNum].Turn(tsRight,ttSpeed,True,xPr/2);
If (xPr<-acc) then Ships[ShipNum].Turn(tsLeft,ttSpeed,True,-xPr/2);

(acc - константа, допустимая точность прицеливания).

Я бы мог привести и всё остальное, но оно тебе вряд ли поможет - там идёт специфика игрушки, описываются If"ами (т.е. криво и непонятно - надо бы таблицы для этого делать) различного рода эмпирические (подобранные тыком) закономерности. Вряд ли разберёшься (я сам сейчас не уверен, что смогу :)). А просто передрать не получится - как я уже писал, это работает под D3DRM.
По поводу векторных операций (VectorCrossProduct и т.д.) - см. заголовки к DX7 или 8, Direct3D.pas.


 
Jedi Knight   (2002-10-29 16:42) [6]

Спасибо.



Страницы: 1 вся ветка

Форум: "Игры";
Текущий архив: 2003.03.27;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.007 c
1-87908
NKiril
2003-03-16 10:36
2003.03.27
Выделение строк Word-а из Делфи.


3-87827
PrettyFly
2003-03-10 10:46
2003.03.27
NULL


1-87923
Vint45
2003-03-17 11:30
2003.03.27
Динамический массив


14-88198
NetBreaker666
2003-03-11 17:15
2003.03.27
Так, кстати, никто здесь USB не программировал ?


7-88279
Николай В.
2003-02-03 16:11
2003.03.27
Порт принтера





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский