Форум 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=122095)

Acrossfy 02.03.2009 16:58

Отрисовка линии между двумя точками (одна плавающая, т.е. без постоянных координат)
 
Здравствуйте.
В сцене имеется мивиклип который следует за курсором в определенной области, чуть большей самого клипа. Также у клипа есть зацикленная анимация по траектории. На определенном расстоянии от клипа есть условная точка X1, с постоянными координатами.
Задача - при наведении на "плавающий" клип, из определенной точки на нем (X2), должна появляться линия идущая в точку X1.
Во флеше работаю недавно, поэтому как сделать так, чтобы линия была между точками постоянно, учитывая, что точка X2 плывет в пространстве, совершенно не знаю.
Буду признателен за любую помощь по данному вопросу.

qazwsx 02.03.2009 17:05

Стоит только набрать в хелпе line и посмотреть(это даже если ничего незнать).

Код AS1/AS2:

clear();
moveTo(x1._x, x1._y);
lineTo(x2._x, x2._y);


Acrossfy 02.03.2009 17:53

Вложений: 1
Находил, в хелпе. Вот допустим подобный код не работает.
Код AS1/AS2:

bg.onEnterFrame = function() {
if (_xmouse >this._x && _xmouse < this._x+this._width && _ymouse > this._y && _ymouse < this._y+this._height)  {
        _root.x1._x -= (_root.x1._x-_xmouse)/20;
        _root.x1._y -= (_root.x1._y-_ymouse)/20;
        };
};
x1.onEnterFrame = function() {
//        moveTo(116, 156);
        lineTo(366, 183);
//        lineTo(x2._x, x2._y);
};

Всю не работоспособность свел на то, что x1 не имеет постоянных координат. Хотя сейчас просто проверил, то же не выходит. Что может быть не так? Инстанс неймы заданы.

qazwsx 02.03.2009 19:03

Код AS1/AS2:

clear();
moveTo(x1._x, x1._y);
lineTo(x2._x, x2._y);

вот это в x1.onEnterFrame. Не открывается меня исходник

Acrossfy 02.03.2009 20:02

Не работает. Исходник в формате флеша 8. В чем причина косяка не знаю. Можете набросать простейший рабочий исходник?

Добавлено через 52 минуты
Разобрался. Банально нужно было добавить lineStyle ;)))
Спасибо огромное за отклик)

qazwsx 02.03.2009 21:00

Тогда ты хелп не посмотриш:). Что не выходит лини не рисуется? lineSetyle(1, 0x000000). Говорил же сразу читать хелп :/

Acrossfy 02.03.2009 21:22

Да вот же.. Лень всему беда, буду исправляться)
Кстати, вот еще вопрос, чем можно сделать не мгновенную, а плавную отрисовку линии от точки до точки? Думаю это в хелпе я вряд ли найду)

Котяра 02.03.2009 22:35

отрисовывай отрезки линии через определенный интервал времени. ключевые слова setInterval (можно onEnterFrame со счетчиком),if, for, while

Acrossfy 02.03.2009 23:04

Движение нужно больно плавное, отрезки тут не катят..
+ точка Х1 не стационарна. Тут это не пройдет..

VVall 02.03.2009 23:10

Можно находить точку на прямой между двумя нужными точками, рисовать от исходной до этой точки и изменять расстояние от исходной до этой со временем.

qazwsx 02.03.2009 23:12

И как это тогда выглядить должно? Плавно рисуется линия а тутраз x1 сдвинулся и она пропала?

Acrossfy 02.03.2009 23:18

Учитывая плавучесть одной из точек, прямая, и средняя точка никогда не постоянны.

qazwsx 02.03.2009 23:22

Ну дак каким образом она будет плавно рисоватся? Там просто времени нету на какуюто плавную отрисовку

Tails 02.03.2009 23:22

Вложений: 1
есть ещё один способ для линий от А до Б:
рисуеш строго диаганальную линию длиной и высотойв 100 пикселов, приаброзовываеш её в клип, с центром в верхнем левом углу, и пишеш небольшой код типа:
Код AS1/AS2:

        _root.Line._xscale = _xmouse-_root.Line._x;
        _root.Line._yscale = _ymouse-_root.Line._y;

Можно линию нарисовать с плавными концами, кокраз получиш то что тебе надо, и ещё незабудь сделать тип линий hairline
Вложение 21690
Вот начиркал в пайнте.

