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

mayday 25.05.2008 12:17

ширина приаттаченных мувиков
 
Подскажите, пожалуйста, никак разобраться не могу.
Есть галерея из приаттаченных мувиков. Мувики разной ширины.
Нужно чтобы мувики выстраивались друг за другом.

Этот код на форуме выкладывал 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;


mayday 25.05.2008 16:52

Мне нужно обратиться к аттаченному мувику и узнать его длину.
Мувики разной длины (горизонтальные 600 px и вертикальные 300 px)
Код:

H = this["phil"+i]._width;
trace(H);

не помогает. пишет длину последнего загруженного мувика

Wolsh 25.05.2008 17:01

Ну это какая 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
    ......
}


mayday 25.05.2008 20:39

вроде с порядком разобрался
теперь косяк с формулой, с которой мувики выстраиваются друг за другом:
Код:

(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

Если подождете до завтра. Я Вам готовый код представлю.

mayday 25.05.2008 21:16

Большое спасибо.

Wolsh 25.05.2008 21:41

Почему бы не завести переменную и наращивать ее на ширину приаттаченного мувика в каждой итерации.

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 и трансформационной анимации флеша.

mayday 26.05.2008 15:19

Это не совсем то, но все равно спасибо, что потратили свое время )
С кодом я разобрался, сейчас все в порядке. Накосячил в двух местах с формулами ..


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

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