forked from: forked from: SoundBall

by ohisama forked from forked from: SoundBall (diff: 62)
参考:
 QuickBox2D はじめの第一歩            http://blog.alumican.net/2009/06/28_021753
 QuickBox2D オブジェクトの平行移動と回転    http://blog.alumican.net/2009/07/06_014321
flash on 2010-3-15                 http://wonderfl.net/c/uMNq
 おくれてきたおのまとぺ                    http://wonderfl.net/c/1a5I
Puppyish Pentatonicism            http://wonderfl.net/c/toV4
♥0 | Line 141 | Modified 2013-03-04 08:36:14 | 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/a4Jw
 */

// forked from fukt's forked from: SoundBall
// forked from osamX's SoundBall
// forked from gaina's soundtest6
/**
 * 参考:
 *  QuickBox2D はじめの第一歩            http://blog.alumican.net/2009/06/28_021753
 *  QuickBox2D オブジェクトの平行移動と回転    http://blog.alumican.net/2009/07/06_014321
 *  flash on 2010-3-15                 http://wonderfl.net/c/uMNq
 *  おくれてきたおのまとぺ                    http://wonderfl.net/c/1a5I
 *  Puppyish Pentatonicism            http://wonderfl.net/c/toV4
 */
package 
{
    import flash.display.MovieClip;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.media.Sound;
    import flash.media.SoundChannel;
    import flash.media.SoundLoaderContext;
    import flash.media.SoundMixer;
    import flash.net.URLRequest;
    import flash.utils.ByteArray;    
    import com.actionsnippet.qbox.*;    
    public class Main extends Sprite 
    {
        private static const SIZE : int = 465;
        private static const QBSIZE : Number = SIZE / 30;
        private static const PATH : String = "http://www.takasumi-nagai.com/soundfiles/sound001.mp3";
        private static const CH : uint = 256;
        private static const BALL : uint = 6;
        private var _snd : Sound;
        private var _sndCh : SoundChannel;
        private var _ba : ByteArray;
        private var _leftBallArr : Array = [], _rightBallArr : Array = [];
        private var _leftBoxArr : Array = [],  _rightBoxArr : Array = [];
        public function Main() : void 
        {
            Wonderfl.capture_delay(3);
            graphics.beginFill(0xEEEEEE);
            graphics.drawRect(0, 0, SIZE, SIZE);
            graphics.endFill();
            _initSound();
        }
        private function _initSound() : void 
        {
            _snd = new Sound();
            _snd.addEventListener(Event.COMPLETE, function(e : Event) : void 
            {
                _snd.removeEventListener(Event.COMPLETE, arguments.callee);
                _sndCh = _snd.play(0, 5);
                addEventListener(Event.ENTER_FRAME, _onEnterFrame);
                _initQBox2D(true, _leftBallArr, _leftBoxArr);
                _initQBox2D(false, _rightBallArr, _rightBoxArr);            }, false, 0, true);
            _snd.load(new URLRequest(PATH), new SoundLoaderContext(10, true));
            _ba = new ByteArray();
        }
        private function _initQBox2D(lr : Boolean, ballArr : Array, boxArr : Array) : void 
        {
            var mc : MovieClip = new MovieClip();
            var sp : Sprite = new Sprite();
            sp.graphics.beginFill(0x0);
            var lt : Number = lr ? 0 : SIZE / 2;
            sp.graphics.drawRect(lt, 0, SIZE/2, SIZE);
            sp.graphics.endFill();
            mc.mask = sp
            addChild(mc);
            var g : Number = lr ? 9.8 : -9.8;
            var sim : QuickBox2D = new QuickBox2D(mc, {gravityX : g, gravityY : 0});
            var xx : Number = lr ? 0 : QBSIZE;
            for (var j : int = 0; j < BALL; j++ ) ballArr[j] = sim.addCircle({x : xx , y : Math.random() * QBSIZE, radius : 1.3, density : 5, restitution : 0.5, lineAlpha : 1, lineColor : 0x3370FF, lineThickness : 20, fillColor : 0xFFFFFF}) as QuickObject;
            for (var i : int = 0; i < 8; i++) boxArr[i] = sim.addBox({x : 0, y : i * 2.21, width : 16, height : 2, angle : 0, density : 0, fillColor : 0xFFFFFF, lineAlpha : 0}) as QuickObject;
            var con : QuickContacts = sim.addContactListener();
            con.addEventListener(QuickContacts.ADD, function(e : Event) : void 
            {
                for (var k : int = 0; k < BALL; k++) 
                {
                    var ball : QuickObject = ballArr[k];
                    if (con.inCurrentContact(ball)) 
                    {
                        var v : Number = con.currentPoint.velocity.LengthSquared();
                        if (v > 3) addChild(new PlusEffect(con.currentPoint.position.x * 30, con.currentPoint.position.y * 30, v / 100));
                    }
                }
            });
            sim.start();
        }
        private function _onEnterFrame(e : Event) : void 
        {
            SoundMixer.computeSpectrum(_ba, true, 32);
            for (var side : int = 0; side < 2; side++) 
            {
                for (var i : int = 0; i < CH; i++) 
                {
                    var p : Number = _ba.readFloat();
                    if (i % 32 == 0) 
                    {
                        if (side == 0)
                        {
                            _leftBoxArr[(i / 32) >> 0].x = -p * 5 + 8 + QBSIZE / 2;
                        }
                        else 
                        {
                            _rightBoxArr[(i / 32) >> 0].x = p * 5 - 8 + QBSIZE / 2;
                        }
                    }
                }
            }
            for (i = 0; i < BALL; i++) 
            {
                _leftBallArr[i].y = _calcY( _leftBallArr[i].y, 1.3, QBSIZE); 
                if (_leftBallArr[i].x > QBSIZE / 2) _leftBallArr[i].x = 0;
                _rightBallArr[i].y = _calcY( _rightBallArr[i].y, 1.3, QBSIZE); 
                if (_rightBallArr[i].x < QBSIZE / 2) _rightBallArr[i].x = QBSIZE;
            }
        }
        private function _calcY(y : Number, r : Number, w : Number) : Number 
        {
            if (y < -r) return r + w;
            if (y > r + w) return -r;
            return y;
        }
    }
}
import flash.display.Graphics;
import flash.display.Sprite;
import org.libspark.betweenas3.BetweenAS3;
import org.libspark.betweenas3.events.TweenEvent;
import org.libspark.betweenas3.tweens.ITween;

class PlusEffect extends Sprite 
{
    private const W : Number = 30;
    private const H : Number = 90;
    public function PlusEffect(xx : Number, yy : Number , scale : Number = 1) 
    {
        this.x = xx;
        this.y = yy;
        var hh : Number = H * scale, g : Graphics = this.graphics;
        g.lineStyle(W * scale, 0xFFFF33, 1, false, "normal",    "none");
        graphics.drawPath(Vector.<int>([1, 2, 1, 2]), Vector.<Number>([0, -hh / 2, 0, hh / 2, -hh / 2 , 0, hh / 2 , 0]));
        var it : ITween = BetweenAS3.tween(this, {scaleX : 0.5, scaleY : 0.5, alpha : 0}, null, 1);
        it.addEventListener(TweenEvent.COMPLETE, _complete );
        it.play();
    }    
    private function _abs(num : Number) : Number 
    {
        return (num ^ (num >> 31)) - (num >> 31)
    }    
    private function _complete(e : TweenEvent) : void 
    {
        this.parent.removeChild(this);
    }
}