Home Contact RSS

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:
(Either JavaScript is not active or you are using an old version of Adobe Flash Player. Please install the newest 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:

  1. drag = .96;
  2. speed = 0;
  3.  
  4. slider.handle.onPress = function() {
  5. spinning = false;
  6. //drag along the line
  7. 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);
  8. }
  9. slider.handle.onRelease = slider.handle.onReleaseOutside = function() {
  10. this.stopDrag();
  11. }
  12. _root.onEnterFrame = function() {
  13. if (spinning) {
  14. //apply the speed to the rotation
  15. knob._rotation += speed;
  16. //recalculate speed
  17. speed = speed*drag;
  18. //if speed gets unnoticeably tiny just set it to 0
  19. if (Math.pow(speed, 2) < .0001) {
  20. speed = 0;
  21. }
  22. }
  23. else {
  24. //set the rotation from the slider position
  25. knob._rotation = slider.line._x + slider.handle._x + slider.handle._width/2;
  26. }
  27.  
  28. //spit out feedback continuously
  29. feedbackr.text = knob._rotation;
  30. feedbackaccr.text = speed;
  31. }
  32. spinner.onRelease = function() {
  33. //find a random speed
  34. speed = (Math.random()* 50) - 25;
  35. spinning = true;
  36. }

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:
(Either JavaScript is not active or you are using an old version of Adobe Flash Player. Please install the newest 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:

  1. damp = .96; //friction
  2. r = 0; //rotation
  3. accr = 0; //speed of rotation
  4.  
  5. knob.onPress = function() {
  6. dragging = true;
  7. //find mouse y coordinate in relation to knob origin
  8. a = _root._ymouse - knob._y;
  9. //find mouse x coordinate in relation to knob origin
  10. b = _root._xmouse - knob._x;
  11. //using arctangent find the spot of rotation (in degrees)
  12. oldr = Math.atan2(a,b)*180/Math.PI;
  13. }
  14.  
  15. knob.onRelease = knob.onReleaseOutside = function() {
  16. dragging = false;
  17. }
  18.  
  19. knob.onEnterFrame = function() {
  20. if (dragging) {
  21. //find mouse y coordinate in relation to knob origin
  22. a = _root._ymouse-knob._y;
  23. //find mouse x coordinate in relation to knob origin
  24. b = _root._xmouse-knob._x;
  25. //using arctangent find the spot of rotation (in degrees)
  26. r = Math.atan2(a,b)*180/Math.PI;
  27.  
  28. //use current rotation and previous rotation
  29. //to find acceleration
  30. //averages the acceleration with the
  31. //previous acceleration for smoother spins
  32. accr = ((r - oldr) + accr)/2;
  33. //apply the acceleration to the rotation
  34. knob._rotation += accr;
  35. //remember current rotation as old rotation
  36. oldr = r;
  37. feedbacka.text = a;
  38. feedbackb.text = b;
  39. }
  40. else {
  41. knob._rotation += accr;
  42. //apply friction to acceleration force
  43. //and if acceleration gets tiny, just set it to zero
  44. if (Math.pow(accr, 2) > .0001 ) {
  45. accr *= damp;
  46. }
  47. else{
  48. accr = 0;
  49. }
  50. }
  51. //spit out feedback continuosly
  52. feedbackr.text = knob._rotation;
  53. feedbackaccr.text = accr;
  54. }

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
interactive spin fla

Tags: , , , , , , , , , , ,

iKill Game

My BFA exit project. I made this flash game. Long story short, you pick fruit, sell it and buy happy meals. See if you can reach the top scores!

Go here to play iKill

Check out the documentation blog DigMeExit to see the game develop over the semester and even play older version of the game.

iKill Logo

Tags: , , , , , , , ,

Mothorax

A website with an alternative navigation philosophy. The site is a game you must “play” in order to see the content. Use the arrow keys to move around.

(Either JavaScript is not active or you are using an old version of Adobe Flash Player. Please install the newest Flash Player.)

Tags: , , , , ,

Hungry

An experiment with coding in intelligence. The big creature you control with mouse movement, and the little “skeets” hunt you and suck your life. They reproduce over time and continue to eat you. Hide if you can…

(Either JavaScript is not active or you are using an old version of Adobe Flash Player. Please install the newest Flash Player.)

Tags: , , , , ,

Dog Trainer

Here’s a flash version of a java program I wrote. Similar to tamaguchi or nintendogs. Teach the dog to do tricks by rewarding him when he is obedient. Click on the commands: sit, lay, speak, shake and roll over. When he is smart and obedient reward him by clicking on the treat and say good boy! The little bars under the commands show his understanding and learned behavior for that command.

(Either JavaScript is not active or you are using an old version of Adobe Flash Player. Please install the newest Flash Player.)

Tags: , , , ,

Symbiosis

An interactive game of a symbiotic environment. Bugs eat fruit and eventually die. Dead objects fall to the ground.
Enter human, anything you touch will die.

(Either JavaScript is not active or you are using an old version of Adobe Flash Player. Please install the newest Flash Player.)

Tags: , , , , ,

Cartoon Network New Media Intern

CartoonNetwork.com has selected me as their Production Intern for this semester! It will be tough because I’ll be commuting through my last semester at UGA. 3 days a week driving to downtown Atlanta and back after my 8am class. It will be worth it as I’m pretty stoked to be working within the department that makes the most popular online games!
cartoon network logo

Tags: , , , , ,