Here's a basic script that can make a movieclip point at another object.
MovieClip.prototype.pointAt = function(x,y) { var dx = x  this._x; // distance to other object on xaxis var dy = y  this._y; // distance on yaxis var dist = Math.sqrt(dx*dx + dy*dy); // true distance (using Pythagorean theorem) var angle; // figure out angle in radians (0 2*PI) if (dy < 0) angle = Math.PI*2Math.acos(dx/dist); else angle = Math.acos(dx/dist); // convert to rotation value (angle in degrees or 0360) this._rotation = angle*180/Math.PI; }
Math Explanation
The function that does all the work here is Math.acos(). The Math.acos() function is the compliment of the Math.cos() function. On another tutorial here, you may have seen how to use Math.cos() and Math.sin() to draw circle shapes using polar coodinates.
Math.cos() takes an angle (expressed in radians, or going from 0 to 2*PI instead of 0 to 360) and converts it to a position on a circle.
Given an angle (expressed in degrees) and a radius, a point on a circle is given by:
x = Math.cos(angle*Math.PI/180)*radius; y = Math.sin(angle*Math.PI/180)*radius;
The Math.acos() function I'm using does the reverse, it converts the value returned by Math.cos() back into an angle in radians. So by reversing the math of the above equations for using polar coordinates, we can determine the original angle in radians. Then, to convert this angle to a rotation value (which is in degrees) we scale it by the ratio betwen degres and radians: 360 / (2*PI) which is the same as 180 / PI.
How to use the script
Here's a script, which works with the above script to make a movieclip point in the direction of the mouse.
mc.pointAtMouse = function() { this.pointAt(this._parent._xmouse, this._parent._ymouse); }
Let's say your have a movieclip that you want to point at the mouse, you can do the following to make this happpen:
mc.onEnterFrame = mc.pointAtMouse;
OR you can call this.pointAtMouse() from within a more complex onEnterFrame function.
Finally, this script assumes that your object points to 3:00 (to the right) when it is in it's 'normal' (rotation=0) state. If it doesn't, you'll need to add an offset to the rotation value. Here's a version of the function which accepts an offset. If your object normally points at 12:00 (upwards) then use 90 to correct it.
MovieClip.prototype.pointAt = function(x,y,offset) { var dx = x  this._x; // distance to other object on xaxis var dy = y  this._y; // distance on yaxis var dist = Math.sqrt(dx*dx + dy*dy); // true distance (using Pythagorean theorem) var angle; // figure out angle in radians (0 2*PI) if (dy < 0) angle = Math.PI*2Math.acos(dx/dist); else angle = Math.acos(dx/dist); // convert to rotation value (angle in degrees or 0360) this._rotation = offset + angle*180/Math.PI; }
Example usage for object which normally points upwards (12:00):
this.pointAt(this._parent._xmouse, this._parent._ymouse, 90);
 jim
» Level Intermediate 
Added: 20040315 Rating: 7.17 Votes: 24 
» Author 
Professional C/C++ programmer and flash hobbyist. 
» Download 
Download the files used in this tutorial. 
Download (0 kb) 
» Forums 
More help? Search our boards for quick answers! 

You must have javascript enabled in order to post comments.
Comments
There are no comments yet. Be the first to comment!