Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Стрелочки (http://www.flasher.ru/forum/showthread.php?t=111225)

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


Часовой пояс GMT +4, время: 13:00.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.