Interactive Spin Actionscript Tutorial

    I have been thinking of different interactions that are possible with objects. If you’ve read this blog at all you’ll know that I’ve played with physics and gravity and throwing balls and bouncing balls and all sorts. But I hadn’t wrapped my head around an interactive spinner. I know it’d be easy to make a slider or something that would apply a spin to an object, but this just isn’t interactive enough for me.

    Circle with slider to rotate and button for random spin:

    Get Adobe Flash player

    This attempt at spinning is ok. I mean, it spins the object and it even glides to a stop if you press the button for a random spin… But it’s just not intuitive and not fun. But if you want this, here’s how I did it.

    Actionscript:

    drag = .96;
    speed = 0;

    slider.handle.onPress = function() {
    spinning = false;
    //drag along the line
    this.startDrag(true, slider.line._x-slider.handle._width/2, slider.line._y-slider.handle._height/2, slider.line._width-slider.handle._width/2, slider.line._y-slider.handle._height/2);
    }
    slider.handle.onRelease = slider.handle.onReleaseOutside = function() {
    this.stopDrag();
    }
    _root.onEnterFrame = function() {
    if (spinning) {
    //apply the speed to the rotation
    knob._rotation += speed;
    //recalculate speed
    speed = speed*drag;
    //if speed gets unnoticeably tiny just set it to 0
    if (Math.pow(speed, 2) < .0001) {
    speed = 0;
    }
    }
    else {
    //set the rotation from the slider position
    knob._rotation = slider.line._x + slider.handle._x + slider.handle._width/2;
    }

    //spit out feedback continuously
    feedbackr.text = knob._rotation;
    feedbackaccr.text = speed;
    }
    spinner.onRelease = function() {
    //find a random speed
    speed = (Math.random()* 50) - 25;
    spinning = true;
    }

    I want to grab it and spin it though. I want to apply the same principles from physics, like acceleration and friction as forces to the object, so I can grab to spin and release to watch it glide gracefully to a stop. I’ve been thinking about this and how I’d have to use trigonometry and stuff to do it. One day I finally had the time and tried it out. It took me a minute but I figured out that what I needed was arctangent. So (with pointers from jbum, thanks Jim!) I came up with this:

    Interactive grab-able circle to spin and twirl:

    Get Adobe Flash player

    This one is much more interactive and intuitive. I really think this is because there are no sliders or buttons, no controls, just an object to interact with. It’s much more like real life!

    Steps:

    In order to make a grab and spin object
    1. You have to know where you grab. The user clicks on the shape (knob) and you must figure out what degree or rotation point they have started at. (atan2)
    2. As the knob is clicked and the mouse moves (dragging), calculate new rotation by mouse position
    3. When mouse is released figure out the current speed of rotation and apply it to the knob with friction, so it can be thrown and spun in that way. (Of course this is optional, if you just want to spin it when the mouse is down you’re done at step 2)

    Actionscript:

    damp = .96; //friction
    r = 0; //rotation
    accr = 0; //speed of rotation

    knob.onPress = function() {
    dragging = true;
    //find mouse y coordinate in relation to knob origin
    a = _root._ymouse - knob._y;
    //find mouse x coordinate in relation to knob origin
    b = _root._xmouse - knob._x;
    //using arctangent find the spot of rotation (in degrees)
    oldr = Math.atan2(a,b)*180/Math.PI;
    }

    knob.onRelease = knob.onReleaseOutside = function() {
    dragging = false;
    }

    knob.onEnterFrame = function() {
    if (dragging) {
    //find mouse y coordinate in relation to knob origin
    a = _root._ymouse-knob._y;
    //find mouse x coordinate in relation to knob origin
    b = _root._xmouse-knob._x;
    //using arctangent find the spot of rotation (in degrees)
    r = Math.atan2(a,b)*180/Math.PI;

    //use current rotation and previous rotation
    //to find acceleration
    //averages the acceleration with the
    //previous acceleration for smoother spins
    accr = ((r - oldr) + accr)/2;
    //apply the acceleration to the rotation
    knob._rotation += accr;
    //remember current rotation as old rotation
    oldr = r;
    feedbacka.text = a;
    feedbackb.text = b;
    }
    else {
    knob._rotation += accr;
    //apply friction to acceleration force
    //and if acceleration gets tiny, just set it to zero
    if (Math.pow(accr, 2) > .0001 ) {
    accr *= damp;
    }
    else{
    accr = 0;
    }
    }
    //spit out feedback continuosly
    feedbackr.text = knob._rotation;
    feedbackaccr.text = accr;
    }

    I commented the code to explain what is happening, if you need more just post a comment. Let me know if you find this useful and what you end up making with it.

    Downloads:

    spin.fla and interactiveSpin.fla

    This entry was posted in portfolio, tutorial and tagged , , , , , , , , , , , . Bookmark the permalink. Post a comment or leave a trackback: Trackback URL.

    14 Comments

    1. Posted March 17, 2008 at 1:24 am | Permalink

      Hi Evan

      Grab the knob and rotate it all the way around for one revolution without letting go.

      There is a rather violent movement when the user rotates the knob all the way through x < 0 and when y passes through 0 (positive to negative or negative to positive). It jumps to the other side (180 deg away) and then rapidly comes back again.

      I would suggest not using atan2 and using only sine to determine your rotation.

    2. Posted March 17, 2008 at 10:11 am | Permalink

      Thanks for catching that Zac, I hadn’t noticed that hiccup in there…
      It seems to be when it is calculating the acceleration as you drag through the negative x-axis (from the origin of the knob). It’s because I’m using the difference between old rotation and current rotation to find the acceleration (line 32), and when oldr is -179 and new is 180 that makes for quite a bit of acceleration… accr = ((r – oldr) + accr)/2; … it helps I guess that it’s averaged with the old accr, but it doesn’t correct it by any means.
      When I have some time I’ll have to get in and map the accr calculation correctly to see the values as circular, … 178, 179, 180, -179, -178 …

    3. Posted May 24, 2008 at 4:58 pm | Permalink

      Here’s a fix, albeit not perfect, to the above mentioned problem. Within the onEnterFrame actions, find the line that says:

      accr = ((r-oldr)+accr)/2;

      and change it to this….

      if (r-oldr > 160 || r-oldr < -160){
      accr = ((0)+accr);
      }else{
      accr = ((r-oldr)+accr)/2;
      }

      I’m in the process of implementing this code into a project. When it’s ready I’ll try to remember to link it.

    4. Craig
      Posted July 1, 2008 at 10:56 pm | Permalink

      thanks you guys both. This is perfect for what i am doing. (making tutorials for a gas-fitting school), i am going to try apply this rotation to one of the gas taps. Just have to figure out how to make a ‘maximum’ amount of turns.

    5. Gerald
      Posted October 6, 2008 at 8:23 pm | Permalink

      Great tutorial. One question, how would I make the knob only spin a certain degree? Say if I wanted this to be a volume knob and would want it to only spin a certain degree as if turning the knob on a speaker amplifier. Thanks!

    6. Damion Murray
      Posted February 24, 2009 at 10:54 am | Permalink

      There are two solutions to the rotation problem. One involves using vector math to find angular displacements by first mapping flash’s piece-wise rotational range of [0, -180][180, 0] to the standard [0, 360] rotational range typically used in math, applying the Vector Dot Product to find the smaller angle between two vectors and finally determining the direction of rotation (clockwise or counter-clockwise). This is the most robust solution since it is based on standard mathematical models of rotation. But most Flash Developers coming from a design background may have trouble grappling with its more technical aspects. The second, more accessible solution involves exploiting the relationships between nested clips. But that’s all I am going to say on the matter. Half the fun is figuring stuff out for oneself.

    7. rihamfathy
      Posted April 7, 2009 at 10:06 am | Permalink

      i have a question!!
      how can i make the object 3d and move it in all directions
      (if i have a footage of anything such as a mobile and i want to make it 3d) how can i modify this script to do what i want??
      thanks in advanced…

    8. Posted May 8, 2009 at 12:48 pm | Permalink

      Thank you, Evan. I have looking for a navigation wheel that I could spin and this is perfect for it.

    9. munaji
      Posted June 23, 2010 at 9:35 am | Permalink

      thanks for the lesson

    10. von
      Posted July 13, 2010 at 4:06 pm | Permalink

      Hi,
      could you convert this to as3-if you have a chance?

    11. Daniel
      Posted July 23, 2010 at 10:38 am | Permalink

      Hi,

      I’m currently trying to use the rotator but would like to set it so the circle can only turn to half-way (turn 180 degrees) and no further.
      If there is any chance you could be of assistance it would be a great help.

      Thankyou

      • Posted August 2, 2010 at 9:40 am | Permalink

        @von – I have this on my list to convert to as3, it’s only a matter of affording the time to do it and then remembering to post it ;)

        @Daniel- You would just need to set the limits and add a clause around the lines that apply the rotation transformation. Check to see if it would cause the value to go out of bounds and reel it back in if needed. Looks like lines 34 and 41. Best of luck

        • RANJAN MANI
          Posted September 22, 2011 at 1:16 am | Permalink

          Hello Evans,
          I need a help from you……..
          I am in the process of creating a rotating knob with push function……
          how to program both rotate and press function in to single object in AS3…….Please help…..

    12. Posted November 12, 2010 at 9:03 pm | Permalink

      Hello,

      This is a great example, but do you have an AS3 version?

      Thanks
      Garrett

    One Trackback

    1. By [Flash CS3] - Drehknopfprobleme ... - Flashforum on January 8, 2010 at 6:29 am

      [...] hab grad beim suchen folgenden Link gefunden: Interactive Spin Actionscript Tutorial | circlecube Vielleicht hilft dir das weiter. Greets Schnetty __________________ Chaos ist nur eine [...]

    Post a Comment

    Your email is never published nor shared. Required fields are marked *

    *
    *

    You may use these HTML tags and attributes: <a href="" title="" rel=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

    • Recent Posts

      WordPress updates plugin directory

      New additions to the plugin directory include: favorites, incorporating support forums into it's own tab for each plugin as well as support stats being displayed! Great! I think we also need the ability to give plugins ratings and reviews (bonus points if it can be done from within a wordpress admin dashboard when installing plugins). [...]

      Short Head

      Use zipf's short head to tune your website rather than redesign the whole thing. To make a website successful it needs to meet the needs of the users. Find out what those needs are by using the short head philosophy to equate most searched things as the biggest needs of the users. Use personas to [...]

      Img Set?

      Great article at a list apart discusing the state of the industry regarding responsive images. This picks apart the set attribute of the img element from a surprisingly objective view coming from someone so close to the picture element. Insightful discussion about the principle behind the proposals than the actual solution too. If the working [...]

      Triudo

      A mesmerizing animated triangle-ish shape form. Embedded Link triduo triduo Tweet

      Git – the paradigm shift

      A great developer story about the differences on what Git is vs other version control and what Git is not. This is how we should learn it. I heard over and over that it was distributed, but never grasped what that meant, so here are a few links and explanations that will help unlearn version [...]

      Tweening Lib comes to Javascript!

      I'm very excited to share the news that the tween library from GreenSock (hands down the best tweening library I used in flash) is not ported for use in javascript! This will be great! I missed that simple syntax from as3 when animating javascript, and now I can have my cake and eat it too. [...]

      Responsive CSS Tricks

      Here are a few useful css tricks to remember when building responsive design sites from web designer wall Embedded Link 5 Useful CSS Tricks for Responsive Design Making the design to be responsive is very easy as shown in my Responsive Design in 3 Steps tutorial, but maintaining the elements to look aesthetically balanced on [...]

      Picture element of srcset attribute?

      Bruce details the reasons and story behind the srcset attribute which is now introduced as an alternative to the picture element. Some aspects of the attribute are nice (like the fact that it's an attribute and not a new element, so it's creating up new elements with for problems. It's adapting currently used elements to [...]

      SVG Preloader with Raphael JS

      Here's a very creative use of using a newly available technology. Using svg graphics which are very lightweight, for a website preloader. I like the animation used as well. Embedded Link Make a stylish preloader with SVG | Tutorial | .net magazine Many sites neglect users with slow connections. Ian Culshaw explains how to use [...]

      CSS3 Button/Icon set

      I've been secretly hoping to see a few of these pop up once the whole icon font idea spread through the nets. I really like this idea and it's a very nice implementation too! I only see some quality issues on a couple of the icons (such as youtube), but it's awesome and I hope [...]

    • Recent Comments

      Bruce Brownlee

      Bruce Brownlee

      Ah IE6. I'd have 2 more years of sleep without IE6. Margin doubling, no properties,...
      versaena

      versaena

      how to give color at runtime…… thank you
      Mobile Websites

      Mobile Websites

      I disagree, mobile websites are the future – desktop websites and mobile websites...
      Matt Fasick

      Matt Fasick

      That's cool. I like the ripple effect as well.
      Nico

      Nico

      hi! really great job guy! very impressive.. just a question… do u have a solution to do a refresh...
      Evan Mullins

      Evan Mullins

      Agreed! I've just seen some people get pretty heated about separating all functionality...