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

SoundManager (2)

Get Adobe Flash player
by ProjectNya 08 Oct 2010
/**
 * Copyright ProjectNya ( http://wonderfl.net/user/ProjectNya )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/iWE3
 */

// forked from Event's Instrument

////////////////////////////////////////////////////////////////////////////////
// SoundManager (2)
////////////////////////////////////////////////////////////////////////////////

package {

    import flash.display.Sprite;
    import flash.display.Shape;
    import flash.events.Event;
    import flash.utils.Timer;
    import flash.events.TimerEvent;

    /*
     *  ※お題のプログラムで使用している音源の、当イベント以外での使用を禁じます。
     * それ以外の音源の使用は自由ですので、他に使用した音源がありましたら、権利をご確認の上各自ご用意下さい。
     * なお、当イベントでは、音源のアップロード場所として、こえ部( http://koebu.com/ )のご利用を推奨いたします。
     * * mp3 files used in the code are not allowed to use outside wonderfl.net/jsdo.it
     * You're free to use your own sound source for JAM, if you have rights to use it.
     * We recommend soundcloud.com to upload music.
     * http://assets.wonderfl.net/sounds/event/jam/drop1.mp3
     * http://assets.wonderfl.net/sounds/event/jam/drop2.mp3
     * http://assets.wonderfl.net/sounds/event/jam/drop3.mp3
     * http://assets.wonderfl.net/sounds/event/jam/drop4.mp3
     * http://assets.wonderfl.net/sounds/event/jam/drop5.mp3
     * http://assets.wonderfl.net/sounds/event/jam/drop6.mp3
     * http://assets.wonderfl.net/sounds/event/jam/drop7.mp3
     * http://assets.wonderfl.net/sounds/event/jam/drop9.mp3
     * http://assets.wonderfl.net/sounds/event/jam/drop9.mp3
     * http://assets.wonderfl.net/sounds/event/jam/drop10.mp3
     */

    [SWF(backgroundColor="#000000", width="465", height="465", frameRate="30")]

    public class Main extends Sprite {
        private var manager:SoundManager;
        private static var max:uint = 10;
        private var sources:Array;
        private var completed:uint = 0;
        private var menus:Array;

        public function Main() {
            //Wonderfl.capture_delay(1);
            init();
        }

        private function init():void {
            graphics.beginFill(0x000000);
            graphics.drawRect(0, 0, 465, 465);
            graphics.endFill();
            //
            manager = new SoundManager();
            sources = new Array();
            menus = new Array();
            for (var n:uint = 0; n < max; n++) {
                sources.push("http://assets.wonderfl.net/sounds/event/jam/drop" + (n + 1) + ".mp3");
                var menu:ActionBtn = new ActionBtn();
                menu.x = 52 + 90*(n%5);
                menu.y = 186 + 92*uint(n/5);
                addChild(menu);
                var name:String = "sound"+(n+1)
                menu.init({id: n, label: name});
                menu.enabled = false;
                menus.push(menu);
            }
            load();
        }
        private function load():void {
            manager.addEventListener(Event.COMPLETE, complete, false, 0, true);
            for (var n:uint = 0; n < max; n++) {
                manager.load(sources[n], "snd" + n);
            }
        }
        private function complete(evt:Event):void {
            completed ++;
            if (completed > max - 1) {
                evt.target.removeEventListener(Event.COMPLETE, complete);
                setup();
            }
        }
        private function setup():void {
            for (var n:uint = 0; n < max; n++) {
                var menu:ActionBtn = menus[n];
                menu.enabled = true;
            }
            play(0);
            var interval:uint = uint(Math.random()*300) + 300;
            var timer:Timer = new Timer(interval, 1);
            timer.addEventListener(TimerEvent.TIMER_COMPLETE, update, false, 0, true);
            timer.start();
        }
        private function update(evt:TimerEvent):void {
            evt.target.removeEventListener(TimerEvent.TIMER_COMPLETE, update);
            //var id:uint = evt.target.currentCount%max;
            var id:uint = uint(Math.random()*max);
            play(id);
            var interval:uint = uint(Math.random()*300) + 300;
            var timer:Timer = new Timer(interval, 1);
            timer.addEventListener(TimerEvent.TIMER_COMPLETE, update, false, 0, true);
            timer.start();
        }
        private function play(id:uint):void {
            manager.play("snd" + id);
            for (var n:uint = 0; n < menus.length; n++) {
                var menu:ActionBtn = menus[n];
                if (n == id) {
                    menu.selected = true;
                } else {
                    menu.selected = false;
                }
            }
        }

    }

}


//////////////////////////////////////////////////
// SoundManagerクラス
//////////////////////////////////////////////////

import flash.events.EventDispatcher;
import flash.events.Event;

class SoundManager extends EventDispatcher {
    private var sounds:Object;
    private var levels:Object;

    public function SoundManager() {
        init();
    }

