Форум 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)
-   -   горизонтальный скролл и attachMovie (http://www.flasher.ru/forum/showthread.php?t=112555)

mayday 01.06.2008 01:48

горизонтальный скролл и attachMovie
 
Вложений: 1
Ребята, подскажите, пожалуйста, уделите Ваше внимание! Не знаю как сделать ..
Есть горизонтальный скролл куда приаттачиваются мувики (в любом количестве) .. Скролл осуществляется по движению мыши
Как мне сделать, чтобы этот скролл был зацикленный? Чтобы при движении влево первый мувик, выезжая за пределы сцены, переносился бы после последнего. А при движении вправо, наоборот, последний мувик становился бы перед первым и т. д.

Вот код:

Код:

posX=_root.mc._x;
posY=_root.mc._height/2;
posMask=0;

var mouseListener:Object = new Object();
mouseListener.onMouseMove = function() {
        center = Stage.width/2;
        shag = (_xmouse-center)/10;
}
Mouse.addListener(mouseListener);

var L:Number = 5;
//длина зазора между кнопками
var N:Number = 5;
//количество кнопок
var G:Number = 1;
//скорость для кнопок
var Q:Number = G;
//
for (var i:Number = 1; i<=N; i++) {
        this.attachMovie("photo"+i, "photo"+i, i);
        this["photo"+i]._x = ((mcOld._x + mcOld._width) || mcOld._x)+L;
        mcFirst = this["photo1"]._x;       
        mcOld = this["photo"+i];
        mcLast = this["photo"+N]._x+this["photo"+N]._width+L;
        this["photo"+i]._y = posY;       
        this["photo"+i].onEnterFrame = function() {
                if(_xmouse<center){
                        this._x -= shag;
                        if (this._x<posMask-this._width) {
                                this._x = this._x+mcLast;
                        }
                } else {
                        this._x += -shag;
                }
        }
}

Вот исходник:

Psycho Tiger 01.06.2008 10:54

Как вариант: смотришь, когда крайний мувик доходит до "критической точки", и переносишь его на другую сторону. Эту "критическую точку" нужно расчитывать самому, в зависимости от количества фоток и её длины.

Alex_beginner 01.06.2008 12:02

Привет! mayday! Узнаю этот код. Я вижу Вы его перестроили в корне. Хотя непонятно зачем Вы создаете обработчик onEnterFrame для каждого клипа.
Идея мне вообщем понятна. Вот тут мне непонятно:

Код:

if (this._x<posMask-this._width) {
this._x = this._x+mcLast;

Насколько я понимаю, при x координате клипа меньшей чем его ширина он должен перенестись в правый край.

mcLast вычисляется в строчке:
Код:

mcLast = this["photo"+N]._x+this["photo"+N]._width+L;
Обратите внимание: N!!!!, а не i !!! Змените N на i. И будем думать дальше.

Теперь, если всеже через N, тогда mcLast никак не может быть вычислено для текущего клипа (см. блок onEnterFrame) поскольку последний клип this["photo"+N] еще не приатачен.

mayday 01.06.2008 12:17

Привет, Alex_beginner! :)
Поменял N на i

Пока получилось сделать движение влево с приаттачиванием после последнего мувика..
Вправо пока никак ((

Код:

posX=_root.mc._x;
posY=_root.mc._height/2;
posMask=0;

var mouseListener:Object = new Object();
mouseListener.onMouseMove = function() {
        center = Stage.width/2;
        shag = (_xmouse-center)/10;
}
Mouse.addListener(mouseListener);

var L:Number = 5;
//длина зазора между кнопками
var N:Number = 5;
//количество кнопок
var G:Number = 1;
//скорость для кнопок
var Q:Number = G;
//
for (var i:Number = 1; i<=N; i++) {
        this.attachMovie("photo"+i, "photo"+i, i);
        this["photo"+i]._x = ((mcOld._x + mcOld._width) || mcOld._x)+L;
        mcOld = this["photo"+i];
        mcLast = this["photo"+i]._x+this["photo"+i]._width+L;
        this["photo"+i]._y = posY;       
        this["photo"+i].onEnterFrame = function() {
                if(_xmouse<center){
                        this._x -= shag;
                                  //тут пока хз
                        //if (this._x<posMask-this._width) {
                        //        this._x = this._x+mcLast;
                        //}
                }
                if(_xmouse>center){
                        this._x += -shag;
                        if (this._x<posMask-this._width) {
                                this._x = this._x+mcLast;
                        }
                }
        }
}


Alex_beginner 01.06.2008 12:22

Вот сравните строчки:

Код:

this._x -= shag;
и

Код:

this._x += -shag;
Как Вы думаете, это одно и тоже или нет?

mayday 01.06.2008 12:32

Вложений: 1
Цитата:

Сообщение от Alex_beginner (Сообщение 743007)
Вот сравните строчки:

Код:

this._x -= shag;
и

Код:

this._x += -shag;
Как Вы думаете, это одно и тоже или нет?

Я знал, что спросите )
Со стороны одно и то же ..
В первом случае shag - положительное число, во втором - отрицательное
Если сделать так:
Код:

this._x -= shag;
и
Код:

this._x += shag;
то мувики будут двигаться только вправо, несмотря на положение мыши

вот для наглядности исходник

Alex_beginner 01.06.2008 12:49

А mouseMove есть выше! Я его незаметил. Тогда может сдеалем несколько подругому, если это приемлемо для Вас.

1. Вынесите строчку
Код:

center = Stage.width/2;
из обработчика onMouseMove. Этот обработчик выполняется с довольно большой частотой и каждая строчка в его коде - существенный удар по производительности.
2. Давайте попробуем отказаться от onEnterFrame каждого клипа и сделать все движения в единственном onMouseMove, используя ссылки this["photo"+i]
3. Подписать mouseListener после завершения кода в цикле.

Что это дасть?!!
1. Код в цикле сократиться
2. Будет только один обработчик
3. На момент окончания работы цикла будет известно значение mcLast
Если все это Вас заинтересовало, попробуте реализовать. Я думаю Вы ничего непотеряете, только выиграете.

mayday 01.06.2008 14:50

оптимизацией я уж потом займусь ..
сейчас основная задача - решить проблему скроллинга вправо
вот только как это сделать ..

Alex_beginner 01.06.2008 15:03

Надо рассматривать проблему в купе.
Как я уже говорил, в коде где вы аттачите мувы Вы тут же создаете обработчики для них onEnterFrame. Но в этих обработчиках используется перменная (mcList) которая не может быть вычислена, если не приаттачины все клипы. Получается змея закусившая свой хвост.
Дак не лучше ли отказаться от onEnterFrame в пользу mouseMove. И начать обработку события onMouseMove после того как созданы все клипы.
Попробуйте так. Если же Вас это неустраивает, ну давайте будем "мучиться" с тем что есть.

mayday 01.06.2008 15:13

я actionscript еще плохо знаю и поэтому для меня это пока сложновато будет сделать..
Alex, поможешь доделать? Я в долгу не останусь. а сдавать завтра..

Alex_beginner 01.06.2008 15:20

Лан. Я чел в душе добрый (но только в душе):). Ща займусь. А на счет долга не беспокойтесь. Это лишнее.
Кстати, плиз выложи исходник в формате Флеша8, а не CS3, А то неоткрывается.

mayday 01.06.2008 15:27

Вложений: 1
Цитата:

Сообщение от Alex_beginner (Сообщение 743038)
Лан. Я чел в душе добрый (но только в душе):). Ща займусь. А на счет долга не беспокойтесь. Это лишнее.
Кстати, плиз выложи исходник в формате Флеша8, а не CS3, А то неоткрывается.

