Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 1.0/2.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 27.04.2011, 23:56
Catofalk вне форума Посмотреть профиль Отправить личное сообщение для Catofalk Найти все сообщения от Catofalk
  № 1  
Ответить с цитированием
Catofalk

Регистрация: Apr 2011
Сообщений: 1
Question Поиск пути с помощью 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;
}

}
}

Старый 28.04.2011, 00:16
Bgg вне форума Посмотреть профиль Отправить личное сообщение для Bgg Найти все сообщения от Bgg
  № 2  
Ответить с цитированием
Bgg
 
Аватар для Bgg

Регистрация: Jan 2009
Адрес: Петерсбург
Сообщений: 1,882
Не изобретайте велосипедов, они уже изобретены.
http://www.tonypa.pri.ee/tbw/tut22.html

Создать новую тему Ответ Часовой пояс GMT +4, время: 17:50.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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