Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   "Примагнищивающийся" к мышке объект (http://www.flasher.ru/forum/showthread.php?t=126068)

marat_sa 09.06.2009 10:42

"Примагнищивающийся" к мышке объект
 
Добрый день, как лучше сделать интерактивный объект с таким поведением: когда курсор мыши начинает приближается к нему, он тоже начинает приближаться к мышке, как бы магнититься, только плавно, отводишь, он возвращается на место.

Я сделал, но, думаю, не очень рационально. В частности, если высчитывать расстояние как гипотенузу от центра объекта до мыши, то для прямоугольных вытянутых объектов это не очень красиво, ты довел мышку до края объекта уже, а расстояние до центра еще большое и объект "не очень активен" ))

Подскажите пожалуйста...

kkin 09.06.2009 11:21

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

marat_sa 09.06.2009 11:29

Вложений: 1
ну так и есть вокруг центра радиус, я и говорю, что это плохо...
Вот рисунок вобщем

silin 09.06.2009 11:43

-находим некий условный центр объекта через getBounds(stage), например
-шагаем с нужной точностью по отрезку, соединяющему мышь c этим центром, походу проверяя hitTestPoint
-если хит найдется на достойном для снапа расстоянии, двигаем

marat_sa 09.06.2009 12:20

Алгоритм для движения вот тоже вопрос...
На ENTER_FRAME надо какую-то зависимость провести от чего-то - чем ближе мышка, тем больше сила притяжения.

Как это выразить кодом?

silin 09.06.2009 12:47

определние снапа ( на ENTER_FRAME, например)
Код AS3:

private function checkSnapDistance(evnt:Event):void 
{
        if (!stage) return;
        //координаты центра
        var boundsRect:Rectangle = this.getBounds(stage);
        var cX:Number = boundsRect.x + boundsRect.width / 2;
        var cY:Number = boundsRect.y + boundsRect.height / 2;
        //мышиные координаты
        var mX:Number = stage.mouseX;
        var mY:Number = stage.mouseY;
        //направление на центр
        var dir:Number = Math.atan2( cY - mY, cX - mX);
        //дистанция примагничивания
        var snapDistance:Number = 50;
        //тестовая точка
        var tX:Number = mX + snapDistance * Math.cos(dir);
        var tY:Number = mY + snapDistance * Math.sin(dir);
 
        if (this.hitTestPoint(tX, tY, true))
        {
                trace("snap");
        }
}

зы
не спортивно это как-то спрашивать код, не потрудившись даже сформулировать толком, в чем трабл
трудно представить, что проблема посчитать расстояние между точками или двинуть объект в нужном направлении, в зависмости от этого расстояния

marat_sa 09.06.2009 13:29

А проблему в сущности то нет.
Это просто интерес профессиональный, кто как делает. Что бы не смущать людей, код не дал, дабы не сужать полет фантазии)))
Мой вариант реализован на шапке на сайте моем
myFlashWorks.ru
=)

Добавлено через 1 час 27 минут
А вот тут уже наткнулся на траблу((
Скорость движения объекта к мышке должна быть обратно пропорцианальна расстоянию между ними.
Грубо говоря, так
speedX = 1 / (objX - mouseX);

Вот когда objX = mouseX, происходит сами понимаете что %\
Как избавиться от нуля в знаменателе или может формулу я неправильную выбрал?

firsoff 09.06.2009 18:06

Марик, введи очевидную проверку на objX == mouseX

marat_sa 09.06.2009 18:28

Макс, а если objX = 0.001, а mouseX = 0? Проверка не сработает, а объект улетит со скоростью 1000 pix/frame...

Округлять тоже не вариант, слишком много потом условий писать, формулу надо другую...

alatar 10.06.2009 21:12

Код AS3:

speedX = 1/Math.max(1,(objX - mouseX));



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

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