Просмотр полной версии : ширина приаттаченных мувиков
Подскажите, пожалуйста, никак разобраться не могу.
Есть галерея из приаттаченных мувиков. Мувики разной ширины.
Нужно чтобы мувики выстраивались друг за другом.
Этот код на форуме выкладывал D12, но там все приаттаченные мувики определенного размера.
Я решил его подправить.
Вот код.
posX = _root.mc._x;
posY = _root.mc._height/2;
posMask = 0;
var L:Number = 5;
//длина зазора между кнопками
var N:Number = 6;
//количество кнопок
var G:Number = 2;
//скорость для кнопок
var T:Number = 1;
//скорость увеличения и уменьшения для кнопок
var Q:Number = G;
//
for (var i:Number = 1; i<=N; i++) {
this.attachMovie("phil"+i, "phil"+i, i);
W = this["phil"+i];
H = W._width;
this["phil"+i]._x = (posMask-(H/2))+i*(H+L);
this["phil"+i]._y = posY;
this["phil"+i].e = i;
this["phil"+i].o = 0;
/////////////////
this["phil"+i].onEnterFrame = function() {
this._x -= Q;
this.onRollOver = function() {
trace(H);
}
if (this._x<posMask-(H+L)) {
this._x = this._x+((this._width+L)*N);
}
//
if (this.o==1 && this._width<H+(L*2)) {
this._width = this._height += T;
}
if (this.o==0 && this._width>H) {
this._width = this._height -= T;
}
}
}
Укажите, плиз, где я накосячил :umnik2:
Alex_beginner
25.05.2008, 15:40
Для начала пересмотрите "странноватые" записи:
W = this["phil"+i];
H = W._width;
Вот это мне тоже непонятно:
this["phil"+i].e = i;
this["phil"+i].o = 0;
Мне нужно обратиться к аттаченному мувику и узнать его длину.
Мувики разной длины (горизонтальные 600 px и вертикальные 300 px)
H = this["phil"+i]._width;
trace(H);
не помогает. пишет длину последнего загруженного мувика
Ну это какая i того длину и пишет. А вы пробовали в одном цикле приаттачить, а в другом пробежаться и всех расставить? Имхо, так проще и яснее, когда функция делает одно действие.
Alex_beginner
25.05.2008, 18:06
Рекомендую вынести onEnterFrame из цикла и организовать основные действия на основной временной шкале, т.e сделать чтото вроде:
for (var i:Number = 1; i<=N; i++)
{
this.attachMovie("phil"+i, "phil"+i, i);
.........
}
далее
_root.onEnterFrame = function():Void
{
this["phil"+i]._x-=Q
......
}
вроде с порядком разобрался
теперь косяк с формулой, с которой мувики выстраиваются друг за другом:
(posMask-(H/2))+i*(H+L)
posX = _root.mc._x;
posY = _root.mc._height/2;
posMask = 0;
var L:Number = 5;
//длина зазора между кнопками
var N:Number = 6;
//количество кнопок
var G:Number = 20;
//скорость для кнопок
var Q:Number = G;
//
for (var i:Number = 1; i<=N; i++) {
this.attachMovie("phil"+i, "phil"+i, i);
H = this["phil"+i]._width;
this["phil"+i]._x = (posMask-(H/2))+i*(H+L);
this["phil"+i]._y = posY;
trace(this["phil"+i]._x);
/////////////////
this["phil"+i].onEnterFrame = function() {
this._x -= Q;
if (this._x<posMask-(H+L)) {
this._x = this._x+((this._width+L)*N);
}
}
}
Есть 6 мувиков .. первые 5 из них шириной 290 пикселей, 6й последний - 569.
Те, которые 290 пикселей, выстраиваются нормально друг за другом, последний 6й уезжает ваще куда то далеко ..
Если мы подставим в ту формулу 290, получается все нормально x = 150, 445, 740, 1035, 1330...
А когда подставляешь 569, получается аж x = 3159.5 :wacko:
Alex_beginner
25.05.2008, 20:45
Если подождете до завтра. Я Вам готовый код представлю.
Почему бы не завести переменную и наращивать ее на ширину приаттаченного мувика в каждой итерации.
Alex_beginner
26.05.2008, 10:50
Mayday!Здраствуйте!
Если я правильно понял Вашу идею, то должно получиться вот такое
(100 % рабочий код - тестировал в Флеше):
var posX:Number = 200;//конечная позиция клипов - X
var posY:Number = 200;//конечная позиция клипов - Y
var posMask:Number = 0;//ваще незнаю
var finalWidth:Number = 30; //ширина мувиков, когда они выстроятся в одну колоду
var finalHeight:Number = 30; //высота мувиков, когда они выстроятся в одну колоду
var numSteps:Number = 50;//количество шагов за которое клипы достигнут конечного состояния
var counterSteps:Number = 0;//счетчик шагов
var mc_name:String = null;//промежуточная переменная
var mc_wd:Number = null;//ширина клипа
var half_wd:Number = null;//полуширина клипа
var prev_mc_rx:Number = 0;//крайняя правая координата клипа
var varStepX:Number = null;//промежуточная переменная - шаг по X
var L:Number = 6;
//длина зазора между кнопками
var N:Number = 4;
//количество кнопок
var G:Number = 4;
//скорость для кнопок
var T:Number = 1;
//скорость увеличения и уменьшения для кнопок
var Q:Number = G;
for (var i:Number = 1; i<=N; i++)
{
mc_name = "phil"+i; //микрооптимизация
this.attachMovie(mc_name,mc_name,i);
mc_wd =this[mc_name]._width; //микрооптимизация
half_wd = mc_wd/2; //микрооптимизация
this[mc_name]._x = prev_mc_rx+half_wd+L;//для точки регистрации в центре клипа
this[mc_name]._y = posY;
prev_mc_rx = this[mc_name]._x+half_wd;//для точки регистрации в центре клипа
this[mc_name].stepX = (posX-this[mc_name]._x)/numSteps;//шаг по X
this[mc_name].stepW = (finalWidth-mc_wd)/numSteps;//шаг по ширине клипа
this[mc_name].stepH = (finalHeight-this[mc_name]._height)/numSteps;//шаг по высоте клипа
}
this.onEnterFrame = function():Void
{
for (var i:Number = 1; i<=N; i++)
{
mc_name = "phil"+i; //микрооптимизация
varStepX = this[mc_name].stepX;
if (varStepX!=0)
{
this[mc_name]._x +=varStepX;//движемся по X
this[mc_name]._width+=this[mc_name].stepW;//увеличиваем/уменьшаем длину клипа
this[mc_name]._height+=this[mc_name].stepH;//увеличиваем/уменьшаем высоту клипа
}
}
if (counterSteps==numSteps) delete this.onEnterFrame;
counterSteps+=1;
}
Есть еще "гемороидальный" способ добиться того же результата - класс Matrix, но я думаю для решения поставленной задачи сойдет и этот код.
Все вышеприведенные методы несколько несовершенны. Более лаконичный метод это использование класса Tween и трансформационной анимации флеша.
Это не совсем то, но все равно спасибо, что потратили свое время )
С кодом я разобрался, сейчас все в порядке. Накосячил в двух местах с формулами ..
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.