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

deep70 10.11.2009 11:27

Как повлиять на все клипы сразу?
 
Здравствуйте.
Есть ряд загруженных картинок одинаковых размеров, помещенных в клипы.
Для каждого клипа по окончанию загрузки выполняется код:

Код AS1/AS2:

mclListener.onLoadInit = function(target_mc:MovieClip) {
 
        var w:Number = target_mc._width;
        var h:Number = target_mc._height;
 
        target_mc.onEnterFrame = function() {
                if (this._x < -w){
                        this._x = num_img*w; //перемещаем клип в конец очереди
                }
                this._x -= 2; //скроллим мувики влево
 
                this.onRollOver = function() {
 
                        // По событию, все мувики должны остановиться.
                };
        };
};

Как реализовать _x = _x для всех клипов?
Иными словами, нужно по событию остановить скролл для всех клипов.
Пробовал двигать родительский клип, и отлавливать событие для него - тогда получается, но как быть с "зацикливанием" бегущей строки? Как в таком случае узнать координаты _root.mc.image1 относительно корня а не родителя?

mooncar 10.11.2009 14:38

По какому событию все мувики должны остановится? По RollOver'у одного из них?
Что значит _x = _x? Все должны встать в точку с одной и той же координатой _x ?
Какая бегущая строка? Какой такой _root.mc.image1?
Не очень понятно, что к чему и что вам нужно. Начали описывать все хорошо, а потом все запутали. Выделите и сформулируйте один вопрос, но с толком.

Может быть, вот так?
Код AS1/AS2:

var movieClips:Array = new Array();
var allowMove:Boolean = true ;
 
mclListener.onLoadInit = function(target_mc:MovieClip) {
        movieClips.push(target_mc);
        target_mc.onRollOver = stopAll;
};
 
this.onEnterFrame = manageMovieClips;
 
function manageMovieClips () {
        if (allowMove) {
                for (i in movieClips) {
                        var item:MovieClip = movieClips[i];
                        var w:Number = item._width ;
                        var h:Number = item._height ;
                        if (item._x < -w){
                                item._x = num_img * w;
                        }                       
                        item._x -= 2;
                }
        }
        else {
                delete this.onEnterFrame ; //остановка всего
        }
}
 
function stopAll () {
        allowMove = false ;
}


deep70 10.11.2009 17:09

Большое спасибо. Все работает как надо!
Вы все правильно поняли.
Суть замысла была в следующем:
В _root лежит клип mc. В нем создаются клипы image1, image2 и т.п., в каждый из которых загружается картинка. после этого клип image2 получает координату image2 ._x=image1._width
Результат - линия, построенная из изображений - бегущая галерея.
Все элементы движутся с одной скоростью, в одну сторону.
Интерактивность заключается в том, что onRollOver останавливает "строку", а onRollOut - запускает ее снова, и onRelease, соответственно открывает окно с исходным изобра . Для onRollOut, опираясь на Ваш код, я написал:
Код AS1/AS2:

mclListener.onLoadInit = function(target_mc:MovieClip) {
 .....
        target_mc.onRollOut = startAll;
 
};
function startAll () {
        allowMove = true ;
        this.onEnterFrame = manageMovieClips;
}

Здесь спасибо Вам за подсказку, т.к. в последний раз я что-то кодил в AS2 лет 5 назад, и с тех пор запомнилась только одна форма описания событий - та, что в моем изначальном примере.

mooncar 10.11.2009 17:15

Ага, для onRollOut все аналогично.

deep70 17.12.2009 17:50

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

Сейчас код выгляди так:
Код AS1/AS2:

