No6
恒例になりつつあるノイタミナオマージュ
※ちょっと修正 07/29
/**
* Copyright Nyarineko ( http://wonderfl.net/user/Nyarineko )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/jLM1
*/
package
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.BitmapDataChannel;
import flash.display.Shape;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.Rectangle;
import flash.geom.Point;
import flash.display.Graphics;
import flash.display.LoaderInfo;
import flash.display.Loader;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.system.LoaderContext;
import flash.system.ApplicationDomain;
import flash.system.SecurityDomain;
[SWF(width = "465", height = "465", backgroundColor = "0xffffff", frameRate = "60")]
public class Main extends Sprite
{
private const WIDTH:Number = 465;
private const HEIGH:Number = 465;
private const OX:Number = 465 / 2;
private const OY:Number = 465 / 2;
private const DIAMETER:Number = 20;
private const OBJ_MAX:Number = 300;
private const V:Number = 30;
private var _container:Sprite;
private var _mask:BitmapData;
private var _bmp:Bitmap;
private var _sp:Sprite;
private var _sh:Shape;
private var first:Hexagon;
private var _source:BitmapData;
private var _imgLoader:Loader;
private var _imgLoaderInfo:LoaderInfo;
public function Main()
{
_sh = new Shape();
_sp = new Sprite();
_container = new Sprite();
var url:String = "http://assets.wonderfl.net/images/related_images/b/b2/b264/b264bc065fedd37289d37322282f49d09934a816";
var urlReq:URLRequest = new URLRequest(url);
var context:LoaderContext = new LoaderContext();
context.checkPolicyFile = true;
_imgLoader = new Loader();
_imgLoaderInfo = _imgLoader.contentLoaderInfo;
_imgLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onImageloaded);
_imgLoader.load(urlReq,context);
init();
}
private function onImageloaded(e:Event):void
{
_source = new BitmapData(_imgLoader.width,_imgLoader.height,true);
_source.draw(_imgLoader);
var bmp:Bitmap = new Bitmap(_source);
_container.addChild(bmp);
addChild(_container);
addChild(_sp);
addChild(_sh);
_container.mask = _sp;
stage.addEventListener(MouseEvent.CLICK,onClick);
stage.addEventListener(Event.ENTER_FRAME,enterframeHandler);
}
private function init():void
{
createHexagon(OX,OY);
}
private function createHexagon(px:Number,py:Number):void
{
first = new Hexagon();
first.ox = px;
first.oy = py;
first.v = 0;
var p:Hexagon = first;
for(var i:uint = 0;i < OBJ_MAX;i++){
p.next = new Hexagon();
var gp:Hexagon = first;
while(1){
var ran:uint = Math.floor(Math.random() * 6);
if(!gp.link[ran]){
var ang:Number = Math.PI/180 * (60 * ran);
p.next.ox = gp.ox + DIAMETER * Math.cos(ang);
p.next.oy = gp.oy + DIAMETER * Math.sin(ang);
checkLink(p.next);
break;
}else{
gp = gp.link[ran];
}
}
p.next.v = Math.random() * - 20 + (-10 * i);
p = p.next;
}
}
//リンクセット
private function checkLink(cp:Hexagon):void
{
for(var i:uint = 0;i < 6;i++){
var ang:Number = Math.PI/180 * (60 * i);
var cx:Number = cp.ox + DIAMETER * Math.cos(ang);
var cy:Number = cp.oy + DIAMETER * Math.sin(ang);
var p:Hexagon = first;
while(p.next){
if(cx < p.ox + 2 && cx > p.ox - 2 && cy < p.oy + 2 && cy > p.oy - 2){
cp.link[i] = p;
p.link[(i+3)%6] = cp;
}
p = p.next;
}
}
}
private function enterframeHandler(e:Event):void
{
update();
}
private function onClick(e:MouseEvent):void
{
createHexagon(mouseX,mouseY);
}
private function update():void {
var g:Graphics = _sh.graphics;
var sg:Graphics = _sp.graphics;
var p:Hexagon = first;
var cnt:uint = 0;
_sh.x = (mouseX - OX) / 100;
_sh.y = (mouseY - OY) / 100;
_sp.x = (mouseX - OX) / 100;
_sp.y = (mouseY - OY) / 100;
_container.x = -(mouseX - OX) / 100;
_container.y = -(mouseY - OY) / 100;
sg.clear();
g.clear();
g.lineStyle(1,0x000000);
while(p){
if(p.v < 610) p.v+=V;
if(p.v >= 0){
if(p.v >= 600){
g.beginFill(0xFFFFFF,p.a/100 - (Math.random()));
if(p.a > 0) p.a-=5;
sg.beginFill(0xAAFFAA,0.1);
}
var bx:Number = 0;
var by:Number = 0;
for(var i:Number = 0;i <= 6;i++){
var ang:Number = Math.PI/180 * (60 * i - 90);
var lx:Number = p.ox + DIAMETER/2 * Math.cos(ang);
var ly:Number = p.oy + DIAMETER/2 * Math.sin(ang);
if(i == 0){
g.moveTo(lx,ly);
sg.moveTo(lx,ly);
bx = lx;
by = ly;
}else{
if(i*100 <= p.v){
g.lineTo(lx,ly);
if(p.v >= 600) sg.lineTo(lx,ly);
bx = lx;
by = ly;
}
if(i*100 > p.v && (i-1)*100 <= p.v){
g.lineTo(bx + (lx - bx) * (p.v%100)/100 , by + (ly - by) * (p.v%100)/100);
}
}
}
g.endFill();
}
p = p.next;
cnt++;
}
}
}
}
class Hexagon
{
public var ox:Number;
public var oy:Number;
public var v:Number = 0;
public var a:Number = 100;
public var link:Array;
public var next:Hexagon;
public function Hexagon()
{
this.link = [];
}
}