home *** CD-ROM | disk | FTP | other *** search
Wrap
function init() { _root.timeslice = 33; _root.level = 1; _root.p1_init = "01"; _root.p2_init = "02"; } function rads2degrees(theta) { return theta / 6.283185307179586 * 360; } function degrees2rads(theta) { return theta / 360 * 2 * 3.141592653589793; } function getMagnitude(deltax, deltay) { trace("get magnitude: ### Square Root!"); var magnitude = Math.pow(Math.pow(deltay,2) + Math.pow(deltax,2),0.5); return magnitude; } function getMagnitudeSq(deltax, deltay) { magsq = deltax * deltax + deltay * deltay; return magsq; } function getAngle(deltax, deltay) { if(deltax == 0) { if(deltay > 0) { theta = 1.5707963267948966; } else { theta = 4.71238898038469; } } else if(deltax < 0) { theta = Math.atan(deltay / deltax) + 3.141592653589793; } else { theta = Math.atan(deltay / deltax); } trace("getAngle"); return theta; } function getDeltax(angle, magnitude) { deltax = magnitude * Math.cos(angle); return deltax; } function getDeltay(angle, magnitude) { deltay = magnitude * Math.sin(angle); return deltay; } function dotProdXY(vector1, vector2) { var ai = vector1.deltax; var bi = vector1.deltay; var xi = vector2.deltax; var yi = vector2.deltay; trace(ai + "," + bi + ";" + xi + "," + yi); dotprod = ai * xi + bi * yi; return dotprod; } function dotProdAM(vector1, vector2) { diffangle = vector1.angle - vector2.angle; var dotprod = vector1.magnitude * vector2.magnitude * Math.cos(diffangle); return dotprod; } function findAngle(vector1, vector2) { if(!vector1.magnitude) { vector1.magnitude = vector1.vecmagnitude(); } if(!vector2.magnitude) { vector2.magnitude = vector2.vecmagnitude(); } theta = Math.acos(dotProdXY(vector1,vector2) / vector1.magnitude * vector2.magnitude); return theta; } function findAngleAM(vector1, vector2) { theta = Math.acos(dotProdXY(vector1,vector2) / vector1.magnitude * vector2.magnitude); return theta; } function getVectorObj(obj1, obj2) { return newVectorPts(obj1._x,obj2._x,obj1._y,obj2._y); } function newVectorPts(x1, x2, y1, y2) { deltax = x2 - x1; deltay = y2 - y1; return new Vector(deltax,deltay); } function VectorAM(angle, magnitude) { this.angle = angle; this.magnitude = magnitude; this.finddy = function() { this.deltay = getDeltay(this.angle,this.magnitude); return this.deltay; }; this.finddx = function() { this.deltax = getDeltax(this.angle,this.magnitude); return this.deltax; }; } function Vector(deltax, deltay) { this.deltax = deltax; this.deltay = deltay; this.vecmagnitude = function() { this.magnitude = Math.pow(Math.pow(deltay,2) + Math.pow(deltax,2),0.5); trace(" ROOT! in vector class"); return this.magnitude; }; this.vecangle = function() { this.angle = _root.getAngle(this.deltax,this.deltay); trace("vecangle"); return this.angle; }; this.finddy = function() { this.deltay = getDeltay(this.angle,this.magnitude); return this.deltay; }; this.finddx = function() { this.deltax = getDeltax(this.angle,this.magnitude); return this.deltax; }; } function vectorSumAM(vector1, vector2) { vector1.finddx(); vector1.finddy(); vector2.finddx(); vector2.finddy(); deltax3 = vector1.deltax + vector2.deltax; deltay3 = vector1.deltay + vector2.deltay; ang = getAngle(deltax3,deltay3); mag = getMagnitude(deltax3,deltay3); vec = new Vector(ang,mag); vec.deltax = deltax3; vec.deltay = deltay3; return vec; } function vectorSum(vector1, vector2) { trace("sum: " + vector1.deltax + " + " + vector2.deltax); deltax3 = vector1.deltax + vector2.deltax; deltay3 = vector1.deltay + vector2.deltay; vec = new Vector(deltax3,deltay3); return vec; } function vectorMultAM(vector1, scalar) { newmag = vector1.magnitude * scalar; vec = new Vector(vector1.angle,newmag); return vec; } function vectorMult(vector1, scalar) { if(!vector1.magnitude) { vector1.magnitude = vector1.vecmagnitude(); } newmag = vector1.magnitude * scalar; vec = new VectorAM(vector1.angle,newmag); return vec; } function checkCollision(obj1, obj2) { distV = getVectorObj(obj1,obj2); distsq = getMagnitudeSq(distV.deltax,distV.deltay); sumRadii = obj2.radius + obj1.radius; mvcheck = obj1.movementvec.magnitude + sumRadii; if(mvcheck * mvcheck < distsq) { return false; } norm = new VectorAM(obj1.movementvec.angle,1); norm.finddx(); norm.finddy(); movD = dotProdXY(distV,norm); if(movD <= 0) { return false; } Fsquared = distsq - movD * movD; sumRadii2 = sumRadii * sumRadii; if(Fsquared >= sumRadii2) { return false; } Tsquared = sumRadii2 - Fsquared; trace("Fsquared: " + Fsquared); trace("Tsquared: " + Tsquared + "(" + sumRadii2 + "-" + Fsquared + ")"); trace("movD: " + movD); if(Tsquared < 0) { return false; } alongmove = movD - Math.pow(Tsquared,0.5); trace(" ROOT ! fourth check"); if(obj1.movementvec.magnitude < alongmove) { return false; } trace("radii: " + obj2.radius + "&" + obj1.radius); dist = Math.pow(distsq,0.5); trace(" ROOT! getting distance"); obj1.tempdist = dist; if(alongmove > 1) { alongmove == 1; } tmpvec = new VectorAM(obj1.movementvec.angle,alongmove); obj1.newxtemp = obj1._x + tmpvec.finddx(); obj1.newytemp = obj1._y + tmpvec.finddy(); trace("want to go " + obj1.movementvec.magnitude + " but am going " + alongmove); return true; } function checkOut(obj, arena) { nextx = obj._x + obj.movementvec.deltax; nexty = obj._y + obj.movementvec.deltay; if(nextx >= arena.xleft && nextx <= arena.xright) { if(nexty - obj.radius >= arena.ytop && nexty + obj.radius <= arena.ybottom) { return false; } normvec = new VectorAM(obj.movementvec.angle,1); normvec.finddx(); normvec.finddy(); if(nexty - obj.radius < arena.ytop) { trace("my Y: " + obj._y); distmag = obj._y - obj.radius - arena.ytop; anglebetween = obj.movementvec.angle - 4.71238898038469; } else if(nexty + obj.radius > arena.ybottom) { distmag = obj._y + obj.radius - arena.ybottom; anglebetween = obj.movementvec.angle + 4.71238898038469; } alongVec = Math.abs(distmag / Math.cos(anglebetween)); trace("distmag: " + distmag + " angle: " + obj.movementvec.angle + " cos: " + Math.cos(obj.movementvec.angle)); trace(" I want to go another " + obj.movementvec.magnitude + " but I\'ll only go " + alongVec + " because distvec=" + distvec.vecmagnitude()); tmpvec = new VectorAM(obj.movementvec.angle,alongVec); tmpvec.finddx(); tmpvec.finddy(); obj.newx = obj._x + tmpvec.deltax; obj.newy = obj._y + tmpvec.deltay; trace("out of the square!" + obj.newy + " vs. " + arena.ytop); return true; } if(nextx <= arena.xleft) { deltax = nextx - arena.xleft; } else { if(nextx < arena.xright) { return false; } deltax = nextx - arena.xright; } deltay = nexty - arena.center; deltaxsq = deltax * deltax; deltaysq = deltay * deltay; dsum = deltaxsq + deltaysq; radsq = (arena.radius - obj.radius) * (arena.radius - obj.radius); if(dsum < radsq) { return false; } distV = new Vector(deltax,deltay); distV.vecmagnitude(); distV.vecangle(); trace(" ROOT - hitting the wall of the arena " + distV.magnitude + ", my magnitude:" + obj.movementvec.magnitude); alongmove = Math.abs(distV.magnitude) - arena.radius + obj.radius; anglebetween = distV.angle - obj.movementvec.angle; alongVec = Math.abs(alongmove / Math.cos(anglebetween)); movalong = obj.movementvec.magnitude - Math.abs(alongVec); trace(" I want to go another " + obj.movementvec.magnitude + " but I\'ll only go " + movalong + " because alongVec=" + alongVec + " and alongMove=" + alongMove); trace(" My dist would be " + distV.magnitude + " on a radius of " + arena.radius); tmpvec = new VectorAM(obj.movementvec.angle,movalong); tmpvec.finddx(); tmpvec.finddy(); obj.newx = obj._x + tmpvec.deltax; obj.newy = obj._y + tmpvec.deltay; return true; } function checkCollisionWall(obj, wall) { distV = getVectorObj(obj,wall); dist = distV.magnitude; sumRadii = wall.radius + obj.radius; dist -= sumRadii; if(obj.movementvec.magnitude < dist) { return false; } trace("** in the circle"); vecV = new Vector(wall.angle,1); vecV.finddx(); vecV.finddy(); distV.finddx(); distV.finddy(); dotF = dotProdXY(obj.movementvec,vecV); if(dotF >= 0) { trace(" wrong way roger? "); return false; } dotG = dotProdXY(distV,vecV); trace("F and G are " + dotF + ", " + dotG); if(dotF - obj.radius > dotG) { trace("** the movement vector (plus the radius of the disc) is smaller than the distance to the plane"); return false; } vecZ = new Vector(wall.angle + 1.5707963267948966,1); vecZ.finddx(); vecZ.finddy(); dotH = dotProdXY(obj.movementvec.vecZ); dotI = dotProdXY(distV,vecZ); addem = dotH + dotI; trace("H and I are " + dotH + ", " + dotI + " and " + addem + "=" + wall.radius); if(Math.abs(dotH - dotI) > wall.radius) { trace("** too far left or right of center"); return false; } trace(" HIT THE WALLL!!!!!!!"); return true; } function collide(obj1, obj2) { distV = getVectorObj(obj1,obj2); temp = distV.vecangle(); normdist = new VectorAM(temp,1); normdist.finddx(); normdist.finddy(); _root.colcount = _root.colcount + 1; trace(obj1._name + "colllllide with " + obj2._name + "(mag " + obj2._movementvec.magnitude + ")"); match = false; if(_root.colcount > 50) { obj1.stoppuck(); obj2.stoppuck(); } if(obj2.mass < 1000) { for(m in _root.arena.moving) { if(_root.arena.moving[m] == obj2) { match = true; } } tempvec = new Vector(0,0); if(!match) { _root.arena.moving.push(obj2); trace("add " + obj2._name); } else { tempvec = obj2.movementvec; } } else { tempvec = new Vector(0,0); } dot1 = dotProdXY(obj1.movementvec,normdist); dot2 = dotProdXY(tempvec,normdist); optP = 2 * (dot1 - dot2) / (obj1.mass + obj2.mass); mult1 = -1 * optP * obj2.mass; nextvec1 = vectorMult(normdist,mult1); mult2 = optP * obj1.mass; nextvec2 = vectorMult(normdist,mult2); nextvec1.finddx(); nextvec1.finddy(); nextvec2.finddx(); nextvec2.finddy(); newvec1 = vectorSum(obj1.movementvec,nextvec1); newvec2 = vectorSum(obj2.movementvec,nextvec2); trace("ROOT - new vectors"); newvec1.vecmagnitude(); newvec1.vecangle(); newvec2.vecmagnitude(); newvec2.vecangle(); trace("nextvecs:" + newvec1.magnitude + " and " + newvec1.angle); obj1.movementvec = newvec1; obj2.movementvec = newvec2; _root.arena.hitpuck.start(); } function collidearena(obj, arena) { nextx = obj._x + obj.movementvec.deltax; nexty = obj._y + obj.movementvec.deltay; trace(" *** BOING ***"); if(nextx >= arena.xleft && nextx <= arena.xright) { if(nexty - obj.radius <= arena.ytop) { trace("bouncing off the top"); normdist = new VectorAM(1.5707963267948966,1); } else if(nexty + obj.radius >= arena.ybottom) { trace("bouncing off the bottom"); normdist = new VectorAM(4.71238898038469,1); } } else { if(nextx >= arena.xright) { distV = newVectorPts(nextx,arena.xright,nexty,arena.center); trace("bouncing off the right curve"); } else if(nextx <= arena.xleft) { distV = newVectorPts(nextx,arena.xleft,nexty,arena.center); trace("bouncing off the left curve"); } else { trace("tried to bounce but don\'t know where I am! X,Y=" + nextx + "," + nexty); clearInterval(_root.arena.motion); } normdist = new VectorAM(distV.vecangle(),1); } normdist.finddx(); normdist.finddy(); dot1 = dotProdXY(obj.movementvec,normdist); tempvec = new Vector(0,0); dot2 = dotProdXY(tempvec,normdist); optP = 2 * (dot1 - dot2) / (obj.mass + arena.mass); mult1 = -1 * optP * arena.mass; nextvec1 = vectorMult(normdist,mult1); nextvec1.finddx(); nextvec1.finddy(); newvec1 = vectorSum(obj.movementvec,nextvec1); newvec1.vecmagnitude(); newvec1.vecangle(); trace(" ROOT - from collision with arena mag: " + newvec1.magnitude + " old mag: " + obj.movementvec.magnitude); obj.movementvec = newvec1; _root.arena.hitarena.start(); } function whack(forcevec, obj) { trace("whack!!!"); forcevec.finddx(); forcevec.finddy(); trace("f: " + forcevec.deltax + "," + forcevec.deltay); trace("a-m: " + forcevec.angle + "," + forcevec.magnitude); trace(obj.movementvec.magnitude); newvec1 = vectorSum(obj.movementvec,forcevec); obj.movementvec = newvec1; obj.movementvec.vecmagnitude(); obj.movementvec.vecangle(); trace("WHACKED: " + obj.movementvec.magnitude); } function checkGoal(obj) { hdeltax = obj._x - _root.arena.target_mc._x; hdeltay = obj._y - _root.arena.target_mc._y; hdeltarad = _root.arena.target_mc.goalradius - 18; trace("goal check X: " + hdeltax + ", Y: " + hdeltay + ", Rad: " + hdeltarad); trace("goal puck X: " + obj._x + ", Y: " + obj._y); if(hdeltax * hdeltax + hdeltay * hdeltay <= hdeltarad * hdeltarad) { return true; } return false; } function checkDeath(zone, obj) { if((obj._x - zone._x) * (obj._x - zone._x) + (obj._y - zone._y) * (obj._y - zone._y) > 90) { return false; } if((obj._x - zone._x) * (obj._x - zone._x) + (obj._y - zone._y) * (obj._y - zone._y) <= (zone.radius - obj._radius * 2) * (zone.radius - obj._radius * 2)) { return true; } return false; } function moveforlaunch(obj) { deltx = obj._x - _root.arena.launchpad._x; delty = obj._y - _root.arena.launchpad._y; ang = getAngle(deltx,delty); mag = _root.arena.launchpad.radius + obj.radius; vec = new VectorAM(ang,mag); nex = vec.finddx(); ney = vec.finddy(); obj._x += nex; obj._y += ney; for(d in _root.arena.objects) { disc = _root.arena.objects[d]; if(disc != this && disc.owner != "n") { test = _root.checkCollision(this,disc); if(test) { separate(obj,disc); } } } } function separate(obj1, obj2) { trace("separate " + obj1._name + " from " + obj2._name); deltx = obj1._x - obj2._x; delty = obj1._y - obj2._y; ang = getAngle(deltx,delty); mag = getMagnitude(deltx,delty); newmag = obj1.radius + obj2.radius + 2 - mag; vec = new VectorAM(ang,newmag); nex = vec.finddx(); ney = vec.finddy(); trace("move " + obj1._name + " this far: " + mag); obj1._x += nex; obj1._y += ney; for(d in _root.arena.objects) { disc = _root.arena.objects[d]; if(disc != obj1) { test = _root.checkOntop(obj1,disc); if(test) { if(disc.owner != "n") { separate(disc,obj1); } } } } if(checkOut(obj1,_root.arena)) { obj1._x = obj1.newx; obj1._y = obj1.newy; } } function checkOntop(obj1, obj2) { trace("Check: is " + obj1._name + " on " + obj2._name + "? " + obj1._x + "=" + obj2._x); deltx = obj1._x - obj2._x; delty = obj1._y - obj2._y; trace(deltx + "^2 + " + delty + "^2 <= (" + obj2.radius + " + " + obj1.radius + ")^2"); trace(deltx * deltx + delty * delty + "<=" + (obj2.radius + obj1.radius) * (obj2.radius + obj1.radius)); if(deltx * deltx + delty * delty <= (obj2.radius + obj1.radius) * (obj2.radius + obj1.radius)) { trace(" YES IT IS!"); return true; } trace("Apparently not."); return false; } trace("INITIALISE!"); init(); trace("geo incl");