Форум 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=169325)

Ylik 03.10.2011 00:03

движение к мышке и hitTest
 
Вложений: 1
Здравствуйте! Я попыталась сделать движение объекта за мышкой из этого урока: http://xitri.com/2008/09/22/simple-e...-top-view.html
Но я не очень дружу с математикой и так до конца не смогла разобраться с кодом.
А точнее: я немного изменила свою задачу, хотела, чтобы при столкновении с препятствием объект останавливался и начинал двигаться к мышке только когда угол между направлением к цели и направлением движения объекта будет хотя бы, например, 60 градусов.
Уже по-всякому пробовала… Не пойму, что влияет на остановку объекта.

А пока: при столкновении с препятствием объект не останавливается, а продолжает двигаться к мышке.

Ниже мой код для наглядности и исходник, если кто заинтересуется.

Очень прошу, помогите разобраться, кто может! Большое спасибо за внимание к моему вопросу!
Очень буду рада комментированию частей кода!

Код AS1/AS2:

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;
}


Ylik 04.10.2011 05:13

Людиии, помогите, пожалуйста, разобраться в этом вопросе!!! Я до сих пор голову ломаю... Трудно понять всю эту математику без чьей-то помощи...

Доктор Глюк 07.10.2011 03:57

!!!!!!!!!!!!!!!!!!!!
 
Вложений: 1
не использовал твой код, нашёл исходник, заменил имена объектов как в твоём коде, и добавил следующее:

Код AS1/AS2:

see=60;

Код AS1/AS2:

…
                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);
…


Ylik 07.10.2011 04:05

Спасибо большое за ответ!
А вот вопрос возник: после столкновения со стеной объект больше не реагирует на мышь специально?

Доктор Глюк 07.10.2011 09:13

нет) так вышло) над этим надо думать)) просто мне сейчас реально некогда этими игрушками заниматься)

Ylik 08.10.2011 00:13

Вложений: 1
Ну вот, в принципе уже больше похоже на то, что мне нужно.
Но всё-равно есть один косяк, с которым никак не могу справиться...
Когда объект сталкивается со стеной с левой стороны, и когда мышкой поворачиваем объект слева, то он как-то резко поворачивается, дёргается...
В общем, чтоб было более понятно, я прикрепила файл...
Может кто-нибудь знает, в чём дело? Очень буду рада за помощь!

Мой обновлённый код:
Код AS1/AS2:

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, время: 06:46.

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