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

sspy 26.02.2010 17:19

плавное перемещение мувмка к мышке.
 
в общем есть муви клип (обычный круг 5х5px) у клипа в Linkage прописано main.Cor

Вот содержимое main/Cor.as
Код AS3:

package main
{
        import flash.display.MovieClip;
        import flash.events.*;
 
        public class Cor extends MovieClip
        {
                var step:int = 1;
                var o:Boolean = false;
                var fx,fy,stepx,stepy:Number = 0;
 
                function Cor():void
                {
                        stage.addEventListener(MouseEvent.CLICK,EventMouseClick);
                        stage.addEventListener(Event.ENTER_FRAME,EventEneterFrame);
                        this.fx = this.x;
                        this.fy = this.y;
                        this.x = Math.floor(this.x);
                        this.y = Math.floor(this.y);
                }
 
                function EventMouseClick(eve:MouseEvent):void
                {
                        this.o=false;
                        this.fx = Math.floor(eve.localX);
                        this.fy = Math.floor(eve.localY);
                        var tx:Number = fx - this.x;
                        var ty:Number = fy - this.y;
 
                        var countstep:Number = 0;
                        if (Math.abs(tx) > Math.abs(ty))
                        {
                                countstep = tx/this.step;
                                this.stepy = ty/countstep;
                                this.stepx = tx/Math.abs(tx);
                        }
                        else
                        {
                                countstep = ty/this.step;
                                this.stepy = ty/Math.abs(ty);
                                this.stepx = tx/countstep;
                        }
                        trace('x: '+((this.stepx*countstep)==tx));
                        trace('y: '+((this.stepy*countstep)==ty));
                        this.o=true;
                }
 
                function EventEneterFrame(event:Event):void
                {
                        if (this.o === true)
                        {
                                if (this.x != this.fx)
                                        this.x+=this.stepx;
 
                                if (this.y != this.fy)
                                        this.y+=this.stepy;
                        }
                }
 
        }
}

мне нужно чтоб как только я щелкал по области флешки (не по муви клипу) так сразу мувиклип постепенно перемещался к этой точке, но у меня проблемма в том что постоянно мувик либо проезжает точку либо не доежает.... помогите.

d_ruha 26.02.2010 18:15

Это проще реализовать твинами. После клика есть координаты мувика и координаты точки, куда его нужно перемещать.
Код AS3:

Tween(mov, "x", Strong.easeOut, this.x, stage.mouseX, 1, true);
Tween(mov, "y", Strong.easeOut, this.y, stage.mouseY, 1, true);

это если делать стандартным твином. Можно и сторонними реализациями.

Zebestov 26.02.2010 18:21

Код AS3:

package main
{
        import flash.display.MovieClip;
        import flash.events.*;
        import fl.transitions.Tween;
        import fl.transitions.TweenEvent;
        import fl.transitions.easing.None;
 
        public class Cor extends MovieClip
        {
                private const _speed:uint = 31; // устанавливаем скорость движения в px/сек
                private var _xTween:Tween;
                private var _yTween:Tween;
 
                public function Cor():void
                {
                        stage.addEventListener(MouseEvent.CLICK,EventMouseClick);
                }
 
                private function EventMouseClick(e:MouseEvent):void
                {
                        var dx:int = int(e.localX - this.x);
                        var dy:int = int(e.localY - this.y);
                        var timeForAnimation:Number = Math.sqrt(dx*dx + dy*dy) / _speed;
 
                        _xTween = new Tween(this, "x", None.easeNone, thix.x, e.localX, timeForAnimation, true)
                        _yTween = new Tween(this, "y", None.easeNone, thix.y, e.localY, timeForAnimation, true)
                        _xTween.addEventListener(TweenEvent.MOTION_FINISH, onFinishHandler);
                {
 
                private function onFinishHandler(e:TweenEvent):void
                {
                        e.target.removeEventListener(TweenEvent.MOTION_FINISH, onFinishHandler);
                        _xTween = null;
                        _yTween = null;
                {
        }
}

В данном примере будет происходить анимация твоего кружочка с одинаковой скоростью на любую дистанцию... и никаких недолетов/перелетов =)

silin 26.02.2010 19:29

еще, как вариант без сторонних твинов, имхо для таких вещей без них спокойнее
Код AS3:

package main
{
        import flash.display.*;
        import flash.events.*;
 
        public class Cor extends MovieClip
        {
 
                private var clickX:Number;
                private var clickY:Number;
 
                function Cor():void
                {
                        //круг
                        graphics.beginFill(0x0);
                        graphics.drawCircle(0, 0, 5);
 
                        addEventListener(Event.ADDED_TO_STAGE, onStage);
                }
 
                private function onStage(event:Event):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, onStage);
                        stage.addEventListener(MouseEvent.CLICK, onStageClick);
                        addEventListener(Event.ENTER_FRAME, onCorEneterFrame);
                }
 
                private function onStageClick(eve:MouseEvent):void
                {
                        clickX = stage.mouseX;
                        clickY = stage.mouseY;
                }
 
                private function onCorEneterFrame(event:Event):void
                {
                        x += (clickX - x) / 4;//4 - на глаз, на вкус
                        y += (clickY - y) / 4;
                }
 
        }
}


Zebestov 27.02.2010 00:39

Тут уж дело стиля =)
Мне напротив спокойней организовать твин по случаю, подтереть его после всех дел и никаких забот.
Кстати — в твоем примере стиль анимации будет типа easeOut. Но это красиво =)
Некрасиво только то, что анимация уже закончилась, а ENTER_FRAME еще работает, да еще и считает там что-то уже бесполезное. Но и это решается: проверил, выровнял, отписался.
Просто надо это все учесть.

dimarik 27.02.2010 01:58

Цитата:

Сообщение от sspy (Сообщение 889506)
обычный круг 5х5px

Улыбнуло. Насколько помню, у круга есть радиус и длина окружности.


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

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