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

bayar 20.01.2016 05:07

Вращение прямой вокруг своей оси с изменением длинны
 
Вложений: 1
Здравствуйте, друзья подскажите как можно реализовать такое вращение?

ALeXVoz 20.01.2016 13:00

Невидимая точка (мувик) движется по нижним точкам с нужной скоростью твинером. между верхней и невидимой точкой по энтерфрейму рисуется линия. каждый последующий шаг - удалить старую линию (очистить graphics) и нарисовать новую линию уже в новое положение невидимой точки. самый простой алгоритм. а круговое движение делается изменением свойства rotation.
поищите примеры стрелочных часов, как там сделаны движения стрелок

silin 20.01.2016 15:51

Вложений: 1
pointTween.swf   (1.3 Кб)

Код AS3:

package 
{
        import flash.display.Shape;
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.geom.Point;
 
 
        public class Main extends Sprite
        {
                private var pX:Array = [200, 300, 250, 150, 100];
                private var pY:Array = [100, 200, 300, 300, 200];
                private var totalLen:Number=0;
                private var totalPos:Number = 0;
                private var step:Number = 2;
 
                public function Main():void
                {
 
 
                        var m:Shape = new Shape();
                        addChild(m);
                        for (var i:int = 0; i < pX.length; i++)
                        {
                                // маркер точки
                                m.graphics.beginFill(0x808080);
                                m.graphics.drawCircle(pX[i], pY[i], 6);
                                // сумма всех длин
                                var j:int = (i + 1) % pX.length;
                                totalLen += new Line(pX[i], pY[i], pX[j], pY[j]).length;
 
                        }
 
                        this.addEventListener(Event.ENTER_FRAME, this_enterFrame);
                }
 
                private function this_enterFrame(e:Event):void
                {
 
                        // шаг по общей длине
                        totalPos += step;
                        totalPos %= totalLen;
                        var prevLen:Number = 0;
                        var curLen:Number = 0;
                        var line:Line;
                        var lineLen:Number;
                        // Ищем текущий отрезок
                        for (var i:int = 0; i < pX.length; i++)
                        {
                                var j:int = (i + 1) % pX.length;
                                line = new Line(pX[i], pY[i], pX[j], pY[j]);
                                lineLen = line.length;
                                prevLen = curLen;
                                curLen += lineLen;
                                if (curLen > totalPos) break;
                        }
                        // точка на текущем отрезке
                        var posOnLine:Number = (totalPos - prevLen) / lineLen;
                        var tP:Point = line.getPos(posOnLine);
                        graphics.clear();
                        graphics.lineStyle(2);
                        graphics.moveTo(pX[0], pY[0]);
                        graphics.lineTo(tP.x, tP.y);
                }
 
        }
 
}
import flash.geom.Point;
class Line
{
        public var x1:Number;
        public var x2:Number;
        public var y1:Number;
        public var y2:Number;
        public var length:Number;
 
        public function Line(x1:Number,y1:Number,x2:Number,y2:Number )
        {
                this.x1 = x1;
                this.x2 = x2;
                this.y1 = y1;
                this.y2 = y2;
                var dX:Number = x2 - x1;
                var dY:Number = y2 - y1;
                length = Math.sqrt(dX * dX + dY * dY);
        }
 
        public function getPos(t:Number):Point
        {
                var tX:Number = x1 + t * (x2 - x1);
                var tY:Number = y1 + t * (y2 - y1);
                return new Point(tX, tY);
 
        }
 
}


bayar 20.01.2016 18:10

Спасибо, silin. То что нужно. Еще один вопрос, если вместо спрайта будет использоваться мувик, то алгоритм не меняется?

silin 20.01.2016 20:31

Нет конечно, алгоритму это никак не навредит :)


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

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