fn0 = '1.jpg'; fn1 = 'f7.JPG'; fn2 = 'P10105096.JPG'; fn3 = 'P10105097.JPG'; fn4 = 'g8.JPG'; fn5 = 'g12.JPG'; fn6 = 'g16.JPG'; fn7 = 'P1010095.JPG'; fn8 = 'P10105107.JPG'; fn9 = 'd11.JPG'; fn10 = 'd15.JPG'; fn11 = 'DSC00103.JPG'; fn12 = 'IMG_1851_.jpg'; fn13 = 'IMG_1856_.jpg'; fn14 = 'P101g0012.JPG'; fn15 = 'P10100g13.JPG'; fn16 = 'IMG_1859.jpg'; fn17 = 'IMG_1862.jpg'; fn18 = 'IMG_1864.jpg'; fn19 = 'k8.JPG'; fn20 = 'k22.JPG'; 
count = '21';
this.createEmptyMovieClip("image_mc",this.getNextHighestDepth());
var mclListener:Object = new Object();
var movieClips:Array = new Array();
var allowMove:Boolean = true ;
 
mclListener.onLoadInit = function(target_mc:MovieClip) {
        movieClips.push(target_mc);
        target_mc.onRollOver = stopAll;
        target_mc.onRollOut = startAll;
        target_mc.onRelease = OpenFull;
        _root.mc._alpha=0;
};
        this.onEnterFrame = manageMovieClips;
 
 
function manageMovieClips () {
        if (movieClips.length == num_img){
                if(_root.mc._alpha < 100){
                        _root.mc._alpha+=5;
                }
        }
        if (allowMove) {
                for (i in movieClips) {
                        var item:MovieClip = movieClips[i];
                        var w:Number = item._width ;
                        var h:Number = item._height ;
                        //if (h<w or h<107){
                                //index = 107*100/h;
                                item._yscale = 107*100/h;
                                item._xscale = 107*100/h;
                                //var w:Number = item._width ;
                                //var h:Number = item._height ;
                        //}
                        if (item._x < -w){
                                item._x = num_img * ( w + 5 )-w;
                        }
                        if (movieClips.length == num_img){
                                        item._x -= 1;
                        }
                }
        }
 
        else {
                delete this.onEnterFrame ; //остановка всего
        }
}
 
function stopAll () {
        for(i=0;i<=movieClips.length;i++){
                if(movieClips[i] != this){
                        movieClips[i]._alpha = 80;
                }
        }
        if(i<=80){
                allowMove = false ;
        }
}
function startAll () {
        for(i=0;i<=movieClips.length;i++){
                if(movieClips[i] != this){
                        movieClips[i]._alpha = 100;
                }
        }
        if (allowMove != true){
                allowMove = true;
                this.onEnterFrame = manageMovieClips;
        }
}
function OpenFull () {
        var mySubstring:Number = this._name.substring(7,9);
        if(this._width > this._height){
                image_link = "javascript:OpenFile('images_gallery/index.php?img="+_root["fn"+mySubstring]+"',"+(this._width*3.5)+","+(this._height*3.5)+")";
        }else{
                image_link = "javascript:OpenFile('images_gallery/index.php?img="+_root["fn"+mySubstring]+"',"+(this._width*2.6)+","+(this._height*2.6)+")";
        }
        getURL (image_link);
}
var image_mcl:MovieClipLoader = new MovieClipLoader();
image_mcl.addListener(mclListener);
 
//num_img = _root.count;
num_img = this.count;
 
for (i=0; i<num_img; i++) {
        this.createEmptyMovieClip("clip_mc"+i,-i);
        var image_mcl:MovieClipLoader = new MovieClipLoader();
        image_mcl.addListener(mclListener);
//        fname = "../images_gallery/"+_root["fn"+i];
        fname = "../images_gallery/"+this["fn"+i];
        trace (fname);
        image_mcl.loadClip(fname,this["clip_mc"+i]);
        this["clip_mc"+i]._x = i*150; // здесь надо бы нормальные координаты
 
}

переменные [fn+i] и count генерятся в php, поэтому я их пока зарэмил и прописал руками.
Все картинки я уменьшаю пропорционально до 107px по высоте.
но это происходит после загрузки... и после расстановки картинок по горизонтали.
Соответственно, после уменьшения размеров картинки, они оказываются не рядом друг с другом.
Докучи, сейчас картинки стремятся к исходным размерам в каждом новым кадре
Как исправить ситуацию?

Добавлено через 1 час 4 минуты
Спасибо форуму за то что он есть!!
Ибо не задав вопроса, сам бы так и не додумался.
Решение найдено! :)


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

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