Что ж, проблема, которую я вижу, состоит в том, что событие MOUSE_DOWN
срабатывает только один раз за клик, поэтому вы запускаете код в обработчике только один раз.
Возможно, есть и лучший способ, но я бы подумал:
отредактировано для деталей:
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);
}
}
Таким образом, когда пользователь нажимает вниз (mouseDown
), он активирует прослушиватель событий, который запускает обработчик rotate
каждый раз, когда движется мышь. Когда пользователь отпускает щелчок, слушатель события уничтожается. false,0,true);
при добавлении прослушивателя событий должен сделать его прослушивателем со слабой ссылкой , чтобы он собирался сборщиком мусора и не просто оставался в памяти, занимая пространство вечно.