forked from: forked from: flash on 2010-3-29

by yasai forked from forked from: flash on 2010-3-29 (diff: 115)
星空みたいなの作りたい。まだ未完成。
星をピカピカ瞬かせたいけどうまくいかない…
一個一個描画して明滅させたほうが簡単な気がする。保留

こちらを参考にしました。
http://wonderfl.net/code/f6c0bcf645729a45ad2a996ef3982e5d63f3549b
http://wonderfl.net/code/cafcb78df40b35b0c0d571dc8fd8f1bda791e4b4
♥0 | Line 114 | Modified 2010-04-02 15:18:37 | MIT License
play

ActionScript3 source code

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

// forked from yasai's flash on 2010-3-29
package {
	import flash.display.Bitmap;
	import flash.display.BitmapData;
    import flash.display.Sprite;
	import flash.display.BlendMode;
	import flash.events.Event;
	import flash.geom.ColorTransform;
	import flash.geom.Point;
	import flash.sampler.NewObjectSample;
	import net.hires.debug.Stats;
	/**
	 * 星空みたいなの作りたい。まだ未完成。
	 * 星をピカピカ瞬かせたいけどうまくいかない…
	 * 一個一個描画して明滅させたほうが簡単な気がする。保留
	 * 
	 * こちらを参考にしました。
	 * http://wonderfl.net/code/f6c0bcf645729a45ad2a996ef3982e5d63f3549b
	 * http://wonderfl.net/code/cafcb78df40b35b0c0d571dc8fd8f1bda791e4b4
	 */
	[SWF(width="465", height="465", frameRate="30")]
    public class FlashTest extends Sprite {
		private var starBmd:BitmapData;
		private const H:uint = 465;
		private const W:uint = 465;
		private const MIN:uint = 250;
		private const MAX:uint = 255;
		private const OCTAVES:int = 3;
		private var seed:int;
		private var offsetAry:Array;
		private var offsetXY:Array;
		private var starAlphaBmd:BitmapData;
		private var aSeed:int = 0;
		
        public function FlashTest() {
			addEventListener(Event.ADDED_TO_STAGE, init);
        }
		
		private function init(e:Event):void {
			removeEventListener(Event.ADDED_TO_STAGE, init);
			
			stage.addChild(new Stats());
		
			aSeed = Math.random();
						
			//背景
			var backBmd:BitmapData = new BitmapData(W, H, false, 0xFF000000);
			var backBm:Bitmap = new Bitmap(backBmd);
			addChild(backBm);
			makePerlinNoise(backBmd, aSeed, W / 4, H / 5);
			backBmd.colorTransform(backBmd.rect, new ColorTransform( -1, .15, .2));
						
			//星空
			starBmd = new BitmapData(W, H, false, 0x00000000);
			var starBm:Bitmap = new Bitmap(starBmd);
			starBm.blendMode = BlendMode.SCREEN;
			addChild(starBm);
			makeNoise(starBmd);
			levelCorrection(starBmd);
			
			//星空のぴかぴか
			starAlphaBmd = new BitmapData(W, H, true, 0x00000000);
			var starAlphaBm:Bitmap = new Bitmap(starAlphaBmd);
			addChild(starAlphaBm);
			starAlphaBm.blendMode = BlendMode.DARKEN;
			offsetAry = [];
			offsetXY = [];
			for (var i:int = 0; i < OCTAVES; i++) {
				offsetAry[i] = new Point(Math.random() * W, Math.random() * H);
				offsetXY[i] = new Array(2);
				offsetXY[i][0] = Math.random() * OCTAVES - OCTAVES * .5;
				offsetXY[i][1] = Math.random() * OCTAVES - OCTAVES * .5;
			}
			addEventListener(Event.ENTER_FRAME, onEnterFrame);
			
			var whiteBmd:BitmapData = new BitmapData(W, H, true, 0xFFFFFFFF);
			var whiteBm:Bitmap = new Bitmap(whiteBmd);
			whiteBm.blendMode = BlendMode.OVERLAY;
			addChild(whiteBm);
			
		}
		
		//EnterFrame
		private function onEnterFrame(e:Event):void {
			for (var i:int = 0; i < OCTAVES; i++) {
				offsetAry[i].x += offsetXY[i][0];
				offsetAry[i].y += offsetXY[i][1];
			}
			makePerlinNoise(starAlphaBmd, aSeed, 100, 100, offsetAry);
		}
		
		//ランダムノイズを生成する
		private function makeNoise(bmd:BitmapData):void {
			bmd.lock();
			seed = Math.floor(Math.random() * 99);
			bmd.noise(seed, 0x000000, 0xFFFFFF, 7, true);
			bmd.unlock();
		}
		
		//パーリンノイズを生成する
		private function makePerlinNoise(bmd:BitmapData, randomSeed:int, baseX:int, baseY:int, offsetAry:Array = null):void {
			bmd.lock();
			bmd.perlinNoise(baseX, baseY, OCTAVES, randomSeed, false, true, 7, true, offsetAry);
			bmd.unlock();
		}
		
		//レベル補正
		private function levelCorrection(bmd:BitmapData):void {
			var rgb:RGB = new RGB();
			for (var ix:int = 0; ix < bmd.width; ix++) {
				for (var iy:int = 0; iy < bmd.height; iy++) {
					rgb.setPixel(bmd.getPixel(ix, iy));
					rgb.r = getColor(rgb.r);
					rgb.g = getColor(rgb.g);
					rgb.b = getColor(rgb.b);
					bmd.setPixel(ix, iy, rgb.getPixel());
				}
			}
		}
		
		//レベル補正された色を取得
		private function getColor(color:uint):uint {
			if (color < MIN) color = MIN;
			if (color > MAX) color = MAX;
			return (color - MIN) * 255 / (MAX - MIN);
		}
    }
}

class RGB
{
	public var r:uint = 0;
	public var g:uint = 0;
	public var b:uint = 0;
	
	public function setPixel(color:uint):void {
		r = color >> 16 & 0xFF;
		g = color >> 8 & 0xFF;
		b = color & 0xFF;
	}
	
	public function getPixel():uint {
		var pixel:uint = 0;
		pixel += r << 16;
		pixel += g << 8;
		pixel += b;
		
		return pixel;
	}
}