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

Neirol 29.09.2009 19:38

Движение за мышью с ускорением, и полным торможением к прибытию к мыши, как?
 
Знаю как определить угол поворота в сторону мышки, а следовательно и то, как двигать объект в сторону мышки.
Ускорение естественно тоже понятно.
Непонятно одно, как сделать так, чтобы объект в определенном месте (по расчетам) начинал тормозить так, чтобы он затормозил полностью в момент когда он столкнется с координатами мышки?

Сейчас же додумался до того, что можно начинать торможение тогда, когда мышка перестает двигаться, в принципе мне и это бы подошло, но все таки остается интересным как сделать описанное мною выше.

AL.exe 29.09.2009 19:47

Как вариант, по теореме Пифагора определять расстояние между объектом и курсором и домножать на него скорость объекта. Соответственно, чем ближе - тем медленнее, а в точке нахождения курсора расстояние будет нулевым, соответственно, объект остановится.

Neirol 29.09.2009 20:11

Т.е., скажем:
Код AS3:

if(hero.x > mouseX) var distanceX = (hero.x - mouseX) * speed;
else var distanceX = (mouseX - hero.x) * speed;
 
if(hero.y > mouseY) var distanceY = (hero.y - mouseY) * speed;
else var distanceY = (mouseY - hero.y) * speed;

И сама distance будет являться и скоростью для определения проекций скоростей на X и Y?
Т.е.
Код AS3:

hero.x += distanceX * Math.cos(angle);
hero.y += distanceY * Math.sin(angle);

Таким образом?

silin 29.09.2009 20:13

а че бы не по-простому
Код AS3:

public class MouseHunter extends Sprite
{
        private const a:Number = 0.2;
        public function MouseHunter()
        {
                graphics.beginFill(0);
                graphics.drawCircle(0, 0, 20);
                addEventListener(Event.ENTER_FRAME, onEnterFrameHandler);
        }
 
        private function onEnterFrameHandler(event:Event):void
        {
                x += a * mouseX;
                y += a * mouseY;
        }
}


Neirol 29.09.2009 20:36

Напиши пожалуйста решение для AS 3.0.
Твой вариант на AS 2.0.

Felicast 29.09.2009 21:26

Цитата:

Сообщение от Neirol (Сообщение 854481)
Напиши пожалуйста решение для AS 3.0.
Твой вариант на AS 2.0.

и где здесь as2? ниодного намека на as2 не вижу

Neirol 29.09.2009 22:37

Ну точно могу сказать что это не AS 3. Т.к. в AS 3 все методы расфасованы по пакетам, которые нужно подключать.
А также, некоторые методы используемые silin в AS 3 вообще удалены.

GFreemen 29.09.2009 22:44

Уважаемый, Neirol, вы не правы...

Neirol 29.09.2009 23:01

Ну тогда получается что это не я не прав, а Flash CS4 не прав :)
Я записал написанное silin в отдельный файл и назвал его так же, как и он назвал свой класс.
Далее самостоятельно подключил пакеты и в ответ получил ошибку:
Migration issue: The method drawCircle is no longer supported.
В замен которого, как я только что заметил должна идти функция drawOval (подсказывает флеш), хотя такую функцию он тоже не воспринимает....

И вдобавок такая ошибка насчет хэндлера EnterFrame....
1046: Type was not found or was not a compile-time constant: Event.

Добавлено через 34 секунды
Т.е. в итоге с моими исправлениями и подсказками флеша:
Код AS3:

package {
        import flash.display.Sprite;
        import flash.display.Graphics;
 
        public class MouseHunter extends Sprite
        {
                private const a:Number = 0.2;
                public function MouseHunter()
                {
                        graphics.beginFill(0);
                        graphics.drawOval(0, 0, 20);
                        this.addEventListener(Event.ENTER_FRAME, onEnterFrameHandler);
                }
 
                private function onEnterFrameHandler(e:Event):void
                {
                        x += a * mouseX;
                        y += a * mouseY;
                }
        }
}


silin 29.09.2009 23:17

о сколько на открытий чудных..:)

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

Добавлено через 4 минуты
насчет 'The method drawCircle is no longer supported' компилятор тебя обманывает: еще поддерживается

Neirol 29.09.2009 23:22

Да дело не в этом, просто без этого, это уже вроде как AS 2, да и про функцию drawCircle флеш ругается, что миграция мол, уже была, иди в *опу со старьем. Что вместо нее использовать то в AS 3?

silin 29.09.2009 23:37

