![]() |
|
||||||||||
|
|||||
|
Регистрация: Sep 2010
Адрес: Saint-Petersburg
Сообщений: 143
|
Здравствуйте! Я попыталась сделать движение объекта за мышкой из этого урока: http://xitri.com/2008/09/22/simple-e...-top-view.html
Но я не очень дружу с математикой и так до конца не смогла разобраться с кодом. А точнее: я немного изменила свою задачу, хотела, чтобы при столкновении с препятствием объект останавливался и начинал двигаться к мышке только когда угол между направлением к цели и направлением движения объекта будет хотя бы, например, 60 градусов. Уже по-всякому пробовала… Не пойму, что влияет на остановку объекта. А пока: при столкновении с препятствием объект не останавливается, а продолжает двигаться к мышке. Ниже мой код для наглядности и исходник, если кто заинтересуется. Очень прошу, помогите разобраться, кто может! Большое спасибо за внимание к моему вопросу! Очень буду рада комментированию частей кода! step = 2; onEnterFrame = function(){ var dx = _xmouse - p._x; var dy = _ymouse - p._y; //Направление (угол) к цели var angle = Math.atan2(dy, dx); var dist = Math.sqrt(dx*dx + dy*dy); if(dist > step) { //пробуем пройти напролом tgtX = p._x + 1/2*step * Math.cos(angle); tgtY = p._y + 1/2*step * Math.sin(angle); p.p2.play(); if (zone.hitTest(tgtX, tgtY, true)){ p.p2.gotoAndStop(1); //напролом не получилось, вычисляем базовое направление var dAngle = dAngleRadian(direction, angle); workAngle = angle + dAngle*.10; //Шаг поворота - 10 градусов for(var i = 0; i < 15; i += 10) { for(var j = -1; j <= 1; j += 2) { if (angle > 60) { var a = workAngle + radian(i) * j; var tempX = p._x + step * Math.cos(a); var tempY = p._y + step * Math.sin(a); if (!zone.hitTest(tempX, tempY, true)) { trace(tempX); //точка выхода найдена. Запоминаем ее и прерываем цикл tgtX = tempX; tgtY = tempY; break; } } } } } var timeDx = tgtX - p._x; var timeDy = tgtY - p._y; //направление движения direction = Math.atan2(timeDy, timeDx); var dAngle = dAngleDegree(direction*180/Math.PI, p._rotation); //поворачиваем клип в направлении движения на 5-ю часть p._rotation += dAngle * .2; p._x = tgtX; p._y = tgtY; } else { //стоим p.p2.gotoAndStop(1); tgtX = p._x; tgtY = p._y; } } 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; } |
|
|||||
|
Регистрация: Sep 2010
Адрес: Saint-Petersburg
Сообщений: 143
|
Людиии, помогите, пожалуйста, разобраться в этом вопросе!!! Я до сих пор голову ломаю... Трудно понять всю эту математику без чьей-то помощи...
|
|
|||||
|
[+1 03.02.12]
Регистрация: Jul 2007
Адрес: Благовещенск на Амуре
Сообщений: 22
|
не использовал твой код, нашёл исходник, заменил имена объектов как в твоём коде, и добавил следующее:
… var dAngle = dAngleDegree(direction*180/Math.PI, p._rotation); if(Math.abs(dAngle)<see){ // !!!!!!!!!! и в слух пожалуйста спасибо TermoBYTE! =D //поворячиваем клип к направлени движения на 5-ю часть p._rotation += dAngle * .2; p._x = tgtX; p._y = tgtY; p.play(); } else { //стоим p.gotoAndStop(5); } } else { //стоим p.gotoAndStop(5); …
__________________
даёш кликопробегом по иконам Последний раз редактировалось Доктор Глюк; 07.10.2011 в 04:17. |
|
|||||
|
Регистрация: Sep 2010
Адрес: Saint-Petersburg
Сообщений: 143
|
Спасибо большое за ответ!
А вот вопрос возник: после столкновения со стеной объект больше не реагирует на мышь специально? |
|
|||||
|
[+1 03.02.12]
Регистрация: Jul 2007
Адрес: Благовещенск на Амуре
Сообщений: 22
|
нет) так вышло) над этим надо думать)) просто мне сейчас реально некогда этими игрушками заниматься)
__________________
даёш кликопробегом по иконам |
|
|||||
|
Регистрация: Sep 2010
Адрес: Saint-Petersburg
Сообщений: 143
|
Ну вот, в принципе уже больше похоже на то, что мне нужно.
Но всё-равно есть один косяк, с которым никак не могу справиться... Когда объект сталкивается со стеной с левой стороны, и когда мышкой поворачиваем объект слева, то он как-то резко поворачивается, дёргается... В общем, чтоб было более понятно, я прикрепила файл... Может кто-нибудь знает, в чём дело? Очень буду рада за помощь! Мой обновлённый код: step = 3; onEnterFrame = function(){ var dx = _xmouse - p._x; var dy = _ymouse - p._y; //Направление (угол) к цели var angle = Math.atan2(dy, dx); var dist = Math.sqrt(dx*dx + dy*dy); if(dist > step) { //пробуем пройти напролом tgtX = p._x + step * Math.cos(angle); tgtY = p._y + step * Math.sin(angle); p.p2.play(); if (zone.hitTest(tgtX, tgtY, true)){ p.p2.stop(); if (!zone.hitTest(p._x, p._y, true)) { tgtX = p._x; tgtY = p._y; p._rotation = angle * 180/Math.PI; } } var timeDx = tgtX - p._x; var timeDy = tgtY - p._y; //направление движения direction = Math.atan2(timeDy, timeDx); var dAngle = dAngleDegree(direction*180/Math.PI, p._rotation); //поворачиваем клип в направлении движения на 5-ю часть var r = p._rotation + dAngle * .2; p._rotation = r; p._x = tgtX; p._y = tgtY; } else { //стоим p.p2.stop(); tgtX = p._x; tgtY = p._y; } } 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; } |
![]() |
![]() |
Часовой пояс GMT +4, время: 20:28. |
|
|
« Предыдущая тема | Следующая тема » |
|
|