Огромное спасибо!

Alex_beginner 01.06.2008 15:30

Мож я че то недопер! А в исходнике че кода вообще нету?

mayday 01.06.2008 15:35

код не в руте
мувик container

Alex_beginner 01.06.2008 15:37

Нашел! Ну и запрятал. А че не в руте писал?

Как сделать прокрутку, то я сделал!

Код:

posX=_root.mc._x;
posY=_root.mc._height/2;
posMask=0;
center = Stage.width/2;

var L:Number = 5;
//длина зазора между кнопками
var N:Number = 5;
//количество кнопок
var G:Number = 1;
//скорость для кнопок
var Q:Number = G;
//
for (var i:Number = 1; i<=N; i++)
{
        this.attachMovie("photo"+i, "photo"+i, i);
        this["photo"+i]._x = ((mcOld._x + mcOld._width) || mcOld._x)+L;
        this["photo"+i]._y = posY;
        mcOld = this["photo"+i];       
}


this.onEnterFrame = function():Void
{
        shag = (center-_xmouse)/30;
        for (var i:Number = 1; i<=N;i++)
        {
                this["photo"+i]._x+=shag;
        }
}

А вот как зациклить то надо думать.

mayday 01.06.2008 17:44

Цитата:

Сообщение от Alex_beginner (Сообщение 743044)
А вот как зациклить то надо думать.

