Free ActionScript

Home

AS3 Scripts

AS2 Scripts

Resources

About

Contact

Totally rewrote my previous AS3 smooth follow and rotation script.

This version fixes all the previous issues and optimizes everything. No more “jumpy” rotation.

Click and hold to make the player smoothly rotate to and follow the mouse:

/** * Player Movement - Follow Mouse on click with Easing and smooth rotation * --------------------- * VERSION: 2.0 * DATE: 1/18/2011 * AS3 * UPDATES AND DOCUMENTATION AT: http://www.FreeActionScript.com **/ package { import flash. display . MovieClip ; import flash. events . Event ; import flash. events . MouseEvent ; public class Main extends MovieClip { // player settings private var _moveSpeedMax: Number = 1000 ; private var _rotateSpeedMax: Number = 15 ; private var _decay: Number = .98; private var _destinationX: int = 150 ; private var _destinationY: int = 150 ; // player private var _player: MovieClip ; // global private var _isActive: Boolean = false ; private var _dx: Number = 0 ; private var _dy: Number = 0 ; private var _vx: Number = 0 ; private var _vy: Number = 0 ; private var _trueRotation: Number = 0 ; /** * Constructor */ public function Main ( ) { // create player object createPlayer ( ) ; // add listeners stage . addEventListener ( Event. ENTER_FRAME , enterFrameHandler ) ; stage . addEventListener ( MouseEvent. MOUSE_UP , onMouseUpHandler ) ; stage . addEventListener ( MouseEvent. MOUSE_DOWN , onMouseDownHandler ) ; } /** * Creates player */ private function createPlayer ( ) : void { _player = new Player ( ) ; _player. x = stage . stageWidth / 2 ; _player. y = stage . stageHeight / 2 ; stage . addChild ( _player ) ; } /** * EnterFrame Handlers */ private function enterFrameHandler ( event:Event ) : void { updatePosition ( ) ; updateRotation ( ) ; } /** * Calculate Rotation */ private function updateRotation ( ) : void { // calculate rotation _dx = _player. x - _destinationX; _dy = _player. y - _destinationY; // which way to rotate var rotateTo: Number = getDegrees ( getRadians ( _dx, _dy ) ) ; // keep rotation positive, between 0 and 360 degrees if ( rotateTo & gt; _player. rotation + 180 ) rotateTo -= 360 ; if ( rotateTo & lt; _player. rotation - 180 ) rotateTo += 360 ; // ease rotation _trueRotation = ( rotateTo - _player. rotation ) / _rotateSpeedMax; // update rotation _player. rotation += _trueRotation; } /** * Calculate Position */ private function updatePosition ( ) : void { // check if mouse is down if ( _isActive ) { // update destination _destinationX = stage . mouseX ; _destinationY = stage . mouseY ; // update velocity _vx += ( _destinationX - _player. x ) / _moveSpeedMax; _vy += ( _destinationY - _player. y ) / _moveSpeedMax; } else { // when mouse is not down, update velocity half of normal speed _vx += ( _destinationX - _player. x ) / _moveSpeedMax * .25; _vy += ( _destinationY - _player. y ) / _moveSpeedMax * .25; } // apply decay (drag) _vx * = _decay; _vy * = _decay; // if close to target, slow down turn speed if ( getDistance ( _dx, _dy ) & lt; 50 ) { _trueRotation * = .5; } // update position _player. x += _vx; _player. y += _vy; } /** * Mouse DOWN handler * @param e */ private function onMouseDownHandler ( e :MouseEvent ) : void { _isActive = true ; } /** * Mouse UP handler * @param e */ private function onMouseUpHandler ( e :MouseEvent ) : void { _isActive = false ; } /** * Get distance * @param delta_x * @param delta_y * @return */ public function getDistance ( delta_x: Number , delta_y: Number ) : Number { return Math . sqrt ( ( delta_x * delta_x ) + ( delta_y * delta_y ) ) ; } /** * Get radians * @param delta_x * @param delta_y * @return */ public function getRadians ( delta_x: Number , delta_y: Number ) : Number { var r: Number = Math . atan2 ( delta_y, delta_x ) ; if ( delta_y & lt; 0 ) { r += ( 2 * Math . PI ) ; } return r; } /** * Get degrees * @param radians * @return */ public function getDegrees ( radians: Number ) : Number { return Math . floor ( radians / ( Math . PI / 180 ) ) ; } } }

Download Fla Sample

Huge improvement!

Have you thought about adding your vector info to the DisplayObject so you do not have to define them one by one?

_player.dx = value ect. as well as _player.x = value

Thanks for the post

Thanks UsusIpse!

Ideally, Player should be its own class that holds these values.

Since I kept everything in one class (for simplicity’s sake), I also left the vector values there.

Thank you for your input. Highly appreciated!

Does not compile. Player() is an undefined method. I’m kinda new at this. Is there something I’m missing, or is there a class file missing from the download?

iburry,

Player() is an exported movieclip in the library of the fla.

Wow! Thank you! I had a problem rotating my object. My gun class was moving the other way when it passed the 270 degree mark and the rotation went back to -90, messing up the difference between the desired rotation destination and actual rotation. But thank to a few lines of your code (where you correct the mistake by taking or adding 180 degrees, i was able to make it work properly! Thank you!

Ghosti, that’s a tricky issue to figure out (took me a while!). Glad it helped

I’m kinda new in this whole programming business. Thanks to your scripts I have learned a lot. Now I’m courious about one thing. If you click between two consecutive frames there is no effect, i.e. player is not moving toward new direction. Was that your intention? I have written few lines of code to “fix” this. If you are interested I could send this file to you.

You must be logged in to post a comment.

AS3 Effects

AS3 Gadgets

Game Examples AS2 Effects Animated Effects Dynamic Enemy AI Game Engine Game Weapons Images Interface Math Security

Effects Animated

Effects Dynamic

Enemy AI

Game Engine

Game Weapons

Images

Interface

Math

Security

Game Examples AS3 Basics Bitmap Blitting Collision Detection Enemy AI Movement Physics Space Shooter User Interface Weapon System

Basics

Bitmap Blitting

Collision Detection

Movement

Physics

Space Shooter

User Interface

Weapon System

Site Updates

718Hosting.com

Actionscript.org Forums

Flash Game Blogs

Flash Game License

Flashkit Forums

gotoAndLearn

IndieGames.com

Kirupa’s Tutorials

Kongregate Forums

MochiAds Resources

Philip Radvan

Photon Storm

Polygonal

Radvan Media

Tonypa’s Tutorials

Register

Log in

Entries RSS

Comments RSS

WordPress.org