PDA

Просмотр полной версии : Стрелочки


fisherman
18.04.2008, 21:01
Привет всем. Такой вопрос: как рисовать программно стрелки с помощью AS? Простмотрев "линию" в AS не обнаружил как сделать её направленной(конец линии должен быть, как в математике у векторов)
И если в AS такого не предусмотрено, то, получаеся, что конец линии программно придется рисовать самому? Помогите разбраться, пожалуйста (примеры с различными методами рисования направленных линий приветствуются) :)
Вот, собственно, весь вопрос.

Vertax
18.04.2008, 21:05
Естественно самому.
Как вариант вот:
SIN = function (ANGLE) {return Math.sin(ANGLE * Math.PI / 180);}
COS = function (ANGLE) {return Math.cos(ANGLE * Math.PI / 180);}

MovieClip.prototype.arrowTo = function (X1, Y1, X2, Y2)
{
angle = Math.floor(180 * Math.atan2((X2 - X1), (Y2 - Y1)) / Math.PI);
this.moveTo(X1, Y1);
this.lineTo(X2, Y2);
this.lineTo(SIN(angle + 150) * 10 + X2, COS(angle + 150) * 10 + Y2);
this.moveTo(X2, Y2);
this.lineTo(SIN(angle - 150) * 10 + X2, COS(angle - 150) * 10 + Y2);
}

this.lineStyle(1, 0xFF0000);
this.arrowTo(100, 100, 200, 200);
this.arrowTo(200, 200, 400, 200);
this.arrowTo(400, 200, 50, 100);

fisherman
19.04.2008, 14:02
Едрёно, надо сказать, написано. Даже разобравшись в используемых функциях, сложно понять, как до этого самому дойти можно было). Можно ещё небольшой вопросик? Как написать действие, допустим, той же стрелки, на событие Startdrag другого мувиэклипа. Или пошире (ибо нужна лишь метода).. Любое действие какого-то конкретного клипа на событие Starеdrag другого клипа.
Пример со стрелками хорош, спасибо большое.

lexo2000
19.04.2008, 19:24
Можно поступить так - координаты начала линии принять за Х1 и Y1 из данного примера, координаты клипа (который StartDrag) за Х2 и Y2 соответственно, ну и далее по тексту. И будет вам стрелочка и клипу, если вы, конечно, это имели ввиду.

fisherman
20.04.2008, 13:19
Нет, мне нужно перерисовывать стрелку при изменении координат клипа, допустим перетаскиваем клип, стрелка заново к нему рисуется. Рисоваться и затираться, конечно, будет много раз, чтобы для пользователя она "тянулась за клипом". Нужно писать код внутри стрелки. Имя клипа заранее известно. Казалось бы все просто setInterval - в нем затирать(clear) и перерисовывать(arrowTo), но на событие onPress уже описаны действия внутри самого клипа. Если внутри стрелки на onPress что-то писать - призойдет перекрытие. Поэтому пока для меня не ясно что сделать.. А создать свое событие startDrag(какой-то конкретный клип) можно?

Vertax
20.04.2008, 20:09
На базе все того же кода.
Есть клипы clip1 и clip2
updateArrow = function (X1, Y1, X2, Y2)
{
this.clear();
this.lineStyle(1, 0xFF0000);
angle = Math.floor(180 * Math.atan2((X2 - X1), (Y2 - Y1)) / Math.PI);
len = Math.sqrt((X2 - X1) * (X2 - X1) + (Y2 - Y1) * (Y2 - Y1));
for (i = 0; i < 150; i++) if (!clip2.hitTest(SIN(angle) * (len - i) + X1, COS(angle) * (len - i) + Y1, true))break;
this.arrowTo(X1, Y1, SIN(angle) * (len - i) + X1, COS(angle) * (len - i) + Y1);
}

clip1.onPress = clip2.onPress = function ()
{
startDrag(this);
updateArrow(clip1._x + clip1._width / 2, clip1._y + clip1._height / 2, clip2._x + clip2._width / 2, clip2._y + clip2._height / 2);
onMouseMove = function (){updateArrow(clip1._x + clip1._width / 2, clip1._y + clip1._height / 2, clip2._x + clip2._width / 2, clip2._y + clip2._height / 2);}
}

clip1.onRelease = clip2.onRelease = clip1.onReleaseOutside = clip2.onReleaseOutside = function ()
{
stopDrag();
delete onMouseMove;
}

updateArrow(clip1._x + clip1._width / 2, clip1._y + clip1._height / 2, clip2._x + clip2._width / 2, clip2._y + clip2._height / 2);

lexo2000
20.04.2008, 20:23
нет, startDrag - это метод, событие создать нельзя. зато есть событие mouseMove, к которому можно написать обработчик, затирающий/ перерисовывающий стрелку.
кстати, может это и не совсем "чистый" подход, но я в подобной ситуации вопрос со стрелкой решил немного по другому. создал клип стрелки, в нужный момент прикреплял его к перетаскиваемому клипу, и управлял его вращением. а линию, само собой - перерисовывал...
так что возможны варианты...