И на этом большое спасибо :)

Alex_beginner 01.06.2008 18:33

mayday! Я вам предоставлю полный код! Ждите.
Кстати, я забыл спросить, сегодня до скольки Вам нужно это сделать!
Я уже знаю как сделать, только вот допишу щас в флеше.
И еще я иногда пропадаю из форума - Интернет глючит (через WI-FI).
Но не переживайте усе будет упорядке!

Alex_beginner 01.06.2008 19:14

mayday! Вот оно. Не бог весть, что но работает.
Возможно, есть более красивые и простые варианты реализации этого, но я всего лишь beginner. А посему пусть этот код правят продвинутые флешеры, коих здесь на форуме неисчислимое множество.
На счет кода - L я убрал чтоб мозг себе им не компостировать, когда разберетесь как работает код, вставьте L в нужные места и все будет отлично.
Правда я подозреваю, что вся эта задача решается куда проще(пока незнаю как).

Код:

posX=_root.mc._x;
posY=_root.mc._height/2;
posMask=0;
center = Stage.width/2;

var L:Number = 5;
//длина зазора между кнопками
var N:Number = 5;
//количество кнопок
var G:Number = 1;
//скорость для кнопок
var Q:Number = G;
//
var indexArr:Array = [];
for (var i:Number = 1; i<=N; i++)
{
        this.attachMovie("photo"+i, "photo"+i, i);
        this["photo"+i]._x = ((mcOld._x + mcOld._width) || mcOld._x);
        this["photo"+i]._y = posY;
        mcOld = this["photo"+i];
        indexArr.push(i);
}

var mcLast1 = this["photo"+N]._x-60;//Здесь можно другую область скролирования поставить
var mcLast2 = -this["photo1"]._width;
var index:Number = null;
var tmpVar:Object = {};

this.onEnterFrame = function():Void
{
        shag = (center-_xmouse)/10;
        for (var i:Number = 1; i<=N;i++)
        {
               
                if ((this["photo"+i]._x)>mcLast1)
                {
                        tmpVar =indexArr.pop();
                        this["photo"+tmpVar]._x=this["photo"+indexArr[0]]._x-this["photo"+tmpVar]._width;
                    indexArr.unshift(tmpVar);
                }
                if ((this["photo"+i]._x)<mcLast2)
                {
                        tmpVar =indexArr.shift();
                        this["photo"+tmpVar]._x=this["photo"+indexArr[N-2]]._x+this["photo"+indexArr[N-2]]._width;
                        indexArr.push(tmpVar);                       
                }
                this["photo"+i]._x+=shag;
               
        }       
                       
}


mayday 01.06.2008 23:15

Эврика! Работает!
Alex_beginner, огромное спасибо!!!

AlexDesinger 18.06.2008 21:25

Alex_beginner-ты крут - и правда все работает, я вот то же самое пытаюсь сделать только горизонтальный скролл.
У меня походу родились вопросы над которыми я попарился но так и не смог решить.
1. как сделать чтоб скролирование происходило только когда мышка над mc?
я решил этот вопрос так:

Код:

