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

グロさを追求しきれなかったPerlinNoise

一応警告出してますが、大したことはないです。

BitmapData.perlinNoiseの引数にfractalっていうのがあるんですが、それがキモい感じのノイズなので、なんか内蔵っぽくならないかなと思ったらあんまりうまくいかなかったという。

誰かforkでグロくしてくれる人を募集。
package  
{
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.filters.ConvolutionFilter;
    import flash.geom.ColorTransform;
    import flash.geom.Matrix;
    import flash.geom.Point;
    import flash.text.TextField;
    import flash.text.TextFieldAutoSize;
    import flash.text.TextFormat;
    
    /**
     * グロさを追求しきれなかったPerlinNoise
     * 
     * @author Hiiragi
     * 
     * 一応警告出してますが、大したことはないです。
     * 
     * BitmapData.perlinNoiseの引数にfractalっていうのがあるんですが、それをfalseにしておくとキモい感じのノイズになるので、なんか内蔵っぽくならないかなと思ったらあんまりうまくいかなかったという。
     * 
     * 誰かforkでグロくしてくれる人を募集。
     * 
     */
    [SWF(width = "465", height = "465", frameRate = "30", background = "0x0")]
    public class Organ extends Sprite
    {
        private var _perlinNoiseBmpd:BitmapData;
        private var _cf:ConvolutionFilter;
        
        private var _warningText:TextField;
        
        public function Organ() 
        {
            if (stage) init();
            else this.addEventListener(Event.ADDED_TO_STAGE, init);
        }
        
        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            
            _perlinNoiseBmpd = new BitmapData(this.stage.stageWidth, this.stage.stageHeight, false);
            this.addChild(new Bitmap(_perlinNoiseBmpd));
            
            var mtxArray:Array = [0, 0, 0, 0, 0,
                                  0, -1.6, 0, 0, 0,
                                  0, 0, 1, 0, 0,
                                  0, 0, 0, 1.8, 0,
                                  0, 0, 0, 0, 0];
                                  
            _cf = new ConvolutionFilter(5, 5, mtxArray)
            
            _warningText = new TextField();
            _warningText.autoSize = TextFieldAutoSize.LEFT;
            _warningText.text = "一応、閲覧注意(Clickで描画)";
            _warningText.setTextFormat(new TextFormat(null, 25));
            _warningText.x = this.stage.stageWidth / 2 - _warningText.width / 2;
            _warningText.y = this.stage.stageHeight / 2 - _warningText.height / 2;
            
            this.addChild(_warningText);
            
            this.stage.addEventListener(MouseEvent.CLICK, onClickHandler);
        }
        
        private function onClickHandler(e:MouseEvent):void 
        {
            if (_warningText.visible) _warningText.visible = false;
            
            _perlinNoiseBmpd.lock();
            
            _perlinNoiseBmpd.perlinNoise(_perlinNoiseBmpd.width * 2, _perlinNoiseBmpd.height * 2, 6, Math.random() * int.MAX_VALUE, true, false, 7, true);
            _perlinNoiseBmpd.colorTransform(_perlinNoiseBmpd.rect, new ColorTransform(5, 2, 2, 10, 10, 10));
            _perlinNoiseBmpd.applyFilter(_perlinNoiseBmpd, _perlinNoiseBmpd.rect, new Point(), _cf);
            //var color:uint;
            //var r:uint;
            //var g:uint;
            //var b:uint;
            
            //for (var px:int = 0; px < _perlinNoiseBmpd.rect.width; px++)
            //{
                //for (var py:int = 0; py < _perlinNoiseBmpd.rect.height; py++)
                //{
                    //color = _perlinNoiseBmpd.getPixel(px, py);
                    //r = color >>> 16;
                    //g = color >>> 8 & 0xFF;
                    //b = color & 0xFF;
                    //
                    //color = r << 16 | g << 8 | b;
                    //_perlinNoiseBmpd.setPixel(px, py, color);
                //}
            //}
            
            _perlinNoiseBmpd.unlock();
        }
        
    }

}