开发者

Actionscript 3, rotate object on drag

开发者 https://www.devze.com 2023-03-08 12:22 出处:网络
I have an object I need to rotate by clicking and dragging. Following some AS2 code I got the object to rotate a bit every time the mouse is clicked, but can\'t get it to work with drag.

I have an object I need to rotate by clicking and dragging. Following some AS2 code I got the object to rotate a bit every time the mouse is clicked, but can't get it to work with drag.

needle.addEventListener(MouseEvent.MOUSE_DOWN, fl_ClickToDrag_2);
stage.addEventListener(MouseEvent.MOUSE_UP, fl_ReleaseToDrop_2);

function fl_ClickToDrag_2(event:MouseEvent):void
{

        var angle = Math.atan2(mouseY-needle.y,mouseX-needle.x);
        // apply rotation to handle by converting angle into degrees
        needle.rotation = angle*180/Math.PI;
        // rotate the grip opposite the handle so it won't rotate along with it
        //this.grip._rotation = -this._rotation;
}开发者_开发知识库

function fl_ReleaseToDrop_2(event:MouseEvent):void
{
    needle.stopDrag();
}


Well the problem I see is that the MOUSE_DOWN event only fires once per click, so you only run the code in the handler once.

There could be a better way than this but this is how I'd consider doing it:

EDITED FOR DETAIL:

public class Test extends MovieClip {
    private var n:Needle;

    public function Test() {
        // constructor code
        n = new Needle();

        stage.addEventListener(MouseEvent.MOUSE_DOWN,mouseDownF,false,0,true);
        stage.addEventListener(MouseEvent.MOUSE_UP,mouseUpF,false,0,true);


        n.x = stage.stageWidth/2; //center needle on stage
        n.y = stage.stageHeight/2;
        addChild(n); //add needle to stage
    }
    public function mouseDownF(e:MouseEvent):void {
        stage.addEventListener(MouseEvent.MOUSE_MOVE,rotate,false,0,true);
    }
    public function rotate(e:MouseEvent):void {
        var angle:Number = Math.atan2(mouseY - n.y,mouseX - n.x); //get angle in radians (pythagoras) 

        angle = angle * 180/Math.PI -90; //convert to degrees , the 90 is to have it point to the mouse

        n.rotation = angle; //rotate
    }
    public function mouseUpF(e:MouseEvent):void {
        stage.removeEventListener(MouseEvent.MOUSE_MOVE,rotate);
    }
}

So when the user clicks down (mouseDown) it activates an event listener that fires the rotate handler every time the mouse moves. When the user lets go of the click the event listener is destroyed. The false,0,true); when adding the event listener is to make it a weakly referenced listener so that it gets collected by the garbage collector and doesn't just sit in memory taking up space forever.

0

精彩评论

暂无评论...
验证码 换一张
取 消