Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Почему движение по окружности быстрее, чем движение по длине окружности через x,y? (http://www.flasher.ru/forum/showthread.php?t=206172)

Dip52 16.01.2014 19:30

Почему движение по окружности быстрее, чем движение по длине окружности через x,y?
 
Здравствуйте.

Если я двигаю объект сверху (A) вниз (B) со скоростью 2, то он проходит за, допустим, одну минуту.
А когда я двигаю объект по окружности, а длина окружности равна длине от A до B, с той же скоростью, то объект движется гораздо быстрее, где-то за полминуты он уже обходит всю окружность.

Dukobpa3 16.01.2014 19:35

Неправильно учитывается скорость в движении по окружности.
(Может конечно наоборот - в движении по прямой, но сомнительно)

Korchy 16.01.2014 20:26

Может быть потому, что скорость бывает линейная и угловая?

Akopalipsis 16.01.2014 20:43

Попробуйте использовать анимацию построенную на времени, такие проблемы совсем отпадут.

samana 16.01.2014 20:50

Думаю лучше будет увидеть вашу реализацию этой анимации, возможно там что-то не правильно сделано, как и сказал Dukobpa3.

Akopalipsis 16.01.2014 22:19

Вложений: 1
Если совсем просто, то вот так -
Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.geom.Point;
 
        public class MoveSpeed extends Sprite
        {
                private var _targets:Array;
 
                public function MoveSpeed()
                {
                        _targets = [];
 
                        //радиус окружности
                        _radius = 100;
                        //длина окружности
                        var straightLength:Number = 2 * Math.PI * _radius;
                        //центр окружности
                        _center = new Point(180, 180);
 
                        //прямая равная длине окружности
                        var straight:Sprite = new Sprite();
                        straight.graphics.lineStyle(2, 0x55EA64);
                        straight.graphics.moveTo(10, 50);
                        straight.graphics.lineTo(10 + straightLength, 50);
                        addChild(straight);
 
                        //окружность
                        var circle:Sprite = new Sprite();
                        circle.graphics.lineStyle(2, 0x55EA64);
                        circle.graphics.drawCircle(0, 0, _radius);
                        circle.graphics.endFill();
                        circle.x = _center.x;
                        circle.y = _center.y;
                        addChild(circle);
 
                        //два кружка которые будем двигать
                        var target0:Sprite = new Sprite();
                        target0.graphics.beginFill(0xEBC154);
                        target0.graphics.drawCircle(0, 0, 10);
                        target0.graphics.endFill();
                        target0.x = 400;
                        target0.y = 300;
                        addChild(target0);
 
                        var target1:Sprite = new Sprite();
                        target1.graphics.beginFill(0xEBC154);
                        target1.graphics.drawCircle(0, 0, 10);
                        target1.graphics.endFill();
                        target1.x = 10;
                        target1.y = 50;
                        addChild(target1);
 
                        _targets[0] = target0;
                        _targets[1] = target1;
 
 
                        //теперь настраиваем анимацию для вращения по окружности
                        _start0 = target0.rotation;//начальное значение
                        _finish0 = 360 - _start0//конечное значение минус начальное
 
                        //настройки для перемещения по прямой
                        _start1 = target1.x;
                        _finish1 = 10 + straightLength - _start1;
 
                        //время за которое должна выполнится анимация
                        _delay = 6;
                        //узнаем кол-во кадров
                        _frameRate = stage.frameRate;
                        stage.addEventListener(Event.ENTER_FRAME, stage_enterFrameHandler);
                }
                private var _allTime:Number = 0;
                private var _delay:Number;
                private var _angle:Number = 360;
                private var _angleRatio:Number = 0;
                private var _start0:Number;
                private var _finish0:Number;
                private var _start1:Number;
                private var _finish1:Number;
                private var _center:Point;
                private var _radius:Number;
                private var _frameRate:Number;
                private function stage_enterFrameHandler(event:Event):void
                {
                        var time:Number = 1 / 1000 * _frameRate;
                        _allTime += time / _delay;
                        var angleRatio:Number = _allTime * _finish0 + _start0;
                        var lineRatio:Number = _allTime * _finish1 + _start1;
 
                        _targets[0].x = Math.cos(angleRatio * Math.PI / 180) * _radius + _center.x;
                        _targets[0].y = Math.sin(angleRatio  * Math.PI / 180) * _radius + _center.y;
                        _targets[1].x = lineRatio;
 
                        if (_allTime >= 1)
                        {
                                _allTime = 0;
                        }
                }
 
        }
 
}

anim.swf   (1.8 Кб)

GBee 16.01.2014 22:42

У вас все хорошо, поставьте курсор мышки на самую правую точку окружности и увидите, что все нормально.

samana 17.01.2014 00:10

Цитата:

Сообщение от GBee (Сообщение 1157543)
У вас все хорошо, поставьте курсор мышки на самую правую точку окружности и увидите, что все нормально.

Это товарищ Akopalipsis просто показал свой вариант решения подобной задачи :) , а код ТС мы так и не увидели.

GBee 17.01.2014 01:35

Цитата:

Это товарищ Akopalipsis просто показал свой вариант решения подобной задачи , а код ТС мы так и не увидели.
Я очень внимателен в последнее время :о))

alexcon314 17.01.2014 09:13

Когда уже в Math появится константа пи/180? :D


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

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