Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Искусственный интеллект. Уклонение от столкновения. (http://www.flasher.ru/forum/showthread.php?t=200144)

australian incognito 30.05.2013 23:29

Искусственный интеллект. Уклонение от столкновения.
 
Вложений: 2
Приветствую, Коллеги.
Сегодня созрел для очередного к вам вопроса.

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

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

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

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

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

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

MovingTestForum.swf   (2.7 Кб)

caseyryan 31.05.2013 00:06

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

australian incognito 31.05.2013 01:19

Цитата:

Сообщение от caseyryan (Сообщение 1135725)
советую почитать книжку киса питерса advanced actionscript 3 animation
там есть эта тема, и довольно качественно описана. Это в разделе behaviors: evading

Спасибо за наводку, попробую найти эту книгу.

Psycho Tiger 31.05.2013 10:50

Цитата:

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

australian incognito 31.05.2013 11:04

Цитата:

Сообщение от Psycho Tiger (Сообщение 1135780)
Мне кажется, ошибка кроется здесь. Опишите подробнее, как у Вас танки договариваются о разьезде.

Если смотреть исходник, то за этот алгоритм отвечает функция
Код AS1/AS2:

processCrash()

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

// угол поворота
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

Код AS3:

function dAngle(da:Number):Number
{
        while (da < 0)
        {
                da = 360 + da;
        }
        while (da > 360)
        {
                da = da - 360;
        }
        //
        return da;
}

Код AS3:

da % 360

А пробовали убрать анимацию разворотов и сразу жестко менять угол? Будет баг?


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

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.