Я согласен с Органисом. Я попробовал второй вариант, потому что я лучше понимаю, как он работает, и он отлично работает для меня.

ершенно новичок в ActionScript, и теперь немного застрял. Я пытаюсь сделать стрелку, которая закреплена на одном конце, но заостренный конец должен перетаскиваться с помощью перетаскивания мышью, таким образом растягивая и поворачивая стрелку. Было бы также здорово, если бы я мог удерживать кончик треугольника стрелки от изменения размера при перетаскивании. Я думал о создании видеоклипа, состоящего из кончика и линии по отдельности, причем линия выполняет все «растягивание», а кончик просто следует вокруг. Я просто не уверен, как.

Большинство документов, которые я нашел о перетаскивании мышью, касаются перемещения целого элемента, а не только одной части, при этом оставаясь прикрепленным к остальным. Я нашел кое-что о вращении стрелки с помощью мышиВот, но это только частично помогает моей проблеме, поскольку ничего не говорит о том, чтобы одновременно увеличить стрелку.

У кого-нибудь есть идеи о том, как это реализовать?

 Organis24 нояб. 2017 г., 07:52
Вам необходимо рассчитать расстояние между мышью и стрелками (0,0) с помощьюen.wikipedia.org/wiki/Pythagorean_theorem затем масштабируйте стрелку и установите стрелку.

Ответы на вопрос(1)

Решение Вопроса

В Adobe Animate импортируйте или нарисуйте свою стрелку.Преобразуйте ваше растровое изображение или форму в мувиклип (Изменить -> Преобразовать в символ)В появившемся диалоговом окне проверьте«Включить направляющие для 9-фрагментного масштабирования», затем нажмите ОК.Теперь дважды щелкните новый мувиклип, чтобы отредактировать его. Вы увидите, что есть линии (направляющие). При вертикальном масштабировании растягиваются / масштабируются только области в средних 3 рядах.Перемещайте направляющие до тех пор, пока они не будут соответствовать скриншоту (только часть стрелки, которую вы хотите растянуть, находится посередине), а также, для удобства, выровняйте ее так, чтобы+ (опорная точка) находится в точном положении основания стрелки.Теперь, поскольку 9-фрагментное масштабирование не очень хорошо работает с вращением, мы собираемся вложить этот фрагмент ролика со стрелкой в ​​контейнер MovieClip. Вернитесь к основной временной шкале. Дайте стрелке свой клипимя экземпляра изarrowInner.С участиемarrowInner выбран / сосредоточен, нажмите F8 (илиИзменить -> Преобразовать в символ) чтобы обернуть этот объект внутри другого мувиклипа - нажмите ОК в диалоговом окне (не отмечайте ни один из параметров).Дайте этому новому MovieClip имя экземпляраarrowOuter, Дважды щелкните по нему, чтобы отредактировать его и выровнятьarrowInner поэтому точка привязки у основания стрелки (такая же, как вы делали раньше внутриarrowInner).

Теперь пришло время кода, откройте редактор кода на главной временной шкале и вставьте следующее (объяснения см. В комментариях к коду).

//we want a function to fun every frame tick of the applicaiton
this.addEventListener(Event.ENTER_FRAME, enterFrame);

//create some helper vars that are used in the enterFrame handler
//arrowPoint is just the point of the base of the outer arrow
var arrowPoint:Point = new Point(arrowOuter.x,arrowOuter.y);

//this will store the current mouse point
var mousePoint:Point = new Point();

//this will store the radian rotation of the arrow needed to point it at the mouse
var radians:Number;

function enterFrame(e:Event):void {
    //set the global mouse point
    mousePoint.x = stage.mouseX;
    mousePoint.y = stage.mouseY;

    //calculate the distance between the two points (mouse and arrow base).
    //set the height of the inner arrow to that distance
    arrowOuter.arrowInner.height = Point.distance(arrowPoint, mousePoint);

    //get the angle needed for the arrow to point at the mouse.
    radians = Math.atan2(stage.mouseY - arrowOuter.y, stage.mouseX - arrowOuter.x);

    //convert the radians to degrees,  add 90 to compensate for the starting position of the arrow
    arrowOuter.rotation = 90 + (radians * (180/ Math.PI));
}

Если 9-фрагментное масштабирование не ваша вещь (это не мое), то это всего лишь немного больше работы:

Создайте свой стержень стрелы и наконечник стрелы как отдельные части. Дайте им имена экземпляровhead а такжеshaft соответственно. Создайте стрелку, чтобы она указывала вправо.

Выберите их обоих и вложите в мувиклип (F8). Дайте этому новому контейнерному муви клипу имя экземпляраarrowи убедитесь, что его опорная точка - самая левая часть вала посередине (противоположный конец от точки стрелки).

используйте следующий код:

this.addEventListener(Event.ENTER_FRAME, enterFrame);

var arrowPoint:Point = new Point(arrow.x, arrow.y);
var mousePoint:Point = new Point();
var radians:Number;
var distance:Number;

function enterFrame(e:Event):void {
    mousePoint.x = stage.mouseX;
    mousePoint.y = stage.mouseY;

    distance = Point.distance(arrowPoint, mousePoint);

    //stretch the shaft to the full distance less the size of the arrow head
    arrow.shaft.width = distance - arrow.head.width;
    //move the arrow head to the end of the shaft
    arrow.head.x = arrow.shaft.width;

    radians = Math.atan2(stage.mouseY - arrow.y, stage.mouseX - arrow.x);
    arrow.rotation = radians * (180/ Math.PI);
} 
 Organis24 нояб. 2017 г., 22:45
Это чертовски классный урок!
 Murmeltier25 нояб. 2017 г., 14:48
Я согласен с Органисом. Я попробовал второй вариант, потому что я лучше понимаю, как он работает, и он отлично работает для меня.

Ваш ответ на вопрос