Beautifl - Flash Gallery

Preview

おくれてきたおのまとぺ
minon 2009年9月26日 MIT License
?
ソース適当すぎるので見ないでぇぇ
      //ソース適当すぎるので見ないでぇぇ
package{
    
    import Box2D.Dynamics.Contacts.*;
    import flash.display.*;
    import flash.events.*;
    import flash.net.URLRequest;
    import flash.utils.Timer;
    import Box2D.Dynamics.*;
    import Box2D.Collision.*;
    import Box2D.Collision.Shapes.*;
    import Box2D.Common.Math.*;
    import net.hires.debug.Stats;
    import flash.system.Security;

    [SWF(width = "465", height = "465", frameRate = "60", backgroundColor = "0xFFFFFF")]
    
    public class Onomatopoeia extends Sprite{
        
        public static var DRAW_SCALE:int = 30;
        
        public var m_iterations:int = 10;
        public var m_timeStep:Number = 1.0 / 30.0;
        
        private var _world:b2World;
        private var _oLayer:Sprite = new Sprite();
        private var _eLayer:Sprite = new Sprite();
        private var _wLayer:Sprite = new Sprite();
        
        private var _loader:Loader = new Loader();
        
        public function Onomatopoeia(){
                        Wonderfl.capture_delay( 20 );
            Security.loadPolicyFile("http://labs.minomix.net/crossdomain.xml");  
            _loader.contentLoaderInfo.addEventListener(Event.INIT, _loadInitHandler );
            //_loader.load( new URLRequest("../material/gion2.png") );
            _loader.load( new URLRequest("http://labs.minomix.net/img/gion.png") );
            
        }
        
        private function _loadInitHandler(e:Event):void {
            
            var tmp:BitmapData = new BitmapData( _loader.width, _loader.height, true, 0 );
            tmp.draw( _loader );
            
            CreateEffect.init( tmp );
            _init();
            
        }
        
        private function _init():void {
            
            this.addChild( _wLayer );
            this.addChild( _oLayer );
            this.addChild( _eLayer );
            _oLayer.visible = false;
            _wLayer.visible = false;
            
            // Add event for main loop
            addEventListener(Event.ENTER_FRAME, Update, false, 0, true);
            
            // Creat world AABB
            var worldAABB:b2AABB = new b2AABB();
            worldAABB.lowerBound.Set(-100, -100);
            worldAABB.upperBound.Set(465+100, 465+100);
            
            // Define the gravity vector
            var gravity:b2Vec2 = new b2Vec2(0.0, 10.0);
            
            // Allow bodies to sleep
            var doSleep:Boolean = true;
            
            // Construct a world object
            _world = new b2World(worldAABB, gravity, doSleep);
            
            _createWall( 0, 465 / 2, 50, 465, 0 );
            _createWall( 465, 465 / 2, 50, 465, 0 );
            _createWall( 465 / 2, 120, 300, 10, 0 );
            _createWall( 465 / 2 + 70, 210, 465, 10, -8 );
            _createWall( 465 / 2 - 70, 330, 465, 10, 5 );
            _createWall( 465 / 2 + 70, 440, 465, 10, -5 );
            
            //衝突判定のリスナをセットする
            _world.SetContactListener( new ContactListener( _eLayer ) );
            
            var t:Timer = new Timer( 1000 );
            t.addEventListener( TimerEvent.TIMER, _createBody );
            t.start();
            
            //debug();
            
            stage.addEventListener(MouseEvent.CLICK, _clickHandler );
            
        }
        
        private function _clickHandler(e:Event):void {
            _oLayer.visible = !_oLayer.visible;
            _wLayer.visible = !_wLayer.visible;
        }
        
        private function _createWall( x:int, y:int, w:int, h:int, r:int ):void {
            
            // Vars used to create bodies
            var body:b2Body;
            var bodyDef:b2BodyDef;
            var boxDef:b2PolygonDef;
            
            // Add ground body
            bodyDef = new b2BodyDef();
            
            bodyDef.position.Set(x / DRAW_SCALE, y / DRAW_SCALE);
            bodyDef.angle = r / (180 / Math.PI);
            
            boxDef = new b2PolygonDef();
            boxDef.SetAsBox(w / 2 / DRAW_SCALE, h / 2 / DRAW_SCALE);
            
            boxDef.friction = 0.3;
            boxDef.density = 0; // static bodies require zero density
            
            // Add sprite to body userData
            bodyDef.userData = new PhysBox();
            bodyDef.userData.width = w;
            bodyDef.userData.height = h; 
            bodyDef.userData.x = x;
            bodyDef.userData.y = y;
            bodyDef.userData.rotation = r;
            _wLayer.addChild(bodyDef.userData);
            body = _world.CreateBody(bodyDef);
            body.CreateShape(boxDef);
            
            body.SetMassFromShapes();
            
        }
        
        private function _createBody( e:TimerEvent ):void {
            
            var bodyDef:b2BodyDef;
            var circleDef:b2CircleDef;
            var body:b2Body;
            
            bodyDef = new b2BodyDef();
            bodyDef.position.x = ( Math.random() * 265 + 100 ) / 30 ;
            bodyDef.position.y = 0;
            var rX:Number = Math.random()/4 + 0.3;
            var rY:Number = Math.random()/4 + 0.3;
            
            // Circle
            circleDef = new b2CircleDef();
            circleDef.radius = rX;
            circleDef.density = 1.0;
            circleDef.friction = 0.4;
            circleDef.restitution = 0.5
            
            bodyDef.userData = new PhysCircle();
            bodyDef.userData.width = rX * 2 * DRAW_SCALE;
            bodyDef.userData.height = rX * 2 * DRAW_SCALE;
            
            body = _world.CreateBody(bodyDef);
            body.CreateShape(circleDef);
            
            body.SetMassFromShapes();
            _oLayer.addChild(bodyDef.userData);
            
        }
        
        public function debug():void {
            
            // set debug draw
            var dbgDraw:b2DebugDraw = new b2DebugDraw();
            var dbgSprite:Sprite = new Sprite();
            addChild(dbgSprite);
            dbgDraw.m_sprite = dbgSprite;
            dbgDraw.m_drawScale = 30.0;
            dbgDraw.m_fillAlpha = 0.0;
            dbgDraw.m_lineThickness = 0;
            dbgDraw.m_drawFlags = 0xFFFFFFFF;
            _world.SetDebugDraw(dbgDraw);
            
        }
        
        
        public function Update(e:Event):void{
            
            _world.Step(m_timeStep, m_iterations);
            
            
            //表示周りの更新
            for (var bb:b2Body = _world.m_bodyList; bb; bb = bb.m_next) {
                
                //画面外に出たときの判定
                var bx:Number = bb.GetPosition().x * DRAW_SCALE;
                var by:Number = bb.GetPosition().y * DRAW_SCALE;
                if ( bx < -100 || bx > 465+100 || by < -100 ) {
                    _oLayer.removeChild( bb.GetUserData() );
                    _world.DestroyBody( bb );
                    break;
                }
                
                if (bb.m_userData is Sprite){
                    bb.m_userData.x = bb.GetPosition().x * DRAW_SCALE;
                    bb.m_userData.y = bb.GetPosition().y * DRAW_SCALE;
                    bb.m_userData.rotation = bb.GetAngle() * (180 / Math.PI);
                }
                
            }
            
        }
        
    }
    
}

