![]() |
|
||||||||||
|
|||||
|
Регистрация: Apr 2011
Сообщений: 1
|
Здравствуйте. Возник вопрос касательно поиска пути объектом по клику мышки. У меня существует рабочее поле, на котором при запуске генерируется рандомный массив объектов, исходя из тематики проекта - каменных глыб.
Так же существует объект который как раз таки и должен перемещаться по полю. Перемещение реализовано кликом на обьект (выбор) ну и дальше кликаю по рабочему полю. Возникла проблема с обходом этих камней, он тупо валит через них. Пытался сделать обход через 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; } } } |
|
|||||
|
Регистрация: Jan 2009
Адрес: Петерсбург
Сообщений: 1,882
|
Не изобретайте велосипедов, они уже изобретены.
http://www.tonypa.pri.ee/tbw/tut22.html |
![]() |
![]() |
Часовой пояс GMT +4, время: 17:50. |
|
|
« Предыдущая тема | Следующая тема » |
|
|