qazwsx 02.03.2009 23:26

Что значит плавные концы?:O

Линия высотой и длиной 100 это вертикальная прямая :D

Tails 02.03.2009 23:31

Ну плавные концы, это например от 0% непрозрачности до 100, а после прописывания указаного выше кода, эта линия перестанет быть вертикальной.

Котяра 02.03.2009 23:34

Вот тоже не особо понял насчет плавности? может наоборот фишка в том что медленно отрисовывается и кажутся разрывы? рисуй по onMouseMove и делай updateAfterEvent


Я по-моему понял (дайте мне за это пирожок) имеется в виду антиальясинг)))))

qazwsx 02.03.2009 23:36

Цитата:

Сообщение от Tails (Сообщение 802462)
Ну плавные концы, это например от 0% непрозрачности до 100, а после прописывания указаного выше кода, эта линия перестанет быть вертикальной.

Она диагональна :D

Acrossfy 02.03.2009 23:38

Tails, линия таким образом преследует саму мышь. С этим есть подвох. Плавающая точка Х1, находится внутри плавающего за мышью муви клипа. Точка регистрации клипа, которой он стремится нарваться на курсор, находится довольно далеко от точки Х1.

Добавлено через 1 минуту
Котяра, линия медленно(ну не совсем конечно, но заметно для глаза), идет из одной точки в другую. Это я и назвал плавностью.

Котяра 02.03.2009 23:43

пирожок отменяется. опять ничего не понял. если у линии (прямой, как я понял) меняются с временем направляющие точки а она сама рисуется медленно, то она уже не прямая... а. а..алярм, алярм (нарисуйте что вам надо)

Tails 02.03.2009 23:49

Если нужно найти кординату вложеного клипа в другой можно использовать это:
Код AS1/AS2:

 
// на сцене 2 клипа:
// 1-ый с названием Fire и 2-ой с названием bahna, также внутри второго имееться клип FirePoint
// САМА ФУН-ИЯ
function getXandY() {
        // пифагор
        dlina=Math.sqrt(((targetClip._y*targetClip._y)+(targetClip._x*targetClip._x)));
        // ugol
        delta_x = -targetClip._x;
        delta_y = -targetClip._y;
        ugol = (-Math.atan2(delta_x, delta_y)/(Math.PI/180))-90;
        //raschet
        resultX=targetClipRoditel._x+ (dlina*Math.cos((targetClipRoditel._rotation+ugol)*(Math.PI/180)));
        resultY =targetClipRoditel._y+ (dlina*Math.sin((targetClipRoditel._rotation+ugol)*(Math.PI/180)));
        resultRotation=targetClipRoditel._rotation;
}
//
//
// Теперь пробуем её использовать
// Задаём ей цель
targetClipRoditel = _root["bahna"];
targetClip=targetClipRoditel["FirePoint"];
// Врубаем фун-ию
getXandY();
// Функция выводит нам нужные кординаты, которые в последущем можно свободно использовать, например так:
_root.Fire._x=resultX;
_root.Fire._y=resultY;
_root.Fire._rotation=resultRotation;

И после получения из фун-ий кординат, свободно привязывать линию вторым концом к вложеному обьекту.

Котяра 02.03.2009 23:49

Цитата:

Сообщение от Acrossfy (Сообщение 802468)
Добавлено через 1 минуту
Котяра, линия медленно(ну не совсем конечно, но заметно для глаза), идет из одной точки в другую. Это я и назвал плавностью.

ну и отрисовывай именно в этом цикле медленно от одной точки до другой отрезками.

Acrossfy 02.03.2009 23:56

Меняется одна только точка. Из нее линия рисуется в статичную точку два. Линия по сути уже отрисована и позиционирована, однако нужен эффект аля маска, плавно идущая от точки Х1 до Х2. Вообщем Плавное проявление линии со стороны точки Х1, в сторону Х2.

Котяра 02.03.2009 23:59

вот и отрисовывай из статичной точки 1 в статичную точку 2 кусочками(ОТРЕЗКАМИ). промежуточные координаты посчитаешь сам. не надо маски.

Acrossfy 03.03.2009 00:03

Котяра, ты только представь сколько кода на это уйдет? При этом будет не так плавно, как нужно.

Tails 03.03.2009 00:10