import Box2D.Collision.b2ContactPoint;
import Box2D.Collision.Shapes.b2Shape;
import Box2D.Dynamics.b2ContactListener;
import flash.display.*;
import flash.geom.*;
import flash.text.*;
import org.libspark.betweenas3.BetweenAS3;
import org.libspark.betweenas3.easing.Quad;
import org.libspark.betweenas3.events.TweenEvent;
import org.libspark.betweenas3.tweens.ITween;

class PhysBox extends Sprite {
    
    public var count:int = 0;
    
    public function PhysBox() {
        this.graphics.beginFill( 0x999999 );
        this.graphics.drawRect( -50, -50, 100, 100 );
        this.graphics.endFill();
    }
}

class PhysCircle extends Sprite {
    
    public var count:int = 0;
    
    public function PhysCircle() {
        this.graphics.beginFill( 0x999999 );
        this.graphics.drawCircle(0, 0, 100 );
        this.graphics.endFill();
    }
}

class CreateEffect extends Sprite {
    
    public static var _images:Vector.<BitmapData> = new Vector.<BitmapData>;
    
    public static function init( b:BitmapData ):void {
        
        for ( var i:int = 0 ; i < 5 ; i++ ) {
            
            var img:BitmapData = new BitmapData(120, 120, true, 0x0 );
            img.copyPixels( b, new Rectangle( 120*i, 0, 120, 120 ), new Point( 0, 0 ), null, null, true );
            
            _images.push( img );
            
        }
        
    }
    
