Форум 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)
-   -   Поиск пути с помощью hitTest () (http://www.flasher.ru/forum/showthread.php?t=155089)

Catofalk 27.04.2011 23:56

Поиск пути с помощью hitTest ()
 
Здравствуйте. Возник вопрос касательно поиска пути объектом по клику мышки. У меня существует рабочее поле, на котором при запуске генерируется рандомный массив объектов, исходя из тематики проекта - каменных глыб.
Так же существует объект который как раз таки и должен перемещаться по полю. Перемещение реализовано кликом на обьект (выбор) ну и дальше кликаю по рабочему полю. Возникла проблема с обходом этих камней, он тупо валит через них. Пытался сделать обход через hitTest (), но добился лишь того что он не выходит за границы самого рабочего поля, а любые пересечения рабочего поля другими объектами полностью игнорит и все так же ходит через них. У меня есть первое рабочее поле, разбитое на 54 ячейки-клипы (gr1-gr54), с их помощью создаю рандомные камни. Сверху на него наложено второе рабочее поле grass, нужное именно для операций по перемещению и обходу. Перемещаемый обьект (pWorm1) и камни(pRock1 - pRock5) находятся в слоях выше.
Подскажите кто может, возможно я как-то не так понимаю работу оператора hitTest ().
Вот листинг:

// Рандомный массив обьектов, первое рабочее поле
pRandom = new Array();
for (var k = 1; k < 6; k++)
{
limit = 53;
rand = int(Math.random() * limit) + 1;
_root["pRock" + k]._x = _root["gr" + rand]._x;
_root["pRock" + k]._y = _root["gr" + rand]._y;
pRandom[k] = rand;
}

//-----------------------------------------------------

_root.pWorm1.onPress = function(){
step=4;
_root.pWorm1.onMouseDown = function()
{
xpos = _root._xmouse;
ypos = _root._ymouse;

onEnterFrame = function(){
var dx = xpos - pWorm1._x;
var dy = ypos - pWorm1._y;
//Направление (угол) к цели
var angle = Math.atan2(dy, dx);
var dist = Math.sqrt(dx*dx + dy*dy);
if(dist > step) {
//пробуем пройти напролом
tgtX = pWorm1._x + step * Math.cos(angle);
tgtY = pWorm1._y + step * Math.sin(angle);
if (!grass.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 = pWorm1._x + step * Math.cos(a);
var tempY = pWorm1._y + step * Math.sin(a);
if (grass.hitTest(tempX, tempY, true)) {
//точка выхода найдена. Запоминаем ее и прерываем цикл
tgtX = tempX;
tgtY = tempY;
break;
}
}
}
}
var timeDx = tgtX - pWorm1._x;
var timeDy = tgtY - pWorm1._y;
//направление движения
direction = Math.atan2(timeDy, timeDx);
var dAngle = dAngleDegree(direction*180/Math.PI, pWorm1._rotation);
//поворячиваем клип к направлени движения на 5-ю часть
pWorm1._rotation += dAngle * .2;
pWorm1._x = tgtX;
pWorm1._y = tgtY;
pWorm1.play();
} else {
//стоим
pWorm1.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;
}

}
}

Bgg 28.04.2011 00:16

Не изобретайте велосипедов, они уже изобретены.
http://www.tonypa.pri.ee/tbw/tut22.html


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

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