PDA

Просмотр полной версии : Как создать транспортир


Ышву
25.05.2010, 00:40
Доброго времени суток!

В моей Flash-работе понадобился транспортир, вернее его шкала.
Так как проект еще в стадии разработки, то придется создавать его динамически.
По этой причине прошу вашего совета в этом вопросе.
Идея создать символ линии и вертеть его клонов на 180 градусов мне показалось безумной, а ничего другого в голову не приходит.
Я надеюсь, что вы сможете подсказать иное решение этой проблемы...

Заранее благодарен.

samana
25.05.2010, 01:10
А почему придётся создавать его динамически? Почему не нарисовать его просто, и брать из библиотеки? И для чего он нужен будет? Им что-то измерять придётся, какие у него должны быть функции, его нужно двигать, вертеть? Можно уточнить вопрос?

Ышву
25.05.2010, 02:02
Вы правы, транспортир будет больше статическим (простите. дурная привычка называть динамическим всё, что создается программно).
Транспортир после создания я вертеть, двигать и прочие вещи с ним делать не буду.
Он будет лишь измерителем, причем видимо больше выполняющим фукцию Graphic объекта...
Но его размеры, величина линии и некоторые другие параметры мне мне нужно при необходимости изменить...
Измерять им нужно отклонения стрелки. В конце работы это будет часть прибора по типу амперметра. Функции с ним я не планирую.
Вопрос у меня стоит только в том, как создать шкалу из этих 180 линий(которые отличаются только поворотом на 1 градус) так, чтобы Flash не умер от потери оперативной памяти. Сколько знаю, он много объектов не любит...

rainbowrussia
25.05.2010, 03:26
createEmptyMovieClip, lineStyle, moveTo, lineTo спасет вас от нагромождения клипов с линией.

Ышву
27.05.2010, 01:28
Если честно, не совсем понимаю, как сделать, чтобы lineTo чертила под нужным мне градусом...
Поворот на нужный угол я нашел только для таких классов как Button, MovieClip и TextField.
Если вас не затруднит, уважаемый rainbowrussia, напишите как вы бы это сделали хотя бы для трех линий, а то я не понимаю вашей гениальной идеи.

На днях я получил рабочий вариант того, что я хотел(затратный, но рабочий).

Line._x=15;
Line._y=338;
for (i:Number=0; i<180;i++)
{
Line.duplicateMovieClip("Line"+i,this.getNextHighestDepth());
Line. _rotation=i;

}
stop();


Можно ли сделать этот код лучше, менее затратным что ли?

rainbowrussia
27.05.2010, 05:20
Можно ли сделать этот код лучше, менее затратным что ли?

Можно (идея не претендует не гениальность, я подсказал функции, котороые позволяют рисовать, не плодя мувиклипы, остальное - чистая математика, напрямую не относящаяся к флешу):


var mc = this.createEmptyMovieClip('transp', this.getNextHighestDepth());

mc._x = 250;
mc._y = 250;


var r1 = 200;
var r2 = 210;
var r3 = 215;
var r4 = 230;

for (var i = 0; i<= 180; i++) {

var ph = - Math.PI * i / 180;

mc.lineStyle(1);
mc.moveTo(Math.cos(ph)*r3, Math.sin(ph)*r3);
mc.lineTo(Math.cos(ph)*r4, Math.sin(ph)*r4);

if (Math.floor(i/5) == i/5) {
mc.lineStyle(2);
mc.moveTo(Math.cos(ph)*r2, Math.sin(ph)*r2);
mc.lineTo(Math.cos(ph)*r4, Math.sin(ph)*r4);
}

if (Math.floor(i/10) == i/10) {
mc.lineStyle(3);
mc.moveTo(Math.cos(ph)*r1, Math.sin(ph)*r1);
mc.lineTo(Math.cos(ph)*r4, Math.sin(ph)*r4);
}
}

stop();


В результате получаем мувиклип "mc" с нарисованым транспортиром.

rainbowrussia
27.05.2010, 05:54
Бонус. Транспортир с цифрами, обозначающими градусы.