Вложений: 1
У меня получилось примерно так:
Вложение 21691

Acrossfy 03.03.2009 00:15

Tails, получилось довольно клево, но это не то.. У тебя линия сразу есть и видна. Мне нужно ее плавное появления из точки в точку. Но все равно огромное спасибо за помощь.

scarbo 03.03.2009 00:19

Вложений: 1
так чтоль?

Acrossfy 03.03.2009 00:24

scarbo, о) это куда теплее) только прямая между точками всегда должна оставаться прямой, но появляться из точки в точки именно так.
Можно глянуть исходник? Хотя в данном случае вряд ли получится под себя подогнать.

Tails 03.03.2009 00:32

Вложений: 1
Тупо используем маску.
Вложение 21693

scarbo 03.03.2009 00:40

Вложений: 1
так пойдет?

Acrossfy 03.03.2009 00:51

Tails, о! То, что нужно. Можно код?

Добавлено через 2 минуты
scarbo, то же отличный вариант. Спасибо.
Спасибо большое всем, кто откликнулся.

Tails 03.03.2009 00:55

Вложений: 1
исходник
Вложение 21695
Ммм, хотя по сравнению с примером scarbo, мой вариант намного примитивнее :quiet:, яркий пример таво, как можно сделать одну и ту же вещ разными способами.

aksios 03.03.2009 01:06

Acrossfy, у Вас две мега проблемы:
- не лады с физикой
- гуглофобия

Acrossfy 03.03.2009 02:45

А в чем у меня с физикой проблемы?)
Что до гугла, то информации много, бесспорно. Однако, в каждой ситуации есть определенные нюансы, требующие решения проблемы на месте. И когда сроки поджимают, спросить не у кого, единственной помощью, я вижу форум, и я очень благодарен за все многочисленные отклики в этой теме.
Изначально все же нужно было не движение линии за мышкой, а движения за точкой, представленной муви клипом, находящаяся в другом перемещающемся муви клипе. По ходу темы, которую вы видимо читали не сначала, я слегка изменил начальную задумку реализации данной флешки.
Что до темы, что вы привели, там решается несколько иная проблема, нежели та, что была актуальна в последних постах. Но все равно спасибо.

qazwsx 03.03.2009 06:09

Еще бы описал хотябы что нужно сделать(Раз уж сам не хочеш ничего делать, а люди всетаки решили помоч :/). И не пришлось бы играть в угодаййку в течении дня.

aksios 03.03.2009 08:26

Цитата:

Сообщение от Acrossfy (Сообщение 802539)
А в чем у меня с физикой проблемы?)

Если изначально четко сформулировать модель, то решение будет очевидным. Чтобы делать хорошую анимацию всегда нужно смотреть в сторону натуры. Формулировка Вами задачи оказалась очень мутной.
А по поиску - чтобы искать эффективно, сначала нужно четко сформулировать предмет поиска.

Acrossfy 03.03.2009 17:47

Честно, изначально в теме нужно было именно уточнить, почему линии не отрисовывались. Потом уже возник вопрос, а можно ли..
Что до формулировки, я писал, что нужно, чтобы линия медленно шла от точки, к другой точки. При этом двигалась, если одна из точек движется.
Извиняюсь, что запутанно это все объяснил, и всех запутал. Видимо постоянное ночное сидение за монитором сказывается на адекватности рассуждений)

lexalab 03.03.2009 23:06

Может так?
Код AS1/AS2:

// Построитель прямой линии
this.onMouseDown = ClickMouseLine;
this.onMouseMove = MoveMouseLine;
this.onMouseUp = UpMouseLine;
//Обработка соббытия - клик мышкой левая кнопка
function ClickMouseLine() {
        count++;
        detect = 1;
        startX = _xmouse;
        startY = _ymouse;
}// func
 
//Обработка соббытия - Движение мышклй с нажатой левой кнопкой
function MoveMouseLine () {
        if (detect == 1) {
                this.createEmptyMovieClip("l"+count, count);
                var ql = "l"+count
                var l = this["l"+count];
                l.lineStyle(1, 0x000000);
                l.moveTo(startX, startY);
                l.lineTo(_xmouse, _ymouse);
        }//if
}// func
//Обработка соббытия - отпускание левой кнопки
function UpMouseLine() {
        detect = 0;
}



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

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