this.onEnterFrame = function():Void{
      if (ok){
        shag = (center-_xmouse)/10;
        for (var i:Number = 1; i<=N;i++)
        {
               
                if ((this["photo"+i]._x)>mcLast1)
                {
                        tmpVar =indexArr.pop();
                        this["photo"+tmpVar]._x=this["photo"+indexArr[0]]._x-this["photo"+tmpVar]._width;
                    indexArr.unshift(tmpVar);
                }
                if ((this["photo"+i]._x)<mcLast2)
                {
                        tmpVar =indexArr.shift();
                        this["photo"+tmpVar]._x=this["photo"+indexArr[N-2]]._x+this["photo"+indexArr[N-2]]._width;
                        indexArr.push(tmpVar);                       
                }
                this["photo"+i]._x+=shag;
                }
        }       
                       
}

по-моему не самый замечательный вариант - в каждом кадре проверять находится ли мышка над mc

2.Дальше еще круче - что если у меня не пять картинок-кнопок а например 200?
можно ли проделать все-это динамически динамически создавать клип и внего грузить определенную картинку скажем ico1.jpg, ico2.jpg и.т.д. естественно с заранее известным количеством фалов ico.jpg?

3.наконец для меня самое загадочное - как мне узнать номер кнопки на которую я нажал я вот так сделал потому что по другому не сумел:
Код:

var indexArr:Array = [];
for (var i:Number = 1; i<=N; i++) {
        this.attachMovie("photo"+i,"photo"+i,i);
        this["photo"+i]._y = ((mcOld._y+mcOld._height) || mcOld._y)+L;
        this["photo"+i]._x = posY;
        mcOld = this["photo"+i];
        indexArr.push(i);
                this["photo"+i].onPress = function() {
                var p = this;
                loadMovie("media/pict/pict"+p+".jpg", "_parent.ekr");
        };
}

как понимаете решение самое отвратное - пришлось назвать все подгружаемые клипы как понимаете типа pict_level0.menu.photo1.jpg

AlexDesinger 19.06.2008 17:30

а может поробовать сделать так:
Код:

_parent.onRollOver=function(){
setInterval(playmenu,1000)
}
ну и соответственно onEnterFrame заменить на
function playmenu(){
}?


AlexDesinger 21.06.2008 16:52

Код:

var mcload:MovieClipLoader = new MovieClipLoader();
mcload.addListener(mclListener);
var mcOld:MovieClip = null;
var indexArr:Array = [];
for (var i:Number = 1; i<=N; i++) {
        var btn_menu:MovieClip = this.createEmptyMovieClip("photo"+i, i);
        mcload.loadClip("ico/ico"+i+".jpg",btn_menu);
btn_menu._y = ((mcOld._y+mcOld._height) || 0)
        mcOld = btn_menu

        indexArr.push(i);
        trace(mcOld._y);
}

Народ вот пытаюсь сделать чтобы иконки подгружались из дирректории в динамически созданный мувик, но вот беда - не могу обработать сдвиг при загрузке, почему то для цикла это не работает, помогите плиз
тут все файлы грузятся _y=0

Wolsh 21.06.2008 17:19

Координаты и размеры задаются ПОСЛЕ загрузки, т.е. в обработчике onLoadInit

AlexDesinger 22.06.2008 03:47

ничего не выходит как бы я не ставил функцию onLoadInit все грузится практически при любых конфигурациях но вот смещение никак не прсчитывается кроме как если тупо написать вот так:
Код:

this.onLoadInit = function() {
        for (var i:Number = 1; i<=N; i++) {
                var btn_menu:MovieClip = this.createEmptyMovieClip("photo"+i, i);
                mcload.loadClip("ico/ico"+i+".jpg",btn_menu);
                btn_menu._y = ((mcOld._y+mcOld._height) || 0)+80;               
              mcOld = btn_menu;
                indexArr.push(i);
                trace(mcOld._y);
        }
};
this.onLoadError = function() {
        trace("Загрузка завершена");
};
this.onLoadInit();


Wolsh 22.06.2008 04:53

Посмотрите, например, здесь
http://flasher.ru/forum/showpost.php...9&postcount=10

AlexDesinger 23.06.2008 03:17

:eek: крутая штуковина, спасибо,
:umnik2: ток мне в этом скрипте до пенсии рпзбираться, я ж не программист...

Wolsh 23.06.2008 11:52

Хи, я тоже дизайнер. Чесслово. Давайте объясню, что непонятно.
Только Вы в той теме спрашивайте, чтоб не сорить, ОК?

