package { import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; public class Sixteen extends Sprite { private var map:Array; private var field1:Array; private var field2:Array; private var led:Sprite; private const mWidth:int = 18; private const mHeight:int = 18; private var r:int = 8; private var pow:int = 8; public function Sixteen():void { var i:int; map = new Array; field1 = new Array; field2 = new Array; for (i = 0; i < (mWidth * mHeight); i++) { var x:int = i % mWidth; var y:int = i / mWidth; led = new Sprite(); led.graphics.beginFill(0x0000FF); led.graphics.drawCircle(0, 0, r); led.buttonMode = true; map[i] = led; led.x = x * (led.width) + 30; led.y = y * (led.height) + 30; stage.addChild(led); field1[i] = field2[i] = 0; } stage.addEventListener(Event.ENTER_FRAME, run); stage.addEventListener(MouseEvent.MOUSE_DOWN, onMDown); stage.addEventListener(MouseEvent.MOUSE_UP, onMUp); } private function run(event:Event):void { var iMax:int = mWidth * mHeight - mWidth; var damp:Number = 1 - (1 / (2 * pow)); var i:int; for (i = mWidth; i < iMax; i++) { var x:int = i % mWidth; if (x == 0 || x == mWidth - 1) { continue; } field2[i] = (field1[i - 1] + field1[i + 1] + field1[i - mWidth] + field1[i + mWidth]) / 2 - field2[i]; field2[i] = field2[i] * damp; var a:Number = field2[i] - field2[i - mWidth - 1] + 0.5; if (a < 0) { a = 0; } else if (a > 1) { a = 1; } //map[i].alpha = a; map[i].alpha = (Math.floor(a * 16.0)) / 16.0; } var field0:Array = new Array; field0 = field1; field1 = field2; field2 = field0; } private function onMDown(event:MouseEvent):void { stage.addEventListener(MouseEvent.MOUSE_MOVE, onMMove); var mx:int = event.stageX; var my:int = event.stageY; var lx:int = (mx - 15) / led.width; var ly:int = (my - 15) / led.height; raiseWave(lx, ly); } private function onMUp(event:MouseEvent):void { stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMMove); } private function onMMove(event:MouseEvent):void { var mx:int = event.stageX; var my:int = event.stageY; var lx:int = (mx - 15) / led.width; var ly:int = (my - 15) / led.height; raiseWave(lx, ly); } private function raiseWave(dx:int, dy:int):void { var ad:int = dx + dy * mWidth; var field:Array = new Array(); if (dx < 2 || dx > mWidth - 1 - 2 || dy < 2 || dy > mHeight - 1 - 2) { return; } field = field1; field[ad] = 1; field[ad - 1] = field[ad + 1] = field[ad - mWidth] = field[ad + mWidth] = 0.75; field[ad - mWidth - 1] = field[ad - mWidth + 1] = field[ad + mWidth - 1] = field[ad + mWidth + 1] = 0.5; } } }