я бы не стал работать с компилятором, у которого миграция так далеко зашла

нарисуй квадрат, пусть он бегает..:)

Neirol 29.09.2009 23:39

В FLA:
Код AS3:

var mh:MouseHunter = new MouseHunter();
addChild(mh);

В MouseHunter.as:
Код AS3:

package {
        import flash.display.Sprite;
        import flash.display.Graphics;
 
        public class MouseHunter extends Sprite
        {
                private const a:Number = 0.2;
                public function MouseHunter()
                {
                        graphics.beginFill(0);
                        graphics.drawOval(0, 0, 20);
                        addEventListener(Event.ENTER_FRAME, onEnterFrameHandler);
                }
 
                public function onEnterFrameHandler(e:Event):void
                {
                        x += a * mouseX;
                        y += a * mouseY;
                }
        }
}

Результат: пустое окно, ошибка - 1046: Type was not found or was not a compile-time constant: Event. - 15 строка.

silin 29.09.2009 23:42

Код AS3:

package  
{
        import flash.display.Sprite;
        import flash.events.Event;
 
        public class MouseHunter extends Sprite
        {
                private const a:Number = 0.2;
                public function MouseHunter()
                {
                        graphics.beginFill(0);
                        graphics.drawCircle(0, 0, 20);
                        addEventListener(Event.ENTER_FRAME, onEnterFrameHandler);
                }
 
                private function onEnterFrameHandler(event:Event):void
                {
                        x += a * mouseX;
                        y += a * mouseY;
                }
        }
}


Neirol 29.09.2009 23:46

Я знаю что нет =)
Мне флеш говорит что нужно использовать drawOval вместо drawCircle
В общем поставил обратно drawCircle
Поставил flash.events.Event
И все заработало как надо!
Огромное спасибо!!!

Добавлено через 1 час 5 минут
http://vkontakte.ru/app624814_17210304
А как сделать такое же плавное движение как здесь?

silin 30.09.2009 09:42

Код AS3:

public class MouseHunter extends Sprite
{
        private var a:Number = 0.1;
        private var damp:Number = 0.925;
        private var sX:Number = 0;
        private var sY:Number = 0;
 
        public function MouseHunter()
        {
                graphics.beginFill(0);
                graphics.drawCircle(0, 0, 20);
                addEventListener(Event.ADDED_TO_STAGE, onStage);
        }
 
        private function onStage(evnt:Event):void
        {
                removeEventListener(Event.ADDED_TO_STAGE, onStage);
                addEventListener(Event.ENTER_FRAME, onEnterFrameHandler);
                stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMoveHandler);
        }
 
        private function onMouseMoveHandler(evnt:MouseEvent):void
        {
                sX = a * mouseX;
                sY = a * mouseY;
        }
 
        private function onEnterFrameHandler(event:Event):void
        {
                x += sX *= damp;
                y += sY *= damp;
        }
}


Neirol 30.09.2009 10:37

Вложений: 1
Классно, стало совсем как там.
Но я имел ввиду саму гладкость передвижения, без морганий =)
Оказывается надо было просто FPS добавить и стало все совсем супер ;)

Результат во вложении.
Всем огромное спасибо :drinks:

sltt 27.02.2010 12:06

silin, а можно ли как нибудь просчитать такой-же простой формулой, движение в N шагов?
Примерно::
Код AS1/AS2:

        private var stepN:Number = 15;
 
        private var a:Number = stepN / 10;
        private var damp:Number = stepN / a;
        private var sX:Number;
        private var sY:Number;
 
                sX = a * mouseX;
                sY = a * mouseY;
 
                fot (var i=0; i<stepN; i++)
                {
                        x += sX *= damp;
                        y += sY *= damp;
                }


silin 27.02.2010 12:53

старина, движение в N шагов легко вычистятся делением дистанции на эти н-шагов, не ?

sltt 27.02.2010 13:27

да, но я имею в виду движение которое сначала ускоренное, а под конец тормозящее.

Bgg 27.02.2010 14:19

Изобретатели велосипедов :)
Цитата:

Сообщение от sltt (Сообщение 889725)
да, но я имею в виду движение которое сначала ускоренное, а под конец тормозящее.

держи
Код AS3:

import com.greensock.*;
import com.greensock.easing.*;
TweenLite.to(mc, 1, {x:65, y:117, ease:Cubic.easeOut});


sltt 27.02.2010 14:30

Bgg, спасибо, но мне нужен код, который я бы смог контролировать в любой момент. Твины контролировать нельзя.

