![]() |
|
||||||||||
|
|||||
|
Добрый день, как лучше сделать интерактивный объект с таким поведением: когда курсор мыши начинает приближается к нему, он тоже начинает приближаться к мышке, как бы магнититься, только плавно, отводишь, он возвращается на место.
Я сделал, но, думаю, не очень рационально. В частности, если высчитывать расстояние как гипотенузу от центра объекта до мыши, то для прямоугольных вытянутых объектов это не очень красиво, ты довел мышку до края объекта уже, а расстояние до центра еще большое и объект "не очень активен" )) Подскажите пожалуйста...
__________________
Стой! Опасная зона! Работа мозга! |
|
|||||
|
Регистрация: Dec 2008
Адрес: Лапландия
Сообщений: 67
|
так может лучше назначить область действия не с краю, а небольшой радиус около центра
|
|
|||||
|
ну так и есть вокруг центра радиус, я и говорю, что это плохо...
Вот рисунок вобщем
__________________
Стой! Опасная зона! Работа мозга! |
|
|||||
|
-находим некий условный центр объекта через getBounds(stage), например
-шагаем с нужной точностью по отрезку, соединяющему мышь c этим центром, походу проверяя hitTestPoint -если хит найдется на достойном для снапа расстоянии, двигаем |
|
|||||
|
Алгоритм для движения вот тоже вопрос...
На ENTER_FRAME надо какую-то зависимость провести от чего-то - чем ближе мышка, тем больше сила притяжения. Как это выразить кодом?
__________________
Стой! Опасная зона! Работа мозга! |
|
|||||
|
определние снапа ( на ENTER_FRAME, например)
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"); } } не спортивно это как-то спрашивать код, не потрудившись даже сформулировать толком, в чем трабл трудно представить, что проблема посчитать расстояние между точками или двинуть объект в нужном направлении, в зависмости от этого расстояния |
|
|||||
|
А проблему в сущности то нет.
Это просто интерес профессиональный, кто как делает. Что бы не смущать людей, код не дал, дабы не сужать полет фантазии))) Мой вариант реализован на шапке на сайте моем myFlashWorks.ru =) Добавлено через 1 час 27 минут А вот тут уже наткнулся на траблу(( Скорость движения объекта к мышке должна быть обратно пропорцианальна расстоянию между ними. Грубо говоря, так speedX = 1 / (objX - mouseX); Вот когда objX = mouseX, происходит сами понимаете что %\ Как избавиться от нуля в знаменателе или может формулу я неправильную выбрал?
__________________
Стой! Опасная зона! Работа мозга! |
|
|||||
|
Марик, введи очевидную проверку на objX == mouseX
|
|
|||||
|
Макс, а если objX = 0.001, а mouseX = 0? Проверка не сработает, а объект улетит со скоростью 1000 pix/frame...
Округлять тоже не вариант, слишком много потом условий писать, формулу надо другую...
__________________
Стой! Опасная зона! Работа мозга! |
![]() |
![]() |
Часовой пояс GMT +4, время: 02:00. |
|
|
« Предыдущая тема | Следующая тема » |
|
|