    public function CreateEffect( px:Number, py:Number, f:Number ) {
        
        var b:Bitmap;
        if ( f > 7.5 )        b = Bitmap( addChild( new Bitmap( _images[0] ) ) );
        else if ( f > 6 )    b = Bitmap( addChild( new Bitmap( _images[1] ) ) );
        else if ( f > 3 )    b = Bitmap( addChild( new Bitmap( _images[2] ) ) );
        else if ( f > 0 )    b = Bitmap( addChild( new Bitmap( _images[3] ) ) );
        else                { b = Bitmap( addChild( new Bitmap( _images[4] ) ) ); f = 3; }
        
        this.x = px
        b.x = -b.width/2;
        this.y = py
        b.y = -b.height/2;
        this.rotation = Math.random() * 90 - 45;
        
        var bt:ITween = BetweenAS3.tween( this, { alpha:0, scaleX:0.5, scaleY:0.5 }, null, 0.4, Quad.easeIn );
        bt.addEventListener( TweenEvent.COMPLETE, _complete );
        bt.play();
        
    }
    
    private function _complete(e:TweenEvent):void {
        this.parent.removeChild( this );
    }
    
}

class ContactListener extends b2ContactListener {
    
    private var _root:Sprite;
    
    public function ContactListener( root:Sprite ) {
        _root = root;
    }
    
    public override function Add(point:b2ContactPoint):void {
        
        var f:Number = point.shape1.GetBody().m_linearVelocity.Length() + point.shape2.GetBody().m_linearVelocity.Length();
        
        //trace("ガン!", f/*, point.position.x, point.position.y*/ );
        if ( f > 3 ) {
            _root.addChild( new CreateEffect( point.position.x * Onomatopoeia.DRAW_SCALE, point.position.y * Onomatopoeia.DRAW_SCALE, f ) );
        }
        
    }
    
    public override function Persist( point:b2ContactPoint ):void {
        
        var shape:b2Shape;
        
        if ( point.shape1.m_density == 0 && point.shape2.m_density == 1 ) shape = point.shape2;
        else if ( point.shape1.m_density == 1 && point.shape2.m_density == 0 ) shape = point.shape1;
        else return;
        
        shape.GetBody().GetUserData().count += Math.ceil( shape.GetBody().m_linearVelocity.Length() );
        
        if ( shape.GetBody().GetUserData().count > 0 ) {
            _root.addChild( new CreateEffect( point.position.x * Onomatopoeia.DRAW_SCALE, point.position.y * Onomatopoeia.DRAW_SCALE, -1 ) );
            shape.GetBody().GetUserData().count = -20;
        }
        
    }
    
    public override function Remove(point:b2ContactPoint):void {
        
        point.shape1.GetBody().m_userData.count = -5;
        point.shape2.GetBody().m_userData.count = -5;
        
    }
    
}