Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > ActionScript 1,2 > Драг мувика по кривой...


Автор: Volchara 26.12.2006, 17:00
Как можно организовать перетаскивание мувика по кривой?
Тоесть есть массив с координатами, это точки изгиба...
Это что то среднее между драгом и гридом...
Вообщем у кого какие идеи?

Автор: Maksys 26.12.2006, 21:47
Просто к мышке приляпываешь mc и тащишь.. чем больше координата по оси x пропорциональная по гриду и y и наобород....

Автор: Volchara 26.12.2006, 22:21
Maksys, так дело в том что таскание надо производить не по прямой, а по произвольной кривой...

Автор: AlDev 27.12.2006, 04:36
Код

package
{
    import flash.display.Graphics;
    
    public class SmoothLine
    {
        public static function draw(graphics:Graphics, dots:Array, tansion:Number, step:Number = 0.02):void {
                
            var x:Number = dots[dots.length-1].x + (dots[dots.length-2].x - dots[dots.length-1].x);
            var y:Number = dots[dots.length-1].y - (dots[dots.length-2].y - dots[dots.length-1].y);
            var endDot:Vector = new Vector(x,y);
            
            x = dots[0].x - (dots[1].x - dots[0].x);
            y = dots[0].y - (dots[1].y - dots[1].y);            
            var startDot:Vector = new Vector(x,y);
            
            var newDots:Array = new Array();
            
            var i:Number = 0;
            newDots.push(startDot);
            for (i=0;i<dots.length;i++) {
                newDots.push(dots[i]);
            }
            newDots.push(endDot);
                    
            graphics.moveTo(dots[0].x,dots[0].y);
            
            for (i = 0;i<newDots.length-3;i++) {
                
                for (var j:Number = 0; j<=1;j+=step) {                
                    
                    var p0:Vector = newDots[i];
                    var p1:Vector = newDots[(i + 1)%newDots.length];
                    var p2:Vector = newDots[(i + 2)%newDots.length];
                    var p3:Vector = newDots[(i + 3)%newDots.length];
                    
                    var u:Number = j;
                    var uu:Number = Math.pow(u,2);
                    var uuu:Number = Math.pow(u,3);
                    
                    var h0:Number = 2*uuu - 3*uu + 1;// calculate basis function 1
                    var h1:Number = -2*uuu + 3*uu;// calculate basis function 2
                    var h2:Number = uuu - 2*uu + u;         // calculate basis function 3
                    var h3:Number = uuu -  uu;              // calculate basis function 4
                    
                    var t1x:Number = tansion*(p2.x - p0.x);
                    var t1y:Number = tansion*(p2.y - p0.y);
                    var t2x:Number = tansion*(p3.x - p1.x);
                    var t2y:Number = tansion*(p3.y - p1.y);
                    x = h0*p1.x + h1*p2.x + h2*t1x + h3*t2x;
                    y = h0*p1.y + h1*p2.y + h2*t1y + h3*t2y;

                    graphics.lineTo(x,y);
                }
            }
        }
    }
}


Код

package
{
    public class Vector
    {
        public var x:Number;
        public var y:Number;
        
        public function Vector(x:Number,y:Number) {
            this.x = x;
            this.y = y;
        }
    }
}


Код

package {
    import flash.display.Sprite;
    import flash.display.Graphics;
    import flash.ui.Keyboard;
    import flash.events.Event;

    public class convertS extends Sprite
    {
        public function drawPlus(target:Graphics,x:Number,y:Number,r:Number):void {
            target.moveTo(x+r,y);
            target.lineTo(x-r,y);
            target.moveTo(x,y+r);
            target.lineTo(x,y-r);
        }
                
        public function convertS()
        {
            var pList:Array = new Array();            
            pList.push(new Vector(50, 250));
            pList.push(new Vector(100, 300));
            pList.push(new Vector(150, 200));
            pList.push(new Vector(200, 250));
            pList.push(new Vector(250, 300));
            pList.push(new Vector(300, 350));
            pList.push(new Vector(350, 320));
            
            var sbuf:Sprite = new Sprite();
            sbuf.graphics.clear();
            sbuf.graphics.lineStyle(1);
            addChild(sbuf);
            for (var i:Number = 0;i<pList.length;i++) {
                var v:Vector = pList[i];
//                drawPlus(sbuf.graphics,v.x,v.y,2);
            }
            
            var dbuf:Sprite = new Sprite();
            dbuf.graphics.lineStyle(1);
            addChild(dbuf);
            
            SmoothLine.draw(dbuf.graphics,pList,0.6,0.0002);
        }
    }
}



переводить в as 2 лень, это ActionScript 3.
Но смысл  я думаю понять можно.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)