Bgg 27.02.2010 14:37

sltt, можно. Смотря что вам нужно. Можно остановить, возобновить, промотать в обратную сторону твин; повесить события о начале, окончании, процессе анимации. Само собой все свойства объекта так же в ваших руках.

sltt 27.02.2010 15:09

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

Сообщение от silin (Сообщение 854591)
Код AS3:

public class MouseHunter extends Sprite
{
        private var a:Number = 0.1;
        private var damp:Number = 0.925;
        private var sX:Number = 0;
        private var sY:Number = 0;
 
        public function MouseHunter()
        {
                graphics.beginFill(0);
                graphics.drawCircle(0, 0, 20);
                addEventListener(Event.ADDED_TO_STAGE, onStage);
        }
 
        private function onStage(evnt:Event):void
        {
                removeEventListener(Event.ADDED_TO_STAGE, onStage);
                addEventListener(Event.ENTER_FRAME, onEnterFrameHandler);
                stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMoveHandler);
        }
 
        private function onMouseMoveHandler(evnt:MouseEvent):void
        {
                sX = a * mouseX;
                sY = a * mouseY;
        }
 
        private function onEnterFrameHandler(event:Event):void
        {
                x += sX *= damp;
                y += sY *= damp;
        }
}



Хотя мне не понятно что такое
Код AS1/AS2:

        private var a:Number = 0.1;
        private var damp:Number = 0.925;

я понял что меняя их, можно менять скорость этого передвижения. А если точнее то их можно подобрать так чтоб это движение произошло ровно за N шагов.
И подобрать их скорее всего можно по простой формуле типа
Код AS1/AS2:

        private var stepN:Number = 15;
 
        private var a:Number = stepN / 10;
        private var damp:Number = stepN / a;

Только я немогу догнать по какой именно формуле. Думал вдруг silin вспомнит.

GentleFLASH 27.02.2010 16:42

sltt, вообще то здесь движение всегда будет тормозящим. Эффект ускорения возникает оттого, что ты мышку таскаешь плавно ;)
А насчет рассчета движения - это геометрическая прогрессия, как я понимаю.

Scorp2008 11.01.2012 22:07

Цитата:

Сообщение от silin (Сообщение 854591)
Код AS3:

public class MouseHunter extends Sprite
{
        private var a:Number = 0.1;
        private var damp:Number = 0.925;
        private var sX:Number = 0;
        private var sY:Number = 0;
 
        public function MouseHunter()
        {
                graphics.beginFill(0);
                graphics.drawCircle(0, 0, 20);
                addEventListener(Event.ADDED_TO_STAGE, onStage);
        }
 
        private function onStage(evnt:Event):void
        {
                removeEventListener(Event.ADDED_TO_STAGE, onStage);
                addEventListener(Event.ENTER_FRAME, onEnterFrameHandler);
                stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMoveHandler);
        }
 
        private function onMouseMoveHandler(evnt:MouseEvent):void
        {
                sX = a * mouseX;
                sY = a * mouseY;
        }
 
        private function onEnterFrameHandler(event:Event):void
        {
                x += sX *= damp;
                y += sY *= damp;
        }
}


Пытаюсь сделать плавное движение по этому коду, по оси X. Так вот есть клип heromc, однако в Update пишу код heromc.x += sX *= damp; - и объект улетает черт знает куда, а не за мышью движется, в чем проблема может быть ?

silin 11.01.2012 22:33

ну обычно, куда напишешь - туда и улетает..:)
мы должны угадать где вы и что-то пишите ?
sX - величина, пропорциональная расстоянию до мыши, ее корректируем в MOUSE_MOVE, чтобы все это работало для heromc, видимо и определять ее нужно примерно как sX = 0.1 * heromc.mouseX;

etc 11.01.2012 23:42

Достаточно по x и y добавлять 1/10 от разницы между конечной (координаты мыши) и текущей точкой.

loover 06.03.2012 03:20

а как сделать движение к определенной точке сначала с ускорением (скорость увеличивается с нуля), а когда до цели осталось определенное расстояние (например, половина) - с замедлением до нуля, в обработчике ENTER_FRAME?

fljot 06.03.2012 04:19

Цитата:

Сообщение от ChuwY (Сообщение 1067425)
Главное, чтобы easeInOut

Так на деле выйдет, что при каждом движении курсора предыдущий твин будет останавливаться, а новый начинаться с нулевой скоростью — т.е. будет рывками.


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

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