PDA

Просмотр полной версии : горизонтальный скролл и attachMovie


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

Вот код:

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
Вот сравните строчки:

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
Лан. Я чел в душе добрый (но только в душе):). Ща займусь. А на счет долга не беспокойтесь. Это лишнее.
Кстати, плиз выложи исходник в формате Флеша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
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?p=745949&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
Здравствуйте, AlexBegginer, рад что вам не безразлична эта тема, потому что для меня она очень актуальна.

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

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

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

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

AlexDesinger
03.07.2008, 17:54
Да, сорри, забыл, вот файл для flash8

AlexDesinger
05.07.2008, 17:53
Народ, это выше моих сил...вот что получилось:
speed = 0.03;
this.onEnterFrame = function() {
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);
} else {
menu_pic["mc_ico"+i]._y = Math.floor(menu_pic["mc_ico"+i]._y+((center-Math.floor(_ymouse))*speed));
}
}
};

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

по ходу обнаружил еще один баг - при первом пролистывании иногда клип попадает куда-то в середину, потом все выпрямляется...
AlexBeginner, никак не пойму почему должно быть menu_pic["mc_ico"+indexArr[N-2]]._y???
такое ощущение что при первом пролистывании клип оказывается не последним, а предпоследним - что собственно и указано(N-2), но странно что дальше все выпрямляется и работает....

Wolsh
05.07.2008, 19:42
AlexDesinger, удивляет нерациональное использование массива в Вашем коде. Проще ведь хранить в нем ссылки на сами картинки, чем их номера, которые потом перевычислять в ссылки))
К тому же простой трейс показывает, что у Вас там пять элементов вместо четырех.
В общем я решил что проще переписать алгоритм по-своему)))

А, насчет N-2 забыл сказать. В массивах индексы идут с нуля. Пэтому у четвертого(последнего) элемента индекс - 3. Соотв. у предпоследнего - 2, тоесть N-2, если N - это количество элементов.

AlexDesinger
05.07.2008, 20:32
Ай, спасибо тебе добрый человек, я вообще запарился с этой темой :umnik2: но теперь круто, все работает!!!!!!!!!)))))))) УУУРРРАААА!!!!:yahoo:

AlexDesinger
08.07.2008, 12:18
Wolsh, подскажи плиз - в onLoadInit используется ссылка "this" на клип который в этот момент действует....я не могу понять как она работает - как она определяет на какой мувик я нажал, дело в том что мне нужно дальше грузить большую картинку в мувик "ekran", но из-за того что я использую ссылку "this" в пути, соответственно имена больших картинок пришлось назначить как "_level0.menu_pic.mc_ico1.jpg"... и тд.
icoListener.onLoadInit = function(btn_menu:MovieClip) {
indexArr.push(btn_menu);
btn_menu._y = ((mcOld._y+mcOld._height)+L || 0);
mcOld = btn_menu;
btn_menu.filters = [myColorMatrix_filter];

btn_menu.onRollOver = btn_menu.onDragOver=focusOn;
btn_menu.onRollOut = btn_menu.onDragOut=focusOff;
btn_menu.onPress = loadBig;
//mx.transitions.TransitionManager.start(this,{type:mx.transitions.Photo, direction:0, duration:1, easing:mx.transitions.easing.Strong.easeOut, param1:empty, param2:empty});
if ((count += 1) == N) {
go();
}
};
-----
function loadBig() {
//создаем предзарузчик больших картинок
createEmptyMovieClip("progressBar_mc",3);
progressBar_mc.createEmptyMovieClip("bar_mc",4);
progressBar_mc.createEmptyMovieClip("stroke_mc",5);

with (progressBar_mc.stroke_mc) {
lineStyle(0,0x000000);
moveTo(0,0);
lineTo(100,0);
lineTo(100,10);
lineTo(0,10);
lineTo(0,0);
}
with (progressBar_mc.bar_mc) {
beginFill(0xFF0000,100);
moveTo(0,0);
lineTo(100,0);
lineTo(100,10);
lineTo(0,10);
lineTo(0,0);
endFill();
_xscale = 0;
}
progressBar_mc._x = 200;
progressBar_mc._y = 200;

var pictListener:Object = new Object();
pictListener.onLoadStart = function(target_mc:MovieClip) {
progressBar_mc.bar_mc._xscale = 0;
};
pictListener.onLoadProgress = function(target_mc:MovieClip, bytesLoaded:Number, bytesTotal:Number) {
progressBar_mc.bar_mc._xscale = Math.round(bytesLoaded/bytesTotal*100);
};
pictListener.onLoadComplete = function(target_mc:MovieClip) {
progressBar_mc.removeMovieClip();
};
pictListener.onLoadInit = function(target_mc:MovieClip) {

};

var image_mcl:MovieClipLoader = new MovieClipLoader();
image_mcl.addListener(pictListener);

image_mcl.loadClip("pict/"+this+".jpg",ekran);
pictListener.onLoadError = function(target_mc:MovieClip) {
image_mcl.loadClip("error/ico_error.jpg",ekran);
};
}

