class Predator { private var c:MovieClip, dc:MovieClip; private var landed:Boolean = false; public var hunting:Boolean = true; public var wandering:Boolean = false; private static var speed:Number = .8; private static var friction:Number = .75; private static var offset:Number = 7.5; private var x:Number, y:Number, dx:Number, dy:Number, tx:Number, ty:Number, r:Number, vx:Number, vy:Number, timer:Number; private var fi:FrameInterval; private var old:Object; private var hunted:Array; private var target:Object; public function Predator(x_:Number, y_:Number, c_:MovieClip, h_:Array) { c = c_; dc = _root.createEmptyMovieClip("dc", 1); vx = vy = 0; dx = dy = 1; tx = x = x_; ty = y = y_; timer = 0; r=c._height/2; initMove(this); routine(this); old = {}; fi = new FrameInterval(c, 100); handle(this); hunted = h_; } private function update():Void { c._x = x; c._y = y; c._rotation = M2.toDegrees(Math.atan2(vy, vx)); } public function setTarget(x_:Number, y_:Number):Void { tx = x_, ty = y_; } private function hunt():Void { var ox:Number = x, oy:Number = y; setTarget(target.x, target.y); var temp:Object = attack(x, tx, dx); x = temp.s; dx = temp.d; var temp:Object = attack(y, ty, dy); y = temp.s; dy = temp.d; dc.lineStyle(r, 0xFF0000, 20); dc.moveTo(x, y); dc.lineTo(ox, oy); dc.lineTo(old.x, old.y); old.x = ox, old.y = oy; } private function routine(arg:Predator):Void { c.onEnterFrame=function() { arg.dc.clear(); if(!arg.landed) { if(arg.hunting) arg.hunt(); if(arg.wandering) arg.wander(); }else { arg.land(Math.random()*400); } arg.limit(); arg.update(); } } private function attack(s:Number, t:Number, d:Number):Object { return {d:(((t-s)/offset)*speed)+(d*friction), s:s+d}; } private function limit():Boolean { if(x < r) x = r, landed = true; if(y < r) y = r, landed = true; if(x+r > Stage.width) x = Stage.width-r, landed = true; if(y+r > Stage.height) y = Stage.height-r, landed = true; return landed; } private function land(rest:Number):Void { if(++timer >= rest) { timer=0, landed=false; if(hunting) dx = (tx-x)/offset, dy = (ty-y)/offset; if(wandering) { vx = vy = 0; tx = 300+Math.random()*(Stage.width-150); ty = 300+Math.random()*(Stage.height-200); } } } public function initMove(arg:Predator) { if(arg.hunting) { arg.hunting = false, arg.wandering = true; arg.target.isHunted = false; arg.tx = 300+Math.random()*(Stage.width-150); arg.ty = 300+Math.random()*(Stage.height-150); vx = dx/2, vy = dy/2; } else { var rand:Number = Math.floor(Math.random(arg.hunted.length)); arg.target = arg.hunted[rand]; arg.target.isHunted = true; arg.target.offset*=3; var chased:Color = new Color(arg.target.c); chased.setRGB(0x2266FF); arg.hunting = true, arg.wandering = false; } } private function wander():Void { vx += (tx-x)/2000; vy += (ty-y)/8000; x += vx; y += vy; y += Math.sin(vx)*4; } function handle(arg:Predator) { if(wandering) fi.newInterval(300, initMove, arg); } }