forked from: Ring

by aobyrne forked from Ring (diff: 91)
rotating the ring
♥2 | Line 100 | Modified 2011-04-24 13:43:31 | MIT License
play

ActionScript3 source code

/**
 * Copyright aobyrne ( http://wonderfl.net/user/aobyrne )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/ejfP
 */

package  
{
    import Box2D.Common.Math.b2Vec2;
    import Box2D.Dynamics.b2Body;
    import com.actionsnippet.qbox.QuickBox2D;
    import com.actionsnippet.qbox.QuickObject;
    import flash.display.Graphics;
    import flash.display.MovieClip;
    import flash.display.Sprite;
    import frocessing.color.ColorHSV;

    public class RingAloner extends MovieClip 
    {
        private var sim:QuickBox2D;
        private var segmentWidth:Number;
        private var segmentHeight:Number;
        private var ìsStartingAtX:Boolean=false;
        
        public function RingAloner() 
        {
            sim = new QuickBox2D(this, { debug:false } );
            sim.gravity = new b2Vec2;
            sim.createStageWalls();
            addRing(5, 4, 3);
            ìsStartingAtX = true;
            addRing(5, 11, 3);
            // start simulation
            sim.start();
            sim.mouseDrag();            
        }
        
        private function addRing(cx:Number, cy:Number,r:Number):void 
        {
            var color:ColorHSV = new ColorHSV();
            var extraWidthFactor:Number = 1.2;
            segmentWidth = 0.5;
            var segmentAmount:Number = 20;
            var deltaAngle:Number = Math.PI * 2 / segmentAmount;
            segmentHeight = 2 * r * Math.sin(deltaAngle * 0.5)*extraWidthFactor;
            var angle:Number = 0;
            color.h = angle;
            var box:Object = 
            { 
                width:segmentWidth, 
                height:segmentHeight, 
                fixedRotation:false,
                angularDamping:1, 
                density:1,
                fillAlpha:0
            };
            setBoxPosition(box, cx, cy, r, angle);
            //box["groupIndex"] = -1;
            var pre:QuickObject = sim.addBox( box );
            doMarkBox(pre,angle);
            //box["groupIndex"] = 1;
            var first:QuickObject = pre;
            for (var i:int = 0; i <segmentAmount-1; i++) 
            {
                angle += deltaAngle;
                color.h = angle
                setBoxPosition(box, cx, cy, r, angle);
                //if (i == segmentAmount - 2)
                //{
                    //box["groupIndex"] = -1;
                    //box["fillAlpha"] = 0.5;
                //}
                var curr:QuickObject = sim.addBox(box);
                doMarkBox(curr,angle);
                addJoint( pre.body, curr.body );
                pre = curr;
            }
            curr = first;
            addJoint(pre.body,curr.body,-pre.body.GetAngle()+curr.body.GetAngle());
        }
        
        private function doMarkBox(box:QuickObject, angle:Number):void 
        {
            var g:Graphics = Sprite(box.body.m_userData).graphics;
            g.beginFill(new ColorHSV(angle*180/Math.PI).value);
            g.drawRect( -2, -2, 4, 4);
            g.endFill();
        }
        
        
        private function addJoint(aArg:b2Body, bArg:b2Body,referenceAngleArg:Number=0):void 
        {
            var radius:Number = 1;
            var getAngle:Number = aArg.GetAngle()+Math.PI*0.5;
            var output:QuickObject = sim.addJoint( { a:aArg, b:bArg, type:QuickBox2D.REVOLUTE 
            ,lowerAngle: -2, upperAngle:2, enableLimit:true, referenceAngle:referenceAngleArg,
            vecA:new b2Vec2(
                aArg.GetPosition().x + segmentHeight * 0.5 * Math.cos(getAngle), 
                aArg.GetPosition().y + segmentHeight * 0.5 * Math.sin(getAngle)
                ),
                collideConnected:false
            } );
        }
        
         private function setBoxPosition(box:Object,cx:Number,cy:Number,r:Number,angle:Number):void 
        {
            if (ìsStartingAtX) 
            {
                box["angle"] = angle;
                box["x"] = cx + r * Math.cos(angle);
                box["y"] = cy + r * Math.sin(angle);
            }
            else
            {
                box["angle"] = angle+Math.PI*0.5;
                box["x"] = cx - r * Math.sin(angle);
                box["y"] = cy + r * Math.cos(angle);
            }
        }
        
       
        
    }

}