как лучше сделать? Я пытался через строку вычислить последний символ, но как понимаешь ничего не вышло))))))

Wolsh
08.07.2008, 12:34
icoListener.onLoadInit = function(btn_menu:MovieClip) {
indexArr.push(btn_menu);
......

btn_menu.id = count;
btn_menu.onPress = loadBig;
...

if ((count += 1) == N) {
go();
}
};

-----
function loadBig() {

.......

image_mcl.loadClip("pict/"+this.id+".jpg",ekran);
....
}

AlexDesinger
08.07.2008, 14:28
ок, спасибо...я так понял что count считает по порядку до N чтобы начать вращение и присваивает номер клипа к ссылке, все ок когда нет ошибок загрузки.
Я сейчас делаю что если ошибка, то грузить "ico_error" - в этом случае номера сбиваются в случае с count(сначала почему-то загружаются ошибочные файлы, потом, остальные)
icoListener.onLoadError = function(btn_menu:MovieClip) {
errorArr.push(btn_menu);
mcload.loadClip("error/ico_error.jpg",btn_menu);
error_txt.text = "Ошибка загрузки файла:"+errorArr;
};
соответсвенно имена клипов не совпадают с count и загрузка получается некорректной...
или проще оствить эти длинные имена, чтоб не париться?

Wolsh
08.07.2008, 15:42
Всё потому что Вы не слушае старика Волша, а делаете по-своему))) Это конечно хорошо, когда получается задуманное. Но тут я Вам не подскажу как лучше, потому что сам так никогда не делал. У меня всегда для каждой картинки свой загрузчик, и подобных проблем в принципе не возникает - каждый клип получает свой id, реально соответствующий картинке, которая в него грузится, со всеми вытекающими удобствами. Советую и Вам так сделать, пока не накопилось еще проблем)))

AlexDesinger
09.07.2008, 03:03
т.е вы хотите сказать что придется все-таки использовать xml?
а мне так хотелось без него обойтись :away:

ну по идее меня сейчас все устраивает как работает в этом движке, за исключением названия файлов.
я вот так сумел решить эту проблемму:
icoListener.onLoadInit = function(btn_menu:MovieClip) {
indexArr.push(btn_menu);
......

btn_menu.id = btn_menu.getDepth()
btn_menu.onPress = loadBig;
...

if ((count += 1) == N) {
go();
}
};

-----
function loadBig() {

.......

image_mcl.loadClip("pict/"+this.id+".jpg",ekran);
....
}

Решение не самое элегантное, но сбоев не происходит....пока
Единственное надо подумать как сделать коменты к картинкам.

Может использовать ту же ссылку и загружать описание из *.txt?
Хотя пока даже не представляю как это возможно

Wolsh
09.07.2008, 12:09
т.е вы хотите сказать что придется все-таки использовать xml?Не понял, при чем здесь XML? Я только о порядке/алгоритме загрузки говорю. Вы создаете один загрузчик и в цикле выдаете ему задания на загрузку, а потом в единственном обработчике разбираетесь, кто это у Вас загрузился. Поскольку назначенные заранее, до начала загрузки, свойства контейнеров пропадут после загрузки, Вы не можете сохранить информацию, идентифицирующую картинку, и вынуждены "выковыривать" ее из имени, глубины и т.д. клипа-контейнера.
Как предлагаю я (собственно, уже не первый раз). В цикле создаются загрузчики, листенеры и обработчики для каждой картинки. Таким образом каждый обработчик будет иметь событие загрузки только одной, конкретной картинки. Соответственно он будет безошибочно знать всю сопутствующую картинке инфу, какую Вы ему дадите...

AlexDesinger
09.07.2008, 12:28
А как же мне это реализовать?
Я пока что не могу разобраться как динамически создавать листенеры...
попробую разобрать ваш пример, что вы скидывали в начале...:wacko:

ventblanc
29.07.2008, 12:50
:umnik2:
спасибо вам за код, всем, вот использовал под свои нужды и столкнулся с небольшими трудностями, а именно с attachMovie:

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

