package { import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; public class TateNami extends Sprite { private var map:Array; private var field1:Array; private var field2:Array; private var led:Sprite; private const mWidth:int = 34; private const mHeight:int = 10; private var r:int = 8; private var pow:int = 12; public function TateNami():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); led.addEventListener(MouseEvent.MOUSE_DOWN, onMDown); field1[i] = field2[i] = 0; } stage.addEventListener(Event.ENTER_FRAME, run); } 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] - field2[i]; field2[i] = field2[i] * damp; var a:Number = field2[i] + 0.5; if (a > 1) { a = 1; } else if (a < 0) { a = 0; } map[i].alpha = (Math.floor(a * 16.0)) / 16.0; //map[i].alpha = a; } var field0:Array = new Array; field0 = field1; field1 = field2; field2 = field0; } private function onMDown(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(); field = field1; if (dx < 2 || dx > mWidth - 1 - 2 || dy < 1 || dy > mHeight - 1 - 1) { return; } var i:int; for (i = -(mHeight - 2); i < mHeight - 1; i++) { var tate:int = i * mWidth; field[ad + tate] = 0.75; field[ad - 1 + tate] = 0.5; field[ad + 1 + tate] = 0.5; } } } }