In the middle of a cool project which is right on the cusp of being designered into oblivion, I discovered a nifty way to make things “snap to” a grid. Copy-and-paste into Flash MX/MX2004.
var gridSize = 20; // size of grid var nodeSize = 20; // size of individual nodes var nodes = 50; // number of nodes var radius = Stage.height/3; // radius of drawn circle var centerX = Stage.width/2; // center horizontally var centerY = Stage.height/2; // center vertically var steps = (Math.PI*2) / nodes; // math stuff var i=0; this.onEnterFrame = function() { if(i < nodes) { var m = _root.createEmptyMovieClip("node"+i,i); m.lineStyle(0,0x000000,100); m.beginFill(0x000000,10); m.moveTo(0,0); m.lineTo(nodeSize,0); m.lineTo(nodeSize,nodeSize); m.lineTo(0,nodeSize); m.lineTo(0,0); m.endFill(); var mx = centerX + radius*Math.cos(steps*i); // horizontal snap if(mx%gridSize != 0) mx += (Math.floor(gridSize/2) - (mx%gridSize)); var my = centerY + radius*Math.sin(steps*i); // vetical snap if(my%gridSize != 0) my += (Math.floor(gridSize/2) - (my%gridSize)); m._x = mx; m._y = my; i++; radius += .1; } else { this.onEnterFrame = null; } }
It’s the modulus (mx % gridSize) which makes it cool. The Math.floor() which follows could also easily be Math.round() or Math.ceil(), depending on the constraints of the project.