In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

How to make a floating platform with Box2D?

I want to make a horizontal floating platform with Box2D,
but when the character stand on it, they don't move together.
2010-12-17 19:03:36
Get Adobe Flash player
by civet 08 Jan 2016
/**
 * Copyright civet ( http://wonderfl.net/user/civet )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/7Fgt
 */

//2010-12-17 19:03:36
package
{
    import Box2D.Collision.Shapes.b2FilterData;
    import Box2D.Collision.Shapes.b2Shape;
    import Box2D.Collision.Shapes.b2ShapeDef;
    import Box2D.Common.Math.b2Vec2;
    
    import com.actionsnippet.qbox.*;
    
    import flash.display.*;
    import flash.events.*;
    import flash.geom.Rectangle;
    
    public class FallDown extends MovieClip
    {
        private var key:int;
        
        private var sim:QuickBox2D;
        private var contact:QuickContacts;
        
        private var character:QuickObject;
        private var charVel:b2Vec2 = new b2Vec2();
        private var boxes:Array = [];
        private var filter:b2FilterData;
        private var oscTheta:Number = 0;
        
        
        public function FallDown()
        {
            stage.scaleMode = StageScaleMode.NO_SCALE;
            stage.align = StageAlign.TOP_LEFT;
            
            sim = new QuickBox2D(this);
            sim.grid(30, 0xcccccc, 1.0);
            
            // set some default colors and create stage walls
            sim.setDefault({fillColor:0x808080, fillAlpha:1, lineThickness:0, lineColor:0xffffff});
            //sim.createStageWalls();
            this.createStageWalls(sim);
            
            //CHARACTER
            character = sim.addBox({x:1, y:1, width:1, height:1, restitution:0, friction:1, fixedRotation:true, allowSleep:false, groupIndex:-1});
            
            //MAP
            boxes[0] = sim.addBox({x:2, y:10.5, width:4, height:1, density:0, restitution:0, friction:0, groupIndex:-1});
            boxes[1] = sim.addBox({x:6, y:12.5, width:4, height:1, density:0, restitution:1, friction:1, groupIndex:-1});
            boxes[2] = sim.addBox({x:10, y:10.5, width:4, height:1, density:1, restitution:0, friction:1, groupIndex:-1, isSleeping:true});
            boxes[3] = sim.addBox({x:15, y:8.5, width:4, height:1, density:0, restitution:0, friction:1, groupIndex:-1});
            
            //CONTACT
            contact = sim.addContactListener();
            contact.addEventListener(QuickContacts.ADD, onAdd);
            sim.addEventListener(QuickBox2D.STEP, onStep);
            
            stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
            stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp);
            //this.addEventListener(Event.ENTER_FRAME, onEnterFrame);
            
            //
            sim.start();
            //sim.mouseDrag();
        }
        
        private var jumping:Boolean;
        
        private function onStep(e:Event):void
        {    
            charVel = character.body.GetLinearVelocity();
            
            if(key & Key.LEFT) {
                //charVel.x -= 0.8;
                
                charVel.x = -5;
                character.body.SetLinearVelocity(charVel);
            }
            if(key & Key.RIGHT) {
                //charVel.x += 0.8;
                
                charVel.x = 5;
                character.body.SetLinearVelocity(charVel);
            }
            if(key & Key.UP) {
                
                if(!jumping) {
                    //charVel.y -= 0.8;
                    //character.body.SetLinearVelocity(charVel);
                    
                    charVel.y = -10;
                    character.body.SetLinearVelocity(charVel);
                    
                    jumping = true;
                }
            }
            if(key & Key.DOWN) {
                charVel.y += 0.8;
                character.body.SetLinearVelocity(charVel);
            }
            //
            if(charVel.y == 0) jumping = false;
            
            var num:int = boxes.length;
            for (var i:int = 0; i<num; i++){
                var rect:Rectangle = character.userData.getRect(this);
                if (rect.bottom / 30 < boxes[i].y){
                    filter = boxes[i].shape.GetFilterData();
                    filter.groupIndex = 1;
                    boxes[i].shape.SetFilterData(filter);
                }else{
                    filter = boxes[i].shape.GetFilterData();
                    if (filter.groupIndex != -1){
                        filter.groupIndex = -1;
                        boxes[i].shape.SetFilterData(filter);
                    }
                }                
            }            
            
                        
            boxes[3].x = 15 + Math.cos(oscTheta * Math.PI/180);
            
            //ugly imple
            //boxes[3].body.GetLinearVelocity().x = -Math.sin(oscTheta * Math.PI/180);            
            
            oscTheta += 1;
        }
        
        
        private function onAdd(e:Event):void
        {
            if(contact.inCurrentContact(boxes[2])) {
                jumping = false;
            }
            else if(contact.inCurrentContact(boxes[0])) {
                charVel = character.body.GetLinearVelocity();
                charVel.x = 5;
            }
        }
                
        //---Event Handlers---
        
        private function onEnterFrame(e:Event):void
        {
            
        }
        
        private function onKeyDown(e:KeyboardEvent):void
        {
            var code:int = e.keyCode;
            if (code == 37) key |= Key.LEFT;
            else if (code == 39) key |= Key.RIGHT;
            else if (code == 38) key |= Key.UP;
            else if (code == 40) key |= Key.DOWN;
        }
        
        private function onKeyUp(e:KeyboardEvent):void
        {
            var code:int = e.keyCode;
            if (code == 37) key &= ~Key.LEFT;
            else if (code == 39) key &= ~Key.RIGHT;
            else if (code == 38) key &= ~Key.UP;
            else if (code == 40) key &= ~Key.DOWN;
        }
        
        //--------
        
        public function createStageWalls(s:QuickBox2D, params:Object=null):void
        {
            var sw:Number = stage.stageWidth / 30;
            var sh:Number = stage.stageHeight / 30;
            
            var p:Object = {
                lineThickness: 0.0,
                lineColor: 0x0,
                lineAlpha: 1.0,
                fillColor: 0x0,
                fillAlpha: 1.0
            };
            
            if(params != null) {
                for (var key:String in params) {
                    p[key] = params[key];
                }
            }
            
            s.addBox({x:sw / 2, y:sh +0.5, width:sw + 2, height:1, friction:1, density:.0, restitution:0, lineThickness:p.lineThickness, lineColor: p.lineColor, lineAlpha: p.lineAlpha, fillColor: p.fillColor, fillAlpha: p.fillAlpha});
            s.addBox({x:sw / 2, y:0 -0.5, width:sw + 2, height:1, friction:0, density:.0, restitution:0, lineThickness:p.lineThickness,lineColor: p.lineColor, lineAlpha: p.lineAlpha, fillColor: p.fillColor, fillAlpha: p.fillAlpha});
            s.addBox({x:0 -0.5, y:sh / 2, width:1, height:sh, friction:0, density:.0, restitution:0, lineThickness:p.lineThickness,lineColor: p.lineColor, lineAlpha: p.lineAlpha, fillColor: p.fillColor, fillAlpha: p.fillAlpha});
            s.addBox({x:sw +0.5, y:sh / 2, width:1, height:sh, friction:0, density:.0, restitution:0, lineThickness:p.lineThickness,lineColor: p.lineColor, lineAlpha: p.lineAlpha, fillColor: p.fillColor, fillAlpha: p.fillAlpha});
        }
    }
}


class Key
{
    public static const LEFT:int = 1;
    public static const UP:int = 2;
    public static const RIGHT:int = 4;
    public static const DOWN:int = 8;
    
    public function Key()
    {
    }
}