и 2. При атаче, картинки внутри МувиКлипа выравниваются по левому краю. Не смог сделать по центру :(

var N:Number = 14;
var L:Number = 20;
list3D = this.createEmptyMovieClip("list3D", this.getNextHighestDepth());


for (var i:Number = 1; i<=N; i++) {
list3D.attachMovie("mc3d"+i, "mc3d"+i, i);
list3D["mc3d"+i]._y = ((mcOld._y + mcOld._height) || mcOld._y)+L;
mcOld = list3D["mc3d"+i];
list3D["mc3d"+i]._x = list3D["mc3d"+i]._width/2;

}
спасибо, если кто поможет :bye:

ventblanc
01.08.2008, 10:46
найдена ошибка - оказалось что при создании мувиклипов была выбрана "контрольная точка" мувиклипа "middle", этот код работает при "контрольной точке" - "top". почемуто.

Wolsh
01.08.2008, 12:01
этот код работает при "контрольной точке" - "top". почемуто.Потому что программно создаваемые клипы имеют начало координат в левой верхней точке. Поэтому код всегда опирается на этот стандарт (ну кроме каких-то конкретных случаев, например связанных с вращением клипа вокруг его центра).
Также всегда всю графику следует "ставить в ноль", т.е. чтобы точка 0,0 была в верхнем левом углу изображения. Собственно, в простейшем случае выделяете всю графику в кадре и пишете в полях координат ноли. Программа не обладает телепатией, чтобы самой догадываться, где у Вашего клипа ПОДРАЗУМЕВАЕТСЯ ноль. Она просто использует реальный ноль)))
По поводу кода - никогда так не делайте, создавайте ССЫЛКИ на клип и используйте их, не заставляйте процессор каждый раз высчитывать и разыскивать list3D["mc3d"+i]
for (var i:Number = 1; i<=N; i++) {
var m3d:MovieClip = list3D.attachMovie("mc3d"+i, "mc3d"+i, i);
m3d._y = ((mcOld._y + mcOld._height) || mcOld._y)+L;
mcOld = m3d;
m3d._x = m3d._width/2;
}

shurco2
01.08.2008, 18:21
уважаеммые GooRoo //
я модифицировал данные исходники под себя .. теперь он работает черех xml ...
подскажите как прикрутить к картинке внешнюю ссылку которая берется из xml .. подайте идею ... а я там сам что нужно попробую вставить .. а то бьюсь об эту задачю головой уже сутки .. и ничего не получается :rolleyes::rolleyes::rolleyes:

NoCD
18.10.2008, 02:51
создай функцию, которая будет обрабатывать xml документ.
а на счёт сколла.
Не проще ли вычислять положение мувика при помощи Math.floor?

conteiner //созданный мувик под контейнер
mx=Math.floor(conteiner.this._x/размер мувика) //целое число текущего положения по x
my=Math.floor(conteiner.this._y/размер мувика)//целое число текущего положения по y

Ведь удобно сделать скролл в контейнере, который можно разместить в любое место изменив conteiner._x и conteiner._y

nevedomskiy
30.10.2008, 11:25
Нашел Ваш код, выражаю огромную благодарность за него. Он оказался очень полезен. Я - довольно плохо разбираюсь с кодами.. да и вообще во флеше. Хотел спросить как можно сделать так что бы вращающиеся кантинки не притормаживали а вращались максимально плавно?
на всякий случай код:
var center:Number = Stage.width/2;
var speed:Number = 0.01;
var L:Number = 15;//длина зазора между клипами
var N:Number = 16;//количество кнопок
var count:Number = 3;//счетчик загрузки
var mcOld:MovieClip = null;//клип для смещения последующих клипов
var indexArr:Array = new Array();//массив для хранения клипов

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

var tmpVar:Object;//MovieClip;

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);
}
mclListener.onLoadStart = function(btn_menu:MovieClip) {
};
mclListener.onLoadProgress = function(btn_menu:MovieClip) {
};
mclListener.onLoadComplete = function(btn_menu:MovieClip) {
};

mclListener.onLoadInit = function(btn_menu:MovieClip) {
indexArr.push(btn_menu);
btn_menu._x = ((mcOld._x+mcOld._width)+L || 0);
mcOld = btn_menu;
btn_menu._alpha = 100;
if ((count +=1) == N) go();
};
mclListener.onLoadError = function(btn_menu:MovieClip, errorCode:String) {
};

function go() {

var top_point:Number = menu_pic._x-3;
var bottom_point:Number = menu_pic._x+menu_pic._width+3;

this.onEnterFrame = function() {
var point = {y:10, x:indexArr[0]._x};
menu_pic.localToGlobal(point);
if ((point.x+menu_pic._width)>bottom_point) {
indexArr.unshift(indexArr.pop());
indexArr[0]._x = indexArr[1]._x-indexArr[0]._width-L;
}
if (point.x<top_point) {
indexArr.push(indexArr.shift());
indexArr[N-1]._x = indexArr[N-2]._x+indexArr[N-2]._width+L;
}
menu_pic._x += Math.floor((center-_xmouse)*speed);
};
}
Заранее спасибо.

nevedomskiy
31.10.2008, 12:16
Вот для наглядности разместил мувик
http://rozenbaum2008.ru/baner/baner.html

Wolsh
31.10.2008, 12:22
У меня например никто не притормаживает, все движется плавно, единственно както неприятно для глаза - может фпс маленький?

nevedomskiy
31.10.2008, 15:15
фпс ничего не дает... все равно поддергивание остается.. :(