    private function init():void {
        sounds = new Object();
        levels = new Object();
    }
    public function load(file:String, id:String, level:Number = 1):void {
        var se:SoundEffect = new SoundEffect();
        se.addEventListener(Event.COMPLETE, complete, false, 0, true);
        se.load(file, id);
        sounds[id] = se;
        levels[id] = level;
    }
    public function play(id:String):void {
        var se:SoundEffect = sounds[id];
        var volume:Number = levels[id];
        se.play(id, volume);
    }
    private function complete(evt:Event):void {
        dispatchEvent(new Event(Event.COMPLETE));
    }

}


//////////////////////////////////////////////////
// SoundEffectクラス
//////////////////////////////////////////////////

import flash.events.EventDispatcher;
import flash.events.Event;
import flash.events.ProgressEvent;
import flash.media.Sound;
import flash.media.SoundChannel;
import flash.media.SoundTransform;
import flash.events.ProgressEvent;
import flash.net.URLRequest;

class SoundEffect extends EventDispatcher {
    private static var soundList:Object;
    private var sound:Sound;
    private var channel:SoundChannel;
    private static var initialized:Boolean = false;
    private var volume:Number;
    private var looping:Boolean = false;

    public function SoundEffect() {
        if (!initialized) initialize();
    }

    private static function initialize():void {
        initialized = true;
        soundList = new Object();
    }
    public function init(Snd:Class, id:String):void {
        var snd:Sound = new Snd();
        soundList[id] = snd;
    }
    public function load(file:String, id:String):void {
        var snd:Sound = new Sound();
        snd.load(new URLRequest(file));
        snd.addEventListener(ProgressEvent.PROGRESS, progress, false, 0, true);
        snd.addEventListener(Event.COMPLETE, loaded, false, 0, true);
        soundList[id] = snd;
    }
    public function play(id:String, vol:Number, loop:Boolean = false):void {
        if (channel != null) channel.stop();
        sound = soundList[id];
        volume = vol;
        looping = loop;
        channel = sound.play();
        var transform:SoundTransform = channel.soundTransform;
        transform.volume = volume;
        channel.soundTransform = transform;
        if (looping) {
            channel.addEventListener(Event.SOUND_COMPLETE, complete, false, 0, true);
        }
    }
    public function stop():void {
        if (channel != null) {
            channel.stop();
            channel.removeEventListener(Event.SOUND_COMPLETE, complete);
        }
    }
    private function progress(evt:ProgressEvent):void {
        dispatchEvent(evt);
    }
    private function loaded(evt:Event):void {
        dispatchEvent(evt);
    }
    private function complete(evt:Event):void {
        channel.removeEventListener(Event.SOUND_COMPLETE, complete);
        if (looping) {
            channel = sound.play(0);
            channel.addEventListener(Event.SOUND_COMPLETE, complete, false, 0, true);
            var transform:SoundTransform = channel.soundTransform;
            transform.volume = volume;
            channel.soundTransform = transform;
        }
    }

}


//////////////////////////////////////////////////
// ActionBtnクラス
//////////////////////////////////////////////////

import flash.display.Sprite;
import flash.display.Shape;
import flash.text.TextField;
import flash.text.TextFieldType;
import flash.text.AntiAliasType;
import flash.text.TextFormat;
import flash.text.TextFormatAlign;
import flash.filters.DropShadowFilter;
import flash.geom.Matrix;
import flash.display.GradientType;
import flash.display.SpreadMethod;
import flash.display.InterpolationMethod;
import flash.geom.ColorTransform;
import flash.events.Event;

class ActionBtn extends Sprite {
    public var id:uint;
    private var shade:Shape;
    private var base:Shape;
    private var front:Shape;
    private var light:Shape;
    private var overlay:Shape;
    private var txt:TextField;
    private var label:String = "";
    private static var fontType:String = "_ゴシック";
    private static var _width:uint = 80;
    private static var _height:uint = 80;
    private static var corner:uint = 6;
    private static var tHeight:uint = 17;
    private static var bColor:uint = 0xFFFFFF;
    private static var sColor:uint = 0x000000;
    private static var baseColor:uint = 0x0066CC;
    private static var lightColor:uint = 0x00FFFF;
    private static var overColor:uint = 0x3333FF;
    private static var tColor:uint = 0xFFFFFF;
    private static var defaultColorTrans:ColorTransform;
    private static var disableColor:uint = 0xCCCCCC;
    private static var disableColorTrans:ColorTransform;
    private var mode:int;
    private var _selected:Boolean = false;
    private var _enabled:Boolean = true;

    public function ActionBtn() {
    }