AlexDesinger 23.06.2008 17:36

мне просто не понятно почему в этом цикле исполняется все - и создание клипа и загрузка картинки в клип и даже запихивание в массив только одно смещение не происходит?
Такое ощущение что не читатся значение mcOld._height, которое видимо все время равно "0"

Wolsh 24.06.2008 12:28

Вот именно поэтому. Честно говоря, это аквариум в рыбке, то что Вы написали. Где логика? Засунуть цикл в обработчик события...
Вот как должно быть: В цикле Вы создаете пустые клипы, загрузчики и слушатели, и инициализируете начало загрузки. Здесь же описываете, что должно произойти, когда загрузка завершится... Имеется в виду загрузка каждой картинки отдельно. Вы даете план действий - Когда картинка в этот клип вот этим загрузчиком загрузится, сделать с ней то-то и то-то. Цикл выполняется за доли секунды и заканчивает работу. Картинки начинают грузиться. Каждый загрузчик следит за процессом и сообщает о его ходе своему листенеру. И когда загрузка завершается, листенер этого загрузчика получает сообщение о наступлении события и запускает свой обработчик onLoadInit() - который Вы назначили ему в цикле.
У вас же код вывернут наизнанку, хотя в хелпе есть нормальный пример.

AlexDesinger 24.06.2008 15:36

Код:

var mcload:MovieClipLoader = new MovieClipLoader();
var mclListener:Object = new Object();
mclListener.onLoadInit = function(btn_menu:MovieClip) {
        btn_menu._y = ((mcOld._y+mcOld._height)+L || 0);
        mcOld = btn_menu;
        mcLast1 = btn_menu._y+btn_menu._height;
        trace(btn_menu+"1");
};
mclListener.onLoadError = function(btn_menu:MovieClip, errorCode:String) {
trace("error")
};
mcload.addListener(mclListener);
for (var i:Number = 1; i<=N; i++) {
        var btn_menu:MovieClip = this.createEmptyMovieClip("mc_ico"+i, i);
        mcload.loadClip("ico/ico"+i+".jpg",btn_menu);
        indexArr.push(i);
        mcLast2 = this["mc_ico1"]._y;
        trace(btn_menu);

}

вот все на что хватило моей фантазии + help
теперь другой баг- загрузка проходит нормально и клипы смещаются, но выстраиваются задом наперед т.е. последний клип находится в самом верху ну и первый соответсвенно снизу. Помогите плз не могу догнать как от этого избавиться или мой код попрежнему наизнанку?
trace выводит:
Код:

_level0.mc_ico1
_level0.mc_ico2
_level0.mc_ico3
_level0.mc_ico4
_level0.mc_ico41
_level0.mc_ico31
_level0.mc_ico21
_level0.mc_ico11

P.S. вопрос - обязательно ли нужно использовать xml для галереи?

Wolsh 24.06.2008 18:59

Вот теперь другое дело)))
Порядок окончания загрузки в основном от веса зависит, и он теоретически не обязан совпадать с порядком начала загрузки. И на практике почти никогда не совпадает. Т.е. перераспределять картинки всеже придется, но это ведь уже несложно? ))))
XML конечно не обязательно, просто тема там была про это. Необязательно, но очень удобно. Хотя иногда конечно чрезмерно, если не нужна вся эта информация, количество и названия картинок известны заранее и менять их не предполагается, можно и тупо забить адреса и количество в цикле, как у Вас. Я обычно так и делал))) Но я дизайнер, у меня не надо учиться программированию)

AlexDesinger 24.06.2008 19:53

Цитата:

Порядок окончания загрузки в основном от веса зависит, и он теоретически не обязан совпадать с порядком начала загрузки. И на практике почти никогда не совпадает. Т.е. перераспределять картинки всеже придется, но это ведь уже несложно? ))))
хм для меня черезвычайно сложно потому что понятия не имею как сделать.
Дело в том что они распологаются строго в зеркальном порядке, независимо от размера.Видимо загрузка почему то начинается с конца цикла или же просто смещение происходит при добавлении картинки сверху, сдвигая все вниз.

А для подсчета количества файлов и названия картинок не удобнее ли использовать php который смотрел бы все это в папке на серваке, чем каждый раз изменять xml документ при изменении количества и порядка картинок?

