forked from: forked from: flash on 2010-3-29
forked from forked from: flash on 2010-3-29 (diff: 115)
星空みたいなの作りたい。まだ未完成。 星をピカピカ瞬かせたいけどうまくいかない… 一個一個描画して明滅させたほうが簡単な気がする。保留 こちらを参考にしました。 http://wonderfl.net/code/f6c0bcf645729a45ad2a996ef3982e5d63f3549b http://wonderfl.net/code/cafcb78df40b35b0c0d571dc8fd8f1bda791e4b4
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;
}
}
