2D Map Avoid

[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.


Have a look at the swf here…

Leave a Reply

Your email address will not be published. Required fields are marked *