#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. Ах, большое спасибо 🙂 Сработало отлично. Начинаю жалеть, что в детстве не уделял больше внимания урокам математики.