test fluid

by Wolfe
♥0 | Line 96 | Modified 2012-06-14 20:05:17 | MIT License
play

ActionScript3 source code

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

package {
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.display.BitmapData;
    import flash.display.Bitmap;
    import flash.geom.Matrix;
    import flash.filters.BlurFilter;
    import flash.filters.BitmapFilterQuality;
    import flash.geom.Point;
    import Box2D.Dynamics.*;
    import Box2D.Collision.*;
    import Box2D.Collision.Shapes.*;
    import Box2D.Common.Math.*;
    public class FlashTest extends Sprite {
        private var world:b2World=new b2World(new b2Vec2(0,5),true);
        private var worldScale:Number=30;
        private var waterBitmapData:BitmapData=new BitmapData(640,480,true,0x00000000);
        private var waterBitmap:Bitmap=new Bitmap(waterBitmapData);
        private var waterMatrix:Matrix=new Matrix();
        private var waterBlur:BlurFilter=new BlurFilter(15,15,flash.filters.BitmapFilterQuality.HIGH);
        public function FlashTest() {
            var realBg:RealBg=new RealBg();
            addChild(realBg);
            addChild(waterBitmap);
            var backgroundImage:BackgroundImage=new BackgroundImage();
            addChild(backgroundImage);
            var polygonShape:b2PolygonShape = new b2PolygonShape();
            var fixtureDef:b2FixtureDef = new b2FixtureDef();
            fixtureDef.restitution=0;
            fixtureDef.density=1;
            fixtureDef.friction=0.4;
            var bodyDef:b2BodyDef= new b2BodyDef();
            bodyDef.position.Set(320/worldScale,240/worldScale);
            var container:b2Body;
            container=world.CreateBody(bodyDef);
            polygonShape.SetAsOrientedBox(132/worldScale/2,12/worldScale/2,new b2Vec2(0/worldScale,144/worldScale),0);
            fixtureDef.shape=polygonShape;
            container.CreateFixture(fixtureDef);
            polygonShape.SetAsOrientedBox(12/worldScale/2,200/worldScale/2,new b2Vec2(-60/worldScale,0/worldScale),0);
            fixtureDef.shape=polygonShape;
            container.CreateFixture(fixtureDef);
            polygonShape.SetAsOrientedBox(12/worldScale/2,276/worldScale/2,new b2Vec2(60/worldScale,0/worldScale),0);
            fixtureDef.shape=polygonShape;
            container.CreateFixture(fixtureDef);
            addEventListener(Event.ENTER_FRAME,update);
        }
        private function addCircle(pX:Number,pY:Number,h:Number):void {
            var circleShape:b2CircleShape = new b2CircleShape(h/worldScale);
            var fixtureDef:b2FixtureDef = new b2FixtureDef();
            fixtureDef.density=3;
            fixtureDef.friction=0.4;
            fixtureDef.restitution=0;
            fixtureDef.shape=circleShape;
            var bodyDef:b2BodyDef = new b2BodyDef();
            bodyDef.type=b2Body.b2_dynamicBody;
            bodyDef.position.Set(pX/worldScale,pY/worldScale);
            bodyDef.userData=new WaterCircle();
            var box:b2Body=world.CreateBody(bodyDef);
            box.CreateFixture(fixtureDef);
        }
        private function debugDraw():void {
            var debugDraw:b2DebugDraw = new b2DebugDraw();
            var debugSprite:Sprite = new Sprite();
            addChild(debugSprite);
            debugDraw.SetSprite(debugSprite);
            debugDraw.SetDrawScale(worldScale);
            debugDraw.SetFlags(b2DebugDraw.e_shapeBit|b2DebugDraw.e_jointBit);
            debugDraw.SetFillAlpha(0.5);
            world.SetDebugDraw(debugDraw);
        }
        private function update(e:Event):void {
            var waterParticles:Number=0;
            waterBitmapData.fillRect(waterBitmapData.rect,0x00000000);
            world.Step(1/30,6,2);
            world.ClearForces();
            for (var b:b2Body = world.GetBodyList(); b; b = b.GetNext()) {
                if (b.GetUserData()!=null) {
                    waterParticles++;
                    if (b.GetPosition().y*worldScale>480) {
                        world.DestroyBody(b);
                    }
                    else {
                        waterMatrix.tx=b.GetPosition().x*worldScale;
                        waterMatrix.ty=b.GetPosition().y*worldScale;
                        waterBitmapData.draw(b.GetUserData(),waterMatrix);
                    }
                }
            }
            if (waterParticles<300) {
                addCircle(320+1-Math.random()*2,-10,5);
            }
            waterBitmapData.applyFilter(waterBitmapData,waterBitmapData.rect,new Point(0,0),waterBlur);
            waterBitmapData.threshold(waterBitmapData,waterBitmapData.rect,new Point(0,0),">",0X11444444,0x88FF00FF,0xFFFFFFFF, true);
        }
    }
}