    public function init(option:Object):void {
        if (option.id != undefined) id = option.id;
        if (option.label != undefined) label = option.label;
        draw();
    }
    private function draw():void {
        defaultColorTrans = new ColorTransform();
        disableColorTrans = new ColorTransform();
        disableColorTrans.color = disableColor;
        shade = new Shape();
        base = new Shape();
        front = new Shape();
        light = new Shape();
        overlay = new Shape();
        txt = new TextField();
        addChild(shade);
        addChild(base);
        addChild(front);
        addChild(light);
        addChild(overlay);
        addChild(txt);
        createBase(shade, _width, _height, corner, bColor);
        shade.filters = [new DropShadowFilter(1, 90, sColor, 0.4, 4, 4, 2, 3, false, false)];
        createBase(base, _width-2, _height-2, corner, baseColor);
        createFront(front, _width, _height, corner);
        createLight(light, _width-2, _height-2, corner);
        createOverlay(overlay, _width-2, _height-2, corner);
        txt.x = -_width/2;
        txt.y = -tHeight + _height/4;
        txt.width = _width;
        txt.height = tHeight;
        txt.type = TextFieldType.DYNAMIC;
        txt.selectable = false;
        //txt.embedFonts = true;
        //txt.antiAliasType = AntiAliasType.ADVANCED;
        var tf:TextFormat = new TextFormat();
        tf.font = fontType;
        tf.size = 10;
        tf.align = TextFormatAlign.CENTER;
        txt.defaultTextFormat = tf;
        txt.textColor = tColor;
        txt.text = label;
        txt.filters = [new DropShadowFilter(0, 90, sColor, 0.5, 2, 2, 2, 3, false, false)];
        light.alpha = 0;
        enabled = true;
        mouseChildren = false;
    }
    private function rollOver():void {
        mode = 1;
        addEventListener(Event.ENTER_FRAME, action, false, 0, true);
    }
    private function rollOut():void {
        mode = -1;
        addEventListener(Event.ENTER_FRAME, action, false, 0, true);
    }
    private function action(evt:Event):void {
        light.alpha += 0.1*mode;
        if (light.alpha < 0) {
            light.alpha = 0;
            removeEventListener(Event.ENTER_FRAME, action);
        }
        if (light.alpha > 1) {
            light.alpha = 1;
            removeEventListener(Event.ENTER_FRAME, action);
        }
    }
    private function _up():void {
        base.transform.colorTransform = defaultColorTrans;
        front.transform.colorTransform = defaultColorTrans;
    }
    private function _down():void {
        base.transform.colorTransform = defaultColorTrans;
        front.transform.colorTransform = defaultColorTrans;
        light.alpha = 1;
    }
    private function _disable():void {
        base.transform.colorTransform = disableColorTrans;
        front.transform.colorTransform = disableColorTrans;
    }
    public function get selected():Boolean {
        return _selected;
    }
    public function set selected(param:Boolean):void {
        _selected = param;
        enabled = !_selected;
        if (_selected) {
            _down();
        } else {
            _up();
            rollOut();
        }
    }
    public function get enabled():Boolean {
        return _enabled;
    }
    public function set enabled(param:Boolean):void {
        _enabled = param;
        if (_enabled) {
            _up();
        } else {
            _disable();
        }
    }
    private function createBase(target:Shape, w:uint, h:uint, c:uint, color:uint, alpha:Number = 1):void {
        target.graphics.beginFill(color, alpha);
        target.graphics.drawRoundRect(-w/2, -h/2, w, h, c*2);
        target.graphics.endFill();
    }
    private function createFront(target:Shape, w:uint, h:uint, c:uint):void {
        var colors:Array = [baseColor, baseColor];
        var alphas:Array = [0, 0.5];
        var ratios:Array = [0, 255];
        var matrix:Matrix = new Matrix();
        matrix.createGradientBox(w, h, 0.5*Math.PI, -w/2, -h/2);
        target.graphics.beginGradientFill(GradientType.LINEAR, colors, alphas, ratios, matrix, SpreadMethod.PAD, InterpolationMethod.RGB, 0);
        target.graphics.drawRoundRect(-w/2, -h/2, w, h, c*2);
        target.graphics.endFill();
    }
    private function createLight(target:Shape, w:uint, h:uint, c:uint):void {
        var colors:Array = [lightColor, overColor];
        var alphas:Array = [1, 0];
        var ratios:Array = [40, 160];
        var matrix:Matrix = new Matrix();
        matrix.createGradientBox(w*4, h*2, 0, -w*2, -h*0.45);
        target.graphics.beginGradientFill(GradientType.RADIAL, colors, alphas, ratios, matrix, SpreadMethod.PAD, InterpolationMethod.RGB, 0);
        target.graphics.drawRoundRect(-w/2, -h/2, w, h, c*2);
        target.graphics.endFill();
    }
    private function createOverlay(target:Shape, w:uint, h:uint, c:uint):void {
        target.graphics.beginFill(bColor, 0.3);
        target.graphics.drawEllipse(-w*1.5, -w*2, w*3, w*2);
        target.graphics.endFill();
        var _mask:Shape = new Shape();
        _mask.graphics.beginFill(sColor);
        _mask.graphics.drawRoundRect(-w/2, -h/2, w, h, c*2);
        _mask.graphics.endFill();
        addChild(_mask);
        target.mask = _mask;
    }

}