setVector() CA Texture

[SWF(width=500, height=500)]
var canvasSize:int=stage.stageWidth;
var canvas:BitmapData=new BitmapData(canvasSize,canvasSize,false,0x000001);
addChild(new Bitmap(canvas, "auto", true));
var size:int=canvas.width*canvas.height - canvasSize;
var pixels:Vector.<uint>=canvas.getVector(canvas.rect);
for (var i:int = 0; i<canvasSize; i++) {
	var xp:int=int(Math.random()*canvasSize);
	var yp:int=int(Math.random()*canvasSize);
	pixels[xp+yp*canvasSize]=0xFF000000;
}
var targetCol:uint=0xFF000000;
var buffer:Vector.<uint>=pixels.concat();
var fade:uint=1;

addEventListener(Event.ENTER_FRAME, onLoop);
function onLoop(evt:Event):void {
	var curr:uint=targetCol;
	var r:int = (curr >> 16) & 0xFF;
	var g:int = (curr >> 8) & 0xFF;
	var b:int=curr&0xFF;
	r+=fade;
	g+=fade;
	b+=fade;
	if (r>255) r=255;
	if (g>255) g=255;
	if (b>255) b=255;
	var darker:uint=0xFF000000|r<<16|g<<8|b;
	if (darker==0xFFFFFFFF) {
		removeEventListener(Event.ENTER_FRAME, onLoop);
	}
	for (var i:int = canvasSize; i<size; i++) {
		curr=pixels[i];
		if (curr==targetCol) {
			var index:int=i-canvasSize+int(Math.random()*3) - 1;
			if (index>0) buffer[index]=darker;
			if (int(Math.random()*50)==1) {
				index=i-canvasSize+int(Math.random()*3)-1;
				if (index>0) buffer[index]=darker;
			}
		}
	}
	targetCol=darker;
	canvas.lock();
	canvas.setVector(canvas.rect, buffer);
	pixels=buffer.concat();
	canvas.unlock();
}

This snippet uses setVector() to draw something that looks like this:

This is a cellular automaton. It has kind of a strange rule set – but you could easily use this snippet to do more traditional cellular automata.

Leave a Reply

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