Ever wanted to be able to click and throw to spin an object?
Try it on the square here!
This code is a bit of a mash of parts I found. You can click and spin the object and when you let go it will continue to spin, eventually coming to a stop.
package com.kafkaris
{
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.events.MouseEvent;
/**
* ...
* @author Jonathan Kafkaris
*/
public class Spin extends Sprite
{
private var _dragging:Boolean;
private var _a:Number;
private var _b:Number;
private var _oldRadius:Number;
private var _square:Sprite;
private var _rad:Number;
private var _accr:Number = 0;
private var _damp:Number = .96;
public function Spin()
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;
_square = new Sprite();
_square.graphics.beginFill(0xCCCCCC);
_square.graphics.drawRect( -100, -100, 200, 200);
_square.graphics.endFill();
_square.x = stage.stageWidth * .5;
_square.y = stage.stageHeight * .5;
addChild(_square);
_square.addEventListener(MouseEvent.MOUSE_DOWN, squareDownHandler, false, 0, true);
}
private function squareDownHandler(e:Event):void
{
_dragging = true;
_a= mouseY - _square.y;
_b= mouseX - _square.x;
_oldRadius = Math.atan2(_a, _b) * 180 / Math.PI;
_square.addEventListener(Event.ENTER_FRAME, squareEnterFrameHandler, false, 0, true);
stage.addEventListener(MouseEvent.MOUSE_UP, stageUpHandler, false, 0, true);
}
private function stageUpHandler(e:MouseEvent):void
{
stage.removeEventListener(MouseEvent.MOUSE_UP, stageUpHandler);
_dragging = false;
}
private function squareEnterFrameHandler(e:Event):void
{
if (_dragging)
{
_a = mouseY - _square.y;
_b = mouseX - _square.x;
_rad = Math.atan2(_a, _b) * 180/Math.PI;
if (_rad - _oldRadius > 160 || _rad - _oldRadius < -160)
{
_accr = ((0) + _accr);
}
else
{
_accr = ((_rad - _oldRadius) + _accr) / 2;
}
_square.rotation += _accr;
_oldRadius = _rad;
}
else
{
_square.rotation += _accr;
if (Math.pow(_accr, 2) > .0001 )
{
_accr *= + _damp;
}
else
{
_accr = 0;
}
}
}
}
}
JK


