Форум 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, поможешь доделать? Я в долгу не останусь. а сдавать завтра..


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

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