Wolsh 24.06.2008 22:21

Не зависит от размера?))) А вы в сеть выкладывали или хотя бы симулятором встроенным пользовались? (при просмотре в среде флэш, в открывшемся окошке плеера - View -> Download Settings, и потом по второму ctrl +Enter будет "загружать" с установленными параметрами, напр. симулировать 56 кб/сек).
Цитата:

как сделать.
У Вас загрузки запускаются в цикле, но лоадер один и листенер один. Возможно, с этим и связан порядок "моментальной" загрузки с локального диска. В моем коде галереи и в моем посте был другой алгоритм. Каждая картинка получала свой лоадер и свой листенер, без этого я не знаю как можно организовать прелоадер для каждой картинки например))
А что, РНР не умеет работать с XML? Т.е. Вы имели в виду что - передавать строкой из РНР все эти данные, что у меня в xml? Взяв их, видимо, из базы данных (потому что просто пролистить директорию - ну а если там 200 картинок, а мне надо показать десять, и определенных? А самое главное - как быть с подписями, комментариями?) Ну и в чем будет разница, кроме жуткого алгоритма определения что это за пара имя/значение? Красота XML в структуре и четком порядке. Так что если и РНР, я бы выбрал формат ДАННЫХ xml. Ну и, наверно непонятная Вам ситуация, но тем не менее - иногда Вы просто не имеете доступа к пхп, например на сайте какойнибудь Social Network. Однако можете разместить там свой флэш-модуль, дергающий картинки, видео, аудио с другой локации. Тогда вполне реально использовать просто настоящий текстовый XML-файл для конфигурации Вашего модуля и отображаемого им контента. У меня, например, такой модуль стоит и работает как часы. Да, приходится лазить руками в xmlку, но при такой организации данных это сущее удовольствие))

AlexDesinger 24.06.2008 22:49

О! отлично при симуляции Download Settings все подгружается как надо - по порядку, спасибо огромное а то я уж запарился)))))
в принципе то что я сейчас подгружаю это иконки малого размера, они будут смещаться по кругу, здесь мне не нужен прелоадер для каждой в отдельности но вот для всего меню нужен в целом.
-----
нет нет я имею ввиду чтобы определить с помощью php количество файлов в дирректории и передать их в флэш. Поскольку имя должно быть строгим "ico1,ico2...и т.п" в моем случае их не нужно передавать в flash. Вобщем то мое желание это просто автоматом отображать все что лежит в папке с картинками
-------
хотя с именем файла и подписью вы меня озадачили
---------
единственное что приходит на ум это создать upload на flash с возможностью добавить коментарий, который сохранит скажем в txt на сервер а при просмотре картинки либо выводить как подсказку либо грузить в динамическое текстовое поле.

AlexDesinger 03.07.2008 00:15

Народ, снова я ...про галлерею....
файлы подгружаются отлично, все как надо, смещаются тоже ок, строго как задуманно, но теперь дальше при перемещении происходит небольшой баг.
Суть происходящего в следующем - расположенные один под другим клипы, засунуты в массив, далее при движении мыши по _у они смещаются вверх или вниз, и достигая крайней точки, последний мувик становиться первым(сверху), а при обратном движении наоборот, соответсвенно.
Баг в следующем: при движении клипов вниз(мышь вверху) все клипы переставляются вверх "хорошо", кроме последнего, а когда клипы двигаются вверх(мышь внизу) все переставляются вниз "плохо", кроме первого.
---------------
"хорошо"-точно спереди\сзади без зазоров и накладок
"плохо"- с зазором или накладкой

Код:

center = Stage.height/2;
import flash.filters.BlurFilter;

var L:Number = 0;//длина зазора между клипами
var N:Number = 4;//количество кнопок
var i:Number = 1;//счетчик
var mcOld:MovieClip = null;//клип для смещения последующих клипов
var indexArr:Array = [];//массив для хранения клипов

var mcload:MovieClipLoader = new MovieClipLoader();// листенеры загрузки клипов
var mclListener:Object = new Object();

var index:Number = null;
var tmpVar:Object = {};

