Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.05.2009, 21:37   #1
CrHD
 
Регистрация: 19.05.2009
Сообщений: 8
По умолчанию Обход динамичных препятствий

Приветствую.
Имеем поле - image =)
На нем полигоном рисуются некие прямоугольные объекты. Назовем их роботами =)
Роботы описаны как класс. Их массив =)
Они ездят по таймеру, поворачиваются на заданный угол и следуют по данному вектору благодаря этой формуле
Код:
tmp:=PBody[i];
PBody[i].X:=x+round((tmp.X-x)*cos(pi/180*a)-(tmp.Y-y)*sin(pi/180*a));
PBody[i].y:=y+round((tmp.X-x)*sin(pi/180*a)+(tmp.Y-y)*cos(pi/180*a));
где a - собственно угол.
Они благополучно бродят по полю, и отворачивают от стенок таким макаром
Код:
if (x<=100) and (pbody[3].x>=pbody[4].X) then //решаем в какую сторону будем отворачивать
begin
brake(4); //снижаем скорость до 4х
a:=a+4; //плавно меняем угол
end;
Воот... Такое прописано для каждой стенки и углов.
собственно бродит их по полю n штук, и я вот думаю, как лучше реализовать, что бы они не проходили сквозь друг друга, а благополучно разъезжались...
В данный момент у меня где то так
Код:
for i:=1 to mnumb do
 begin
* robot[i].Move; //двигаюцца
* robot[i].EvasionWalls;//не врезаются в границы поля

 for j:=1 to mnumb do //mnumb - это их количество на поле
 begin
* if j=i then continue;
* * if (round(sqrt(sqr(robot[i].x-robot[j].x)+(sqr(robot[i].y-robot[j].y))))<100)
* * then
* * *begin
* * * robot[i].a:=robot[i].a+6; //меняют угол
* * * robot[j].a:=robot[j].a+10; //углы разные, бывает что при тесной встречи они начинают кружить вальс, это что бы быстрее разъехались.=)
* * *end;
* *end;
 end;
Собственно нужны свежие мысли, как это лучше реализовать, а то боюсь пойду я дальше по своему пути, и застряну где нибудь так, что прийдется все переделывать... Думаю сделать условие, что бы проверялось какими боками они друг к другу находятся на момент сближения, что бы отвернуть в разные стороны друг от друга... Хотя если встречаются два или более одиночества у границы имаджа, они начинают почти бесконечно кружить, почти на месте... Да и втроем на центре встретятся - кто нить да и пройдет сквозь другого =)
Короче думаю у меня не очень умная реализация всего этого.
Мб кто-нибудь предложит свежую идею, как это все можно обыграть, дабы они нормально жили в полевых условиях? =)
CrHD вне форума Ответить с цитированием
Старый 19.05.2009, 22:42   #2
Dj_smart
Капсула от спама
Форумчанин
 
Аватар для Dj_smart
 
Регистрация: 04.03.2008
Сообщений: 779
По умолчанию

Могу посоветовать пробывать аля зеркальный метод - просто углы поменять местами Ведь задницами они не сьедутся так что обезалельно разьедутся
Код:
begin
  temp:=robot[i].a //меняют угол
  robot[i].a:=robot[j].a;
  robot[j].a:=temp;
end;
Изображения
Тип файла: jpg Аля.jpg (10.6 Кб, 103 просмотров)
Если данный ответ не столь конкретен, как Вы желаете его увидеть, возможно необходимо поразмыслить, стоит ли вопрос того, чтобы о нём спрашивать на форуме?
CncFiles.ru - бесплатный файловый хостинг
Dj_smart вне форума Ответить с цитированием
Старый 19.05.2009, 22:54   #3
CrHD
 
Регистрация: 19.05.2009
Сообщений: 8
По умолчанию

Разъедутся... Даже мгновенно разлетятся =)
Но угол должен меняться постепенно, что бы было видно как они поворачивают. Тут уже так не получится...
CrHD вне форума Ответить с цитированием
Старый 19.05.2009, 23:09   #4
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,547
По умолчанию

По идеи, они должны остановиться, повернуться на месте и поехать дальше.
Скорости у всех одинаковые?
Arigato вне форума Ответить с цитированием
Старый 19.05.2009, 23:10   #5
Dj_smart
Капсула от спама
Форумчанин
 
Аватар для Dj_smart
 
Регистрация: 04.03.2008
Сообщений: 779
По умолчанию

Тогда попробуйте постепенно менять углы местами, типа так:
Код:
begin
  robot[i].TempA:=robot[j].a;
  robot[j].TempA:=robot[i].a
end;
И потом где-либо в цикле:
Код:
if robot[i].TempA>robot[i].a then robot[i].a:=robot[i].a+1;
if robot[i].TempA<robot[i].a then robot[i].a:=robot[i].a-1;
Только нужно незабыть менять TempA вместе с A.
Цитата:
По идеи, они должны остановиться, повернуться на месте и поехать дальше.
Скорости у всех одинаковые?
Ах да, нужно "простимулировать" роботов выйти за пределы круга чтобы не среагировать опять...
Изображения
Тип файла: jpg 1.jpg (23.3 Кб, 68 просмотров)
Если данный ответ не столь конкретен, как Вы желаете его увидеть, возможно необходимо поразмыслить, стоит ли вопрос того, чтобы о нём спрашивать на форуме?
CncFiles.ru - бесплатный файловый хостинг
Dj_smart вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обход Н/Д Slavik Microsoft Office Excel 2 09.05.2009 00:49
Обход капчи kobe24 Общие вопросы по программированию, компьютерный форум 13 09.03.2009 20:28
Обход подставного IP Garacio_cain Работа с сетью в Delphi 11 09.03.2009 20:08
Обход графа в глубину coptor Общие вопросы Delphi 0 09.12.2008 22:50
обход дерева ribka Помощь студентам 2 11.12.2007 20:38