Not a Snippet (wandering robots)

package {
	import flash.display.Sprite;
    
    [SWF(width=500, height=500, backgroundColor=0xEFEFEF, frameRate=30)]
	public class Main extends Sprite{
		private var _robotManager:RobotManager;
		public function Main(){
		  _robotManager = new RobotManager(this, 12);
		}
	}
}

class RobotManager{
	
	private var _robots:Array;
	private var _top:Sprite;
	private var _robotNum:int;
	
    public function RobotManager(top:Sprite, robotNum:int){
    	_top = top;
    	_robotNum = robotNum;
    	_robots = new Array();
    	setupRobots();
    	top.addEventListener(Event.ENTER_FRAME, onRun);
    }
    
    private function setupRobots():void{
    	for (var i:int = 0; i<_robotNum; i++){
    		_robots[i] = new Robot();
    		_robots[i].x = 100+(i % 3) * 150;
    		_robots[i].y = 100+int(i / 3) * 100;
    		_robots[i].addEventListener("death", onRobotDie);
    		_top.addChild(_robots[i]);
    	}
    }
    private function onRobotDie(evt:Event):void{
    	for (var i:int = 0; i<_robotNum; i++){
    		if (_robots[i] == evt.currentTarget){
    			_robots.splice(i, 1);
    		}
    	}
    	_robotNum--;
    }
    
    private function onRun(evt:Event):void{
    	collisions();
    }
    
    private function collisions():void{
    	var currBot:Robot;
    	for (var i:int = 0; i<_robotNum; i++){
    		currBot = _robots[i];
    		for (var j:int = 0; j<_robotNum; j++){
    			if (currBot != _robots[j]){
    				var dx:Number = currBot.x - _robots[j].x;
    				var dy:Number = currBot.y - _robots[j].y;
    				if (Math.sqrt((dx * dx) + (dy * dy)) < 40){
    					currBot.die();
    				}
    			}
    		}
    	}
    }
}

import flash.display.*
import flash.events.*;

class Robot extends Sprite{
	private var _inc:Number
	private var _td:Number;
	private var _theta:Number;
	private var _rad:Number;
	
	public function Robot(){
		_theta = Math.random() * (Math.PI * 2);
		_td = _theta;
		_inc = Math.random() * .2 + .05;
		_rad = _inc * 10;
		with(graphics){
			beginFill(0x666666);
			drawRect(-10,-10,20,20);
			endFill();
			beginFill(0x333333);
			drawRect(-5, -5, 20, 10);
			lineStyle(0,0xAAAAAA);
			endFill();
			drawCircle(0,0,20);
		}
		addEventListener(Event.ENTER_FRAME, onRun);
	}
	
	private function onRun(evt:Event):void{
		_td  += _inc;
		_theta += _inc * Math.cos(_td);
		if (x < 0 || y < 0 || x > 500 || y > 500){
			_theta += Math.PI;
		}
		x += _rad * Math.cos(_theta);
		y += _rad * Math.sin(_theta);
		rotation = _theta / Math.PI * 180;
	}
	
	public function die():void{
		removeEventListener(Event.ENTER_FRAME, onRun);
		addEventListener(Event.ENTER_FRAME, onDie);
	}
	
	private function onDie(evt:Event):void{
		scaleX = scaleY += .1;
		alpha -= .1;
		if (scaleX > 2){
			removeEventListener(Event.ENTER_FRAME, onDie);
			if (parent){
				parent.removeChild(this);
				dispatchEvent(new Event("death"));
			}
		}
	}
}

This code should be placed in a document class… not the timeline (hopefully you already know that)

The above creates 12 wandering robots that die when they collide with one another.

This is not a snippet really… but it’s only slightly over 100 lines and it contains a few tricks I find myself using from time to time.

You can view the swf here.

3 comments

  1. for (var i:int = 0; i<_robotNum; i++){ currBot = _robots[i]; for (var j:int = 0; j<_robotNum; j++){ if (currBot != _robots[j]){ var dx:Number = currBot.x - _robots[j].x; var dy:Number = currBot.y - _robots[j].y; if (Math.sqrt((dx * dx) + (dy * dy)) <40){ currBot.die(); } } } } A little snippet trick in itself maybe to minimize the iterations: for(i = 0; i < numRobots - 1; i ++) for(j = i + 1; i < numRobots; j++) //if hit kill both instead of one at a time Cheers, Ted

  2. yeah your right about that… you would just add:

    _robots[j].die();

    after line 58. I really need to add some formatted code support for comments…. ๐Ÿ™‚

Leave a Reply

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