this.createEmptyMovieClip("menu_pic",this.getNextHighestDepth());

for (var i:Number = 1; i<=N; i++) {
        var btn_menu:MovieClip = menu_pic.createEmptyMovieClip("mc_ico"+i, i);
        mcload.loadClip("ico/ico"+i+".jpg",btn_menu);
        indexArr.push(i);
        top_point = menu_pic["mc_ico1"]._y;
}
mclListener.onLoadStart = function(btn_menu:MovieClip) {
};
mclListener.onLoadProgress = function(btn_menu:MovieClip) {
};
mclListener.onLoadComplete = function(btn_menu:MovieClip) {
};

mclListener.onLoadInit = function(btn_menu:MovieClip) {
        btn_menu._y = ((mcOld._y+mcOld._height)+L || 0);
        mcOld = btn_menu;
        bottom_point = btn_menu._y+btn_menu._height;
        btn_menu._alpha = 50;
};
mclListener.onLoadError = function(btn_menu:MovieClip, errorCode:String) {
};
mcload.addListener(mclListener);

this.onEnterFrame = function() {
        shag = Math.floor((center-_ymouse)/50);
        for (var i = 1; i<=N; i++) {

                if ((menu_pic["mc_ico"+i]._y)>bottom_point) {
                        tmpVar = indexArr.pop();
                        menu_pic["mc_ico"+tmpVar]._y = menu_pic["mc_ico"+indexArr[0]]._y-menu_pic["mc_ico"+tmpVar]._height-L;
                        indexArr.unshift(tmpVar);
                }
                if ((menu_pic["mc_ico"+i]._y)<top_point) {
                        tmpVar = indexArr.shift();
                        menu_pic["mc_ico"+tmpVar]._y = menu_pic["mc_ico"+indexArr[N-2]]._y+menu_pic["mc_ico"+tmpVar]._height+L;
                        indexArr.push(tmpVar);
                }
                menu_pic["mc_ico"+i]._y += shag;
        }
};

--------------------
я так понял что накладка происходит на значение "shag" посколку чем ближе к краю экрана тем сильнее смещение, но я не могу понять почему такая дискриминация клипов, и главное, вопрос как этого избежать.

Wolsh 03.07.2008 00:48

var move_mc:Object = {};
Это ладно, хотя суффикс _mc ставится именам мувиклипов, ЧТОБЫ ЛЕГЧЕ БЫЛО РАЗБИРАТЬСЯ (!). Ну а дальше
Код:

menu_pic["mc_ico"+move_mc]._y =
menu_pic["mc_ico"+indexArr[0]]._y-menu_pic["mc_ico"+move_mc]._height-L;

Не понял...

AlexDesinger 03.07.2008 01:04

ну move_mc - это номер клипа который нужно переместить, соостветсвенно - menu_pic["mc_ico"+move_mc]._y = координата по _y первого элемента массива + высота перемещаемого клипа

или здесь неправильно?
Это переделанный код AlexBeginner -а, в начале темы для перестановки клипов
------
да моя ошибка move_mc это не мувик, а переменная - номера мувика.
------------
поправил....
е-мое, можно и без tmpVar(move_mc) обойтись, просто заменить его на "i", правда баг при этом не исчезает

Alex_beginner 03.07.2008 14:36

Здравствуйте AlexDesigner!

Я уже третий раз возвращаюсь к этой теме. Видимо тема очень актуальна.

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

Пожалуйста изложите суть проблемы подробно и по пунктам. Приложите исходник, если это возможно (формат Флеш 8). Как говориться, лучше один раз увидеть, чем 100 раз услышать.

AlexDesinger 03.07.2008 15:39

Вложений: 1
Здравствуйте, AlexBegginer, рад что вам не безразлична эта тема, потому что для меня она очень актуальна.

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

в коде я добавил _alpha=50 для всех клипов чтоб было видно как они накладываются.

Alex_beginner 03.07.2008 15:55

AlexDesigner! Пожалуйста выложите файл flv в формате Flash 8 (не CS), если Вас это не затруднит . У меня нет CS, поэтому файл не открывается.

В принципе проблема с Вашей прогой стала понятна, после того как я увидел работу swf -файла. Оригинальный тестовый пример!


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

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