Форум: "Игры";
Текущий архив: 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.008 c