![]() |
|
||||||||||
|
|||||
|
Регистрация: Apr 2008
Сообщений: 16
|
Привет всем. Такой вопрос: как рисовать программно стрелки с помощью AS? Простмотрев "линию" в AS не обнаружил как сделать её направленной(конец линии должен быть, как в математике у векторов)
И если в AS такого не предусмотрено, то, получаеся, что конец линии программно придется рисовать самому? Помогите разбраться, пожалуйста (примеры с различными методами рисования направленных линий приветствуются) Вот, собственно, весь вопрос. |
|
|||||
|
Регистрация: Oct 2005
Сообщений: 207
|
Естественно самому.
Как вариант вот: 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);
Последний раз редактировалось Vertax; 19.04.2008 в 20:31. |
|
|||||
|
Регистрация: Apr 2008
Сообщений: 16
|
Едрёно, надо сказать, написано. Даже разобравшись в используемых функциях, сложно понять, как до этого самому дойти можно было). Можно ещё небольшой вопросик? Как написать действие, допустим, той же стрелки, на событие Startdrag другого мувиэклипа. Или пошире (ибо нужна лишь метода).. Любое действие какого-то конкретного клипа на событие Starеdrag другого клипа.
Пример со стрелками хорош, спасибо большое. |
|
|||||
|
Регистрация: Dec 2007
Сообщений: 23
|
Можно поступить так - координаты начала линии принять за Х1 и Y1 из данного примера, координаты клипа (который StartDrag) за Х2 и Y2 соответственно, ну и далее по тексту. И будет вам стрелочка и клипу, если вы, конечно, это имели ввиду.
|
|
|||||
|
Регистрация: Apr 2008
Сообщений: 16
|
Нет, мне нужно перерисовывать стрелку при изменении координат клипа, допустим перетаскиваем клип, стрелка заново к нему рисуется. Рисоваться и затираться, конечно, будет много раз, чтобы для пользователя она "тянулась за клипом". Нужно писать код внутри стрелки. Имя клипа заранее известно. Казалось бы все просто setInterval - в нем затирать(clear) и перерисовывать(arrowTo), но на событие onPress уже описаны действия внутри самого клипа. Если внутри стрелки на onPress что-то писать - призойдет перекрытие. Поэтому пока для меня не ясно что сделать.. А создать свое событие startDrag(какой-то конкретный клип) можно?
Последний раз редактировалось fisherman; 20.04.2008 в 13:22. |
|
|||||
|
Регистрация: Oct 2005
Сообщений: 207
|
На базе все того же кода.
Есть клипы 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);
Последний раз редактировалось Vertax; 21.04.2008 в 22:01. |
|
|||||
|
Регистрация: Dec 2007
Сообщений: 23
|
нет, startDrag - это метод, событие создать нельзя. зато есть событие mouseMove, к которому можно написать обработчик, затирающий/ перерисовывающий стрелку.
кстати, может это и не совсем "чистый" подход, но я в подобной ситуации вопрос со стрелкой решил немного по другому. создал клип стрелки, в нужный момент прикреплял его к перетаскиваемому клипу, и управлял его вращением. а линию, само собой - перерисовывал... так что возможны варианты... |
![]() |
![]() |
Часовой пояс GMT +4, время: 01:28. |
|
|
« Предыдущая тема | Следующая тема » |
|
|