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

fire 24.02.2011 13:58

панорама - как организовать прокрутку по горизонтали и зациклить изображение
 
народ,у меня вот такая проблема

пишу на AS 2.0
создается пустой мувик,в него загружается панорамное изображение,это изображение,естественно,не помещается на экране полностью,нужно сделать прокрутку,то есть схватить мышкой и потащить - перемещение только по горизонтали.

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

RolleR25 27.02.2011 01:49

Вот меня тоже такие вопрос интересуют.

Dalass13 27.02.2011 10:32

Наваял по-быстрому

Код подействует при условиях:

- нужно 2 панорамы которые находятся друг к другу впритык;
- "шов" этих двух панорам должен быть по центру MovieClip, в котором находится
- высота панорамы == высоте кадра;

код в кадр:

Код AS1/AS2:

panorama.onPress = function() {
        startDrag(this);
};
 
 
panorama.onRelease = function() {
        panorama._y = _root._height/2; // панорама всегда центрирована по вертикали
        stopDrag();
};
 
panorama.onReleaseOutside = panorama.onRelease;
 
this.onEnterFrame = function() {
        panorama._y = _root._height/2;
          //если панорама достигает предела с правой стороны...
        if (panorama._x<-panorama._width/2+_root.width ) {
                panorama._x = _root._width; // ...ставим ее центр (шов) в конец координаты х
        }
          //если панорама достигает предела с левой стороны...
        if (panorama._x>panorama._width/2) {
                panorama._x = 0; // ... ставим ее центр (шов) в начало координаты х
        }
};

проблема кода - можно на 1 долю секунды перетащить панораму по _у, но с этим разобраться грамотно не было времени, может кто подхватит

Есть конечно вариант без скроллинга с помощью нажатия и перетаскивания, но просили именно с перетаскиванием, но вот, на всякий случай:

Код AS1/AS2:

this.onEnterFrame = function() {
        // у меня ширина кадра 500
        // если мышь находится в правой стороне экрана...
        if (_xmouse>250) {
                panorama._x -= (_xmouse -250)/15; // ...скроллим панораму вправо
        }
        // если мышь находится в левой стороне экрана...
        if (_xmouse<250) {
                panorama._x += (250 -_xmouse)/15;// ...скроллим панораму влево
        }
        //если панорама достигает предела с правой стороны...
        if (panorama._x<-panorama._width/2+_root.width ) {
                panorama._x = _root._width; // ...ставим ее центр (шов) в конец координаты х
        }
        //если панорама достигает предела с левой стороны...
        if (panorama._x>panorama._width/2) {
                panorama._x = 0; // ... ставим ее центр (шов) в начало координаты х
        }
};


fire 28.02.2011 13:47

уважаемый Dalass13,с прокруткой проблема решена:

Код AS1/AS2:

mc.onMouseDown = function(){
                this.startDrag(false,-this._width*2,0,this._width*2,0);
                }
 
        mc.onMouseUp = function(){
                this.stopDrag();
                }

а вот с зацикливанием большие проблемы.У меня методом createMovieClip создается пустой мувик,затем в нем создается еще 8 пустых муви,и затем в них загружаются картинки.

Dalass13 28.02.2011 17:52

Можно подробнее насчет кучи этих MC. Для чего конкретно они нужны?

fire 01.03.2011 07:39

по порядку:

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

Dalass13 01.03.2011 08:38

Дак я же сказал уже. В твоем случае:

- начни ставить фотографии с середины кадра, т.е. ширина кадра - 500, ставишь на х=250
- от первой фотки выстраиваешь все остальные до конца
- затем ставишь еще дополнительно последнюю фотку ПЕРЕД первой
- используй алгоритм, который я предложил, но с немного другими условиями. То есть слева у тебя будет проверка только по половиной толщине одного фото и перенос на стык между 5 и 6 фото, а справа по половиной толщине шестого и перенос на стык между 1 и 2 .

Знаю, что трудно понять, о чем я. Если бы инет не вырубили, написал бы алгоритм, а т.к. сижу с телефона, такой возможности нет

fire 01.03.2011 14:43

вот мой код:
/*идея уже такая - если загрузить в конец контейнера еще одну картинку - копию первой.Тогда можно будет просто сдвигать весь клип с картинками на определенную координату,чтобы изображение казалось циклическим.Создаются два пустых мувика,ставятся по координате Х срава и слева от контейнера.Двигаем,значит,наш мув - если есть пересечение с пограничным,мы его возвращаем так,чтобы всегда видеть первый(или последний)фрагмент.Вот,не работает((*/

Код AS1/AS2:

stop();
 
//создается пустой MovieClip с именем mc
this.createEmptyMovieClip("mc", this.getNextHighestDepth());
 
//заполняется мувиками (около 8)
mc.createEmptyMovieClip("mc1",this.getNextHighestDepth()+1);
mc.createEmptyMovieClip("mc2",this.getNextHighestDepth()+2);
mc.createEmptyMovieClip("mc3",this.getNextHighestDepth()+3);
mc.createEmptyMovieClip("mc4",this.getNextHighestDepth()+4);
mc.createEmptyMovieClip("mc5",this.getNextHighestDepth()+5);
mc.createEmptyMovieClip("mc6",this.getNextHighestDepth()+6);
mc.createEmptyMovieClip("mc7",this.getNextHighestDepth()+7);
mc.createEmptyMovieClip("mc8",this.getNextHighestDepth()+8);
mc.createEmptyMovieClip("mc9",this.getNextHighestDepth()+9);
 
this.createEmptyMovieClip("cLeft",this.getNextHighestDepth());
this.createEmptyMovieClip("cRight",this.getNextHighestDepth());
 
                        cLeft._width = 20;
                        cLeft._height = 50;
 
                        cRight._width = 20;
                        cRight._height = 50;
 
 
 
 
mc._xscale = 50;
mc._yscale = 36;
 
mc.mc1.loadMovie("cont/1.jpg");
 
mclip1 = new MovieClipLoader();
 
_global.i=2;
//        _global.xcoord = 0;
 
var loadListener:Object = new Object;
        loadListener.onLoadInit = function(mcl:MovieClip){
                a = _global.i;
                a--;
                mc["mc"+_global.i]._x=mc["mc"+a]._x+mc["mc"+a]._width;
                _global.i++;
                mclip1.loadClip("cont/"+_global.i+".jpg", _root.mc["mc"+_global.i]);
 
                        cLeft._x = -mc._width+mc.mc1._width;
                        cRight._x = mc._width+mc.mc1._width;
 
                        cLeft._width = 20;
                        cLeft._height = 50;
 
                        cRight._width = 20;
                        cRight._height = 50;
                }
 
        mclip1.addListener(loadListener);
        mclip1.loadClip("cont/"+_global.i+".jpg", _root.mc["mc"+_global.i]);
 
        delete loadListener;
        delete mclip;
 
 
        mc.onMouseDown = function(){
//тут проверяю на пересечение с клипом-границей слева.Если есть пересечение,сдвигаем картинку
//НЕ РАБОТАЕТ
                        if(mc.hitTest(cLeft)==true){
                        mc._x += mc._width-mc.mc1._width;}else{
                        trace(mc._x);
                        }
                this.startDrag(false,-this._width*2,0,this._width*2,0);
                }
 
        mc.onMouseUp = function(){
                this.stopDrag();
 
                trace(cLeft._x);
                trace(cRight._x);
 
                }

может,подскажете,где косяк утаился?


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

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