flash on 2013-2-25

by ohisama
http://triple-c.sakura.ne.jp/hatena_dl/each_hatena_show.php?id=182830
♥0 | Line 228 | Modified 2013-02-25 19:38:23 | MIT License
play

ActionScript3 source code

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

//http://triple-c.sakura.ne.jp/hatena_dl/each_hatena_show.php?id=182830
package
{
    import Box2D.Collision.*;
    import Box2D.Common.Math.*;
    import Box2D.Dynamics.*;
    import Box2D.Collision.Shapes.*;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    [SWF(width = "465", height = "465", frameRate = "30", backgroundColor = "0x0")]
    public class Main extends Sprite
    {
        private var iterations:int = 10;
        private var timeStep:Number = 1.0 / 30.0;
        private var world:b2World;
        private const SCALE:Number = 100;
        private var degree:Number = 0;
        private var player:Player;
        private var colorNUM:int = 0;
        public function Main()
        { 
            player = new Player();
            addChild(player);
            init();
            world.SetContactListener(new ContactListener());
            stage.addEventListener(MouseEvent.CLICK, onMouseClick);
            addEventListener(Event.ENTER_FRAME, onEnterFrame);
        }
        private function init():void
        {
            var worldAABB:b2AABB = new b2AABB();
            worldAABB.lowerBound.Set(-100.0, -100.0);
            worldAABB.upperBound.Set(100.0, 100.0);
            var gravity:b2Vec2 = new b2Vec2(0.0, 1);
            var doSleep:Boolean = true;
            world = new b2World(worldAABB, gravity, doSleep);
            createPolygon(0, 0, 465, 1, 0, "Wall");
            createPolygon(0, 464, 465, 1, 0, "Wall");
            createPolygon(0, 0, 1, 465, 0, "Wall");
            createPolygon(465, 0, 1, 465, 0, "Wall");
        }
        private function onMouseClick(event:Event = null):void
        {    
            var radius:int = (Math.random() >= 0.5) ? 20 : 40;
            createCircle(mouseX, mouseY, radius, String(colorNUM), colorNUM, true, 1.0, 0.3);
            colorNUM++;
            colorNUM %= Color.COLORS.length;
            player.draw(Color.COLORS[colorNUM][0]);
        }
        private function createCircle(posX:Number, posY:Number, radius:Number, name:String = "", color:int = 0, setMass:Boolean = false, density:Number = 0.0, restitution:Number = 0.0):void
        {
            var bodydef:b2BodyDef = new b2BodyDef();
            bodydef.position.Set(posX / SCALE, posY / SCALE);
            var shape:b2CircleDef = new b2CircleDef();
            shape.radius = radius / SCALE;
            shape.density = density;
            shape.restitution = restitution;
            bodydef.userData = new Data(color, radius);
            bodydef.userData.name = name;
            var body:b2Body = world.CreateBody(bodydef);
            body.CreateShape(shape);
            body.SetLinearVelocity(new b2Vec2(Math.cos(degree * Math.PI / 180) * 800 / SCALE, Math.sin(degree * Math.PI / 180) * 800 / SCALE));
            if (setMass) body.SetMassFromShapes();
            addChild(body.GetUserData());
        }
        private function createPolygon(posX:Number, posY:Number, hx:Number, hy:Number, degree:Number, name:String = "", setMass:Boolean = false, density:Number = 0.0, restitution:Number = 0.0):void
        {
            var blockBodyDef:b2BodyDef = new b2BodyDef();
            blockBodyDef.position.Set(posX / SCALE, posY / SCALE);
            blockBodyDef.angle = degree * Math.PI / 180;
            blockBodyDef.userData = new Data(0);
            blockBodyDef.userData.name = name;
            var blockShape:b2PolygonDef = new b2PolygonDef();
            blockShape.SetAsBox(hx / SCALE, hy / SCALE);
            blockShape.density = density;
            var blockBody:b2Body = world.CreateBody(blockBodyDef);
            blockBody.CreateShape(blockShape);
            if (setMass) blockBody.SetMassFromShapes();
        }
        private function onEnterFrame(event:Event):void
        {
            degree += 2;
            player.x = mouseX;
            player.y = mouseY;
            player.rotation = degree;
            for (var body:b2Body = world.GetBodyList(); body; body = body.m_next)
            {
                var canvas:Sprite = body.GetUserData() as Sprite;
                if (canvas)
                {
                    canvas.x = body.GetWorldCenter().x * SCALE;
                    canvas.y = body.GetWorldCenter().y * SCALE;
                    canvas.rotation = body.GetAngle() * Math.PI / 180;
                }
                if (body.m_userData)
                {
                    if (body.m_userData.name == "delete")
                    {    
                        addChild(new Effect(body.GetUserData()));
                        world.DestroyBody(body);
                    }
                }
            }
            world.Step(timeStep, iterations);
        }
    }
}
import flash.display.Sprite;
import flash.display.Graphics;
import Box2D.Dynamics.b2ContactListener;
import Box2D.Collision.b2ContactPoint;
import flash.geom.Matrix;
import flash.text.TextField;
import flash.text.TextFormat;
import flash.text.TextFieldAutoSize;
import org.libspark.betweenas3.BetweenAS3;
class Color
{
    public static var COLORS:Array = 
    [
        [0xffef98, 0xffcc01],
        [0xf26b53, 0xef4123],
        [0x00d27e, 0x00B16B],
        [0x09bbff, 0x009AD6],
        /*[0xfacfde, 0xF6ADC6],
        [0xffae28, 0xf39800],
        [0xb672b6, 0xA757A8],
        [0x5993d2, 0x3170b9],
        [0xf25773, 0xED1A3D]*/
    ]
}
class Player extends Sprite
{
    public function Player()
    {
        draw(Color.COLORS[0][0]);
    }
    public function draw(color:int):void
    {
        graphics.lineStyle(3.0, color);
        graphics.moveTo(90, -10);
        graphics.lineTo(70, 10);
        graphics.moveTo(90, 10);
        graphics.lineTo(70, -10);
    }
}
class ContactListener extends b2ContactListener
{
    public override function Add(point:b2ContactPoint):void
    {
        var shape1:Sprite = point.shape1.GetBody().m_userData;
        var shape2:Sprite = point.shape2.GetBody().m_userData;
        if (shape1.name == "Wall" || shape2.name == "Wall") return;
        if (shape1.name == shape2.name) shape1.name = shape2.name = "delete";
    }
}
class Data extends Sprite
{    
    public var colorNUM:int;
    public var radius:Number;
    public function Data(colorNUM:int, radius:Number = 0):void
    {
        this.colorNUM = colorNUM;
        this.radius = radius;
        var matrix:Matrix = new Matrix();
        matrix.createGradientBox(radius * 2, radius * 2, 45 * Math.PI / 180, -radius / 2, -radius / 2);
        graphics.beginGradientFill("linear", Color.COLORS[colorNUM], [1.0, 1.0], [0, 255], matrix);
        graphics.drawCircle(0, 0, radius);
        graphics.endFill();
    }
}
class Effect extends Sprite
{
    private var data:Data;
    public function Effect(data:Data)
    {
        for (var degree:Number = 0; degree < 360; degree += 360 / 6)
        {
            var star:Star = new Star(Color.COLORS[data.colorNUM][0]);
            star.x = data.x;
            star.y = data.y;
            addChild(star);
            BetweenAS3.serial
            (
                BetweenAS3.tween(star, { alpha:0.0, x:star.x + Math.cos(degree * Math.PI / 180) * 30, y:star.y + Math.sin(degree * Math.PI / 180) * 30 }, 0.5),
                BetweenAS3.removeFromParent(star)
            ).play();
        }
        var tf:TextField = createTextField("+" + data.radius, data.radius * 0.8, Color.COLORS[data.colorNUM][0]);
        tf.x = data.x;
        tf.y = data.y;
        BetweenAS3.serial
        (
            BetweenAS3.parallel
            (
                BetweenAS3.tween(tf, {y:data.y - 20}),
                BetweenAS3.tween(data, { alpha:0.0 }, null, 0.3)
            ),
            BetweenAS3.removeFromParent(data),
            BetweenAS3.removeFromParent(tf)
        ).play();
    }
    private function createTextField(text:String, size:int, color:int):TextField
    {
        var tf:TextField = new TextField();
        tf.defaultTextFormat = new TextFormat("Courier New", size, color, true);
        tf.text = text;
        tf.autoSize = TextFieldAutoSize.CENTER;
        tf.selectable = false;
        addChild(tf);
        return tf;
    }
}
class Star extends Sprite
{
    public function Star(color:int)
    {    
        const pi:Number = 0.017453;
        var g:Graphics = this.graphics;
        for (var degree:int = 0; degree < 360; degree += 72)
        {
            var rot:Number = degree;
            g.beginFill(color);
            g.moveTo(0,0 );
            g.lineTo( Math.cos( (rot + 36) *pi) * 10 , Math.sin( (rot +36) *pi) * 10 );
            g.lineTo(Math.cos( rot *pi) * 22.85, Math.sin( rot *pi) * 22.85);
            g.lineTo( Math.cos( (rot -36) *pi) * 10 ,Math.sin( (rot -36) *pi) * 10 );
            g.lineTo(0,0 );
            g.endFill();
           this.scaleX = this.scaleY = 0.3;
        }
    }
}