PDA

Просмотр полной версии : Помогите с алгоритмом поиска пути!


ashIndie
24.02.2012, 19:18
Новая проблема...пытаюсь реализовать данный алгоритм на AS 3.0, но в некоторых местах не пойму что имел ввиду автор.
источник:
http://xitri.com/2008/09/22/simple-engine-flash-game-top-view.html#comment-78710
Я нк пытаюсь сделать на всем готовеньком, вы меня поймите, но просто просидел уже не один час и зашел в тупик честно говоря. Буду очень рад если найдется ктото, кто поможет.
Вот собственно сам код:
step = 2;

onEnterFrame = function(){
var dx = _xmouse - man._x;
var dy = _ymouse - man._y;
//Направление (угол) к цели
var angle = Math.atan2(dy, dx);
var dist = Math.sqrt(dx*dx + dy*dy);
if(dist > step) {
//пробуем пройти напролом
tgtX = man._x + step * Math.cos(angle);
tgtY = man._y + step * Math.sin(angle);
if (!path.hitTest(tgtX, tgtY, true)){
//напролом не получилось, вычисляем базовое направление
var dAngle = dAngleRadian(direction, angle);
workAngle = angle + dAngle*.8;
//Шаг поворота - 10 градусов
for(var i = 0; i < 360; i += 10) {
for(var j = -1; j <= 1; j += 2) {
var a = workAngle + radian(i) * j;
var tempX = man._x + step * Math.cos(a);
var tempY = man._y + step * Math.sin(a);
if (path.hitTest(tempX, tempY, true)) {
//точка выхода найдена. Запоминаем ее и прерываем цикл
tgtX = tempX;
tgtY = tempY;
break;
}
}
}
}
var timeDx = tgtX - man._x;
var timeDy = tgtY - man._y;
//направление движения
direction = Math.atan2(timeDy, timeDx);
var dAngle = dAngleDegree(direction*180/Math.PI, man._rotation);
//поворячиваем клип к направлени движения на 5-ю часть
man._rotation += dAngle * .2;
man._x = tgtX;
man._y = tgtY;
man.play();
} else {
//стоим
man.gotoAndStop(5);
}
}

function dAngleRadian(a1, a2) {
var da = a1 - a2;
if (da > Math.PI) {
da = -Math.PI*2 + da;
} else if (da < -Math.PI) {
da = Math.PI*2 + da;
}
return da;
}
function dAngleDegree(a1, a2) {
var da = a1 - a2;
if (da > 180) {
da = -360 + da;
} else if (da < -180) {
da = 360 + da;
}
return da;
}
function degree(a) {
return a / Math.PI * 180;
}
function radian(a) {
return a / 180 * Math.PI;
}
нужен для того чтобы юнит обходил препятствия, но в некоторых местах я не понимаю что имеется ввиду, да и написан он на старом языке, так что переменная может использоваться у него до обьявления или обьявляться дважды....

MikroAcse
24.02.2012, 19:24
Не сможешь.
hitTest теперь нету в as3.
Лучше начни с малого...

ashIndie
24.02.2012, 19:27
зато есть hitTestPoint и hitTestObject,
это не первое что я пишу на AS3, но просто первая игра с подобием искусственного интеллекта....
конкретно мне непонятны вот эти строчки:
var dAngle = dAngleRadian(direction, angle);
workAngle = angle + dAngle*.8;
тут direction чем отличается от angle, и откуда этот дирекшн берется вообще непонятно.

СлаваRa
24.02.2012, 20:55
посмотрите вот это Поиск пути (pathfinding) (http://coolisee.com/2010/05/21/poisk-puti-pathfinding/) и по - хорошему еще вот это обязательно Поиск пути (http://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%B8%D1%81%D0%BA_%D0%BF%D1%83%D1%82%D0%B8)

ashIndie
25.02.2012, 01:53
СлаваRa, спасибо. отличные статьи. обязательно надо изучить

Добавлено через 1 час 4 минуты
всетаки я был бы очень признателен, если бы кто-нибудь мне разъяснил эти 2 строчки что я описал выше....
алгоритм заработал, но не совсем корректно, с "подергиваниями", когда юнит обходит препятствие...

Добавлено:
Если сделать поиск пути только например по часовой стрелке то все идет гладко, для небольших препятствий это подойдет....но если стена например или сложные какие фигуры, то это выглядит глупо. как это решить еще не придумал