Actionscript 3, поворот объекта при перетаскивании

#actionscript #rotation #drag

#actionscript #вращение #перетаскивание

Вопрос:

У меня есть объект, который мне нужно повернуть, щелкнув и перетащив. Следуя некоторому коду AS2, я заставил объект немного поворачиваться при каждом нажатии мыши, но не могу заставить его работать с перетаскиванием.

 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();
}
  

Ответ №1:

Ну, проблема, которую я вижу, заключается в том, что 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); При добавлении прослушивателя событий необходимо сделать его слушателем со слабыми ссылками, чтобы он собирался сборщиком мусора, а не просто оставался в памяти, вечно занимая место.

Комментарии:

1. Хм, спасибо, это немного улучшило бота, не намного. Стрелка MC поворачивается под разными углами и не перемещается с помощью мыши. когда я щелкаю и перетаскиваю, MC переходит к новому повороту, и если я еще немного подвигаю мышью, он переходит в новое положение. Также он вращается только по часовой стрелке.

2. Это может быть как-то связано с вращением моего MC. Символ указывает вправо.

3. Нет, все еще не работает, не следует за мышью, только привязывается к новому углу. Кто-нибудь?

4. Все еще немного дергано, но я протестировал код, который я добавил к своему ответу, и он работает.

5. Ах, большое спасибо 🙂 Сработало отлично. Начинаю жалеть, что в детстве не уделял больше внимания урокам математики.