PDA

Просмотр полной версии : Искусственный интеллект. Уклонение от столкновения.


australian incognito
30.05.2013, 23:29
Приветствую, Коллеги.
Сегодня созрел для очередного к вам вопроса.

Есть некая игровая механика (исходник прикреплен). Далее я немного поясню ее:

1. Два обьекта (в моем случае это танки) двигаются непрерывно в замкнутом пространстве
2. Со случайным интервалом времени каждый обьект может поменять вектор своего движения на некий случайный угол
3. Если обьекты подходят друг к другу достаточно близко - они начинают менять вектора движения так, чтобы разьехаться
4. При выходе за границу обьекты перемещаются на противоположную сторону зоны, в которую помещены

Такой вот несложный ИИ. Но в процессе работы над ним столкнулся со следующими проблемами:

1. Мой обработчик столкновений недостаточно хорош и обьеты при странных обстоятельствах все же умудряются наезжать друг на друга
2. Обработка столкновений обьектов за границей зоны, которой они ограничены слегка примитивна, но до другой я не додумался

Собственно, к сообществу у меня будет вопрос: если у вас есть соображения, где именно закралась ошибка по п. 1 и какой лучше применить алгоритм для п. 2 - буду рад каждой идее.

Заранее всем спасибо.

MovingTestForum.swf

caseyryan
31.05.2013, 00:06
советую почитать книжку киса питерса advanced actionscript 3 animation
там есть эта тема, и довольно качественно описана. Это в разделе behaviors: evading

australian incognito
31.05.2013, 01:19
советую почитать книжку киса питерса advanced actionscript 3 animation
там есть эта тема, и довольно качественно описана. Это в разделе behaviors: evading
Спасибо за наводку, попробую найти эту книгу.

Psycho Tiger
31.05.2013, 10:50
3. Если обьекты подходят друг к другу достаточно близко - они начинают менять вектора движения так, чтобы разьехаться
Мне кажется, ошибка кроется здесь. Опишите подробнее, как у Вас танки договариваются о разьезде.

australian incognito
31.05.2013, 11:04
Мне кажется, ошибка кроется здесь. Опишите подробнее, как у Вас танки договариваются о разьезде.

Если смотреть исходник, то за этот алгоритм отвечает функция processCrash()
Кратко суть такова: считаем разницу векторов движения мелкого и большого танков; если она по абсолютному значению в пределах 15-90 градусов, то просто присваиваем вектор мелкого танка большому и наоборот; в противном случае смотрим знак разницы векторов и в зависимости от него даем чуть меньше 90 градусов разворота каждому танку с разными знаками.
Вот кусочек кода, который за это отвечает:

// угол поворота
var angRotLT:Number;
var angRotHT:Number;
//
var diffAng:Number = dAngle(tankL._rotation) - dAngle(tankH._rotation);
//
if (Math.abs(diffAng) <= 90 && Math.abs(diffAng) >= 15)
{
angRotLT = dAngle(tankH._rotation);
angRotHT = dAngle(tankL._rotation);
}
else
{
if (diffAng < 0)
{
angRotLT = dAngle(tankL._rotation + 80);
angRotHT = dAngle(tankH._rotation - 70);
}
else if (diffAng > 0)
{
angRotLT = dAngle(tankL._rotation - 80);
angRotHT = dAngle(tankH._rotation + 70);
}
else if (diffAng == 0)
{
if (randNum(2) == 2)
{
angRotLT = dAngle(tankL._rotation - 45);
}
else
{
angRotLT = dAngle(tankL._rotation + 45);
}
}
}
// избавляемся от отрицательных углов и углов >360 градусов
function dAngle(da:Number):Number
{
while (da < 0)
{
da = 360 + da;
}
while (da > 360)
{
da = da - 360;
}
//
return da;
}

Psycho Tiger
31.05.2013, 13:57
function dAngle(da:Number):Number
{
while (da < 0)
{
da = 360 + da;
}
while (da > 360)
{
da = da - 360;
}
//
return da;
}
da % 360
А пробовали убрать анимацию разворотов и сразу жестко менять угол? Будет баг?