//@ package -- garden lines package { import flash.display.Sprite; import flash.display.StageScaleMode; import flash.display.StageAlign; import flash.events.Event; import flash.geom.Point; [SWF(backgroundColor=0x000000)] //@ class public class animation_ch12_NodeGardenLines extends Sprite { private var particles:Array; private var numParticles:uint = 30; private var minDist:Number = 100; private var springAmount:Number = .001; //@ constructor public function animation_ch12_NodeGardenLines() { init(); } //@ init(s) private function init():void { stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT; particles = new Array(); //@ particle(s) for(var i:uint = 0; i < numParticles; i++) { var particle:animation_ch12_Ball = new animation_ch12_Ball(3, 0xffffff); particle.x = Math.random() * stage.stageWidth; particle.y = Math.random() * stage.stageHeight; particle.vx = Math.random() * 6 - 3; particle.vy = Math.random() * 6 - 3; addChild(particle); particles.push(particle); } //@ install listerner(s) addEventListener(Event.ENTER_FRAME, onEnterFrame); } //@ animation / frame(s) private function onEnterFrame(event:Event):void { graphics.clear(); for(var i:uint = 0; i < numParticles; i++) { var particle:animation_ch12_Ball = particles[i]; particle.x += particle.vx; particle.y += particle.vy; //@ check stage if(particle.x > stage.stageWidth) { particle.x = 0; } else if(particle.x < 0) { particle.x = stage.stageWidth; } if(particle.y > stage.stageHeight) { particle.y = 0; } else if(particle.y < 0) { particle.y = stage.stageHeight; } } //@ animate & spring for(i=0; i < numParticles - 1; i++) { var partA:animation_ch12_Ball = particles[i]; for(var j:uint = i + 1; j < numParticles; j++) { var partB:animation_ch12_Ball = particles[j]; spring(partA, partB); } } } //@ spring(s) private function spring(partA:animation_ch12_Ball, partB:animation_ch12_Ball):void { var dx:Number = partB.x - partA.x; var dy:Number = partB.y - partA.y; var dist:Number = Math.sqrt(dx * dx + dy * dy); //@ check (spring) distance(s) if(dist < minDist) { graphics.lineStyle(1, 0xffffff, 1 - dist / minDist); graphics.moveTo(partA.x, partA.y); graphics.lineTo(partB.x, partB.y); var ax:Number = dx * springAmount; var ay:Number = dy * springAmount; partA.vx += ax; partA.vy += ay; partB.vx -= ax; partB.vy -= ay; } } } }