[SWF(width=401,height=401,background=0xEFEFEF)]
var w:Number = stage.stageWidth-1;
var h:Number = stage.stageHeight-1;
var tileSize:Number = 20;
var halfTileSize:Number = 20;
var hTiles:Number = w / tileSize;
var vTiles:Number = h / tileSize;
var world:Shape = Shape(addChild(new Shape()));
var map:Array=[];
populateMap();
var gridColor:uint = 0xCCCCCC;
grid(tileSize, gridColor);
vTiles -= 1;
var movers:Array = [];
for (var i:int = 0; i<100; i++){
movers.push(makeMover(i % hTiles, int( i / hTiles),0x000000))
movers.push(makeMover(i % hTiles, vTiles - int( i / hTiles),0xFF0000))
}
var moverNum:int = movers.length;
hTiles -= 1;
addEventListener(Event.ENTER_FRAME, onLoop);
function onLoop(evt:Event):void {
world.graphics.clear();
for (var i:int = 0; i<moverNum; i++){
movers[i]();
}
}
function populateMap():void{
for (var i:int = 0; i<vTiles; i++){
map[i] = [];
for (var j:int = 0; j<hTiles; j++){
map[i][j] = 0;
}
}
}
function grid(size:Number=30, lineColor:uint=0xFFFF00, lineAlpha:Number=1):void {
with(graphics){
lineStyle(0, lineColor, lineAlpha);
drawRect(0,0,w,h);
for (var i:Number = size; i<w; i+=size) {
moveTo(i, 0);
lineTo(i, w);
}
for (i = size; i<h; i+=size) {
moveTo(0, i);
lineTo(h, i);
}
}
}
function makeMover(x:Number, y:Number, col:uint):Function{
var xp:Number = x;
var yp:Number = y;
var prevX:Number = x;
var prevY:Number = y;
map[yp][xp] = 1;
var dx:Number = xp;
var dy:Number = yp;
var counter:int = 0;
return function():void{
if (counter > 20){
if (int(Math.random()*30) == 1){
xp += int(Math.random()*2) - 1 | 1;
xp = xp < 0 ? 0 : xp;
xp = xp > hTiles ? hTiles : xp;
if (map[yp][xp] == 1){
xp = prevX;
}else{
map[prevY][prevX] = 0;
map[yp][xp] = 1;
counter = 0;
}
prevX = xp;
}else
if (int(Math.random()*30) == 1){
yp += int(Math.random()*2) - 1 | 1;
yp = yp < 0 ? 0 : yp;
yp = yp > vTiles ? vTiles : yp;
if (map[yp][xp] == 1){
yp = prevY;
}else{
map[prevY][prevX] = 0;
map[yp][xp] = 1;
counter = 0;
}
prevY = yp;
}
}
counter++;
dx += (xp - dx) * 0.5;
dy += (yp - dy) * 0.5;
with(world.graphics){
lineStyle(0, gridColor,1, true)
beginFill(col);
drawRect(dx * tileSize, dy * tileSize, tileSize, tileSize);
}
}
}
This (somewhat long) snippet moves boxes around on a grid – the boxes avoid one another by reading values in a 2D array. This technique can also be used for collision detection in tile-based games.