PDA

Просмотр полной версии : Создание слайдшоу


Kristik
13.10.2006, 16:54
Добрый день!

Подскажите, пожалуйста, как мне создать во флэше слайдшоу?

Есть 3 swf файла, которые нужно поочередно воспроизводить. Первый проигрался, тут же начинается воспроизведение следующего.
Как проще всего это реализовать?

Во флеше не особо разбираюсь :(

Заранее благодарю за ответы!

Kristik
13.10.2006, 16:57
Нашел в форуме следующий код



Есть "главный" файл, в котором 3 фрейма, каждый фрейм подгружает свой swf файл.

var container:MovieClip = _root.createEmptyMovieClip("container", 1);
// Создаём контейнер для подгрузки
var mcLoader:MovieClipLoader = new MovieClipLoader();
// Создаём функцию для отслежки загрузки
mcLoader.addListener(this);
mcLoader.loadClip("1.swf", container);


Но у меня не получается заставить это работать:(
Т.е. я создал новый файл. В нем сделал 3 фрейма. В каждом из этих фреймов написал код, указанный выше. Не работает :(

ПОМОГИТЕ!!
Вопрос достаточно срочный :(

Хемуль
13.10.2006, 17:14
2 Kristik:
Тут похожая задача:
http://flasher.ru/forum/showthread.php?t=86343

wvxvw
13.10.2006, 18:09
А зачем this в листенеры добавлять? Просто интересно, я уже не первый раз вижу этот код, очевидно, он из какого-то очень популярного источника, интересно все таки, что ж там дальше-то было? =)

Хемуль
13.10.2006, 18:25
2 wvxvw:
А что дальше? Слушали, что скажет _root, наверное.... ^_^ Или куда там этот код вставлялся...

2 Kristik:
А вы не помните, где нашли этот код? А то я не такой наблюдательный, как wvxvw, но теперь тоже стало интересно...

Kristik
13.10.2006, 18:29
2 Хемуль:

Нашел в этом форуме! Честно говоря, ссылка не сохранилась :(

Ребята, помогите реализовать идею со слайдшоу!!
Пожалуйста!!

Буду жутко признателен за исходник.. но это в идеале, я сам понимаю.. люди все занятые и дергать их понапрасну мне не стоило!

Пожалуйста!

Хемуль
13.10.2006, 18:35
2 Kristik:
Вечером, может, постараюсь вам написать... Думаю, и до меня напишут.

Kristik
13.10.2006, 18:47
2 Хемуль:

Спасибо!! Буду очень ждать!!

Хемуль
14.10.2006, 11:32
var movieBaseName:String = "resources/movie";
var movieExtension:String = "swf";
var currentMovie:Number = 0;
var moviesNumber:Number = 4;
var movieContainerClipBaseName:String = "movie";
var left:Number = 100;
var top:Number = 100;
var loading:Boolean = false;
var firstMovie:Boolean = true;

var clipsLoader:MovieClipLoader = new MovieClipLoader();
var clipsLoaderListener:Object = new Object();

clipsLoaderListener.onLoadStart = function(targetClip:MovieClip)
{
loading = true;
}

clipsLoaderListener.onLoadComplete = function(targetClip:MovieClip)
{
loading = false;
var previousMovie:Number = (currentMovie == 1 ? moviesNumber : currentMovie - 1);
var previousMovieClipName:String = movieContainerClipBaseName + previousMovie;
if (targetClip._parent[previousMovieClipName] != undefined)
{
targetClip.gotoAndStop(1);
}
if (firstMovie)
{
firstMovie = false;
loadNextMovie();
}
targetClip.onEnterFrame = function()
{
if (this._currentframe == this._totalframes)
{
if (loading)
{
this.gotoAndStop(this._totalframes);
}
else
{
var currentMovieClipName:String = movieContainerClipBaseName + (currentMovie);
var currentMovieClip:MovieClip = this._parent[currentMovieClipName];
currentMovieClip.play();
this.removeMovieClip();
loadNextMovie();
}
}
};
}

function loadNewMovie(movieNumber:Number)
{
var movieName:String = movieBaseName + movieNumber + "." + movieExtension;
var movieContainerClipName:String = movieContainerClipBaseName + movieNumber;
var containerClip:MovieClip = this.createEmptyMovieClip(movieContainerClipName, this.getNextHighestDepth());
var previousMovie:Number = (movieNumber == 1 ? moviesNumber : movieNumber - 1);
var previousMovieClipName:String = movieContainerClipBaseName + previousMovie;
this[previousMovieClipName].swapDepths(containerClip);
containerClip._x = left;
containerClip._y = top;
clipsLoader.loadClip(movieName, containerClip);
}

function loadNextMovie()
{
currentMovie++;
if (currentMovie > moviesNumber)
{
currentMovie = 1;
}
loadNewMovie(currentMovie);
}

clipsLoader.addListener(clipsLoaderListener);
loadNextMovie();

Картинки загружаются в мувиклипы, расположенные один под другим. Пока один проигрывается, второй под ним загружает в себя флешку. Если картинка нижняя загрузится раньше, чем проиграется верхняя, то она ждёт, пока верхняя проиграется и удалится. Если нижняя картинка загрузится позже, чем закончит проигрываться верхняя, то верхняя проигрывается до конца, ждёт загрузки нижней, а потом удаляется, после чего проигрывается нижняя. Может где-то ошибся. Тестировать с разными размерами лень. Будут вопросы или проблемы, пишите.
Исходник прикрепляю...

wvxvw
14.10.2006, 13:48
Альтернативный вариант =)
var _l1:MovieClipLoader = new MovieClipLoader();
var _l2:Object = {};
var _l3:Array = ["slide1.swf", "slide2.swf", "slide3.swf"];
var _l4:MovieClip = _root.createEmptyMovieClip("container", 0);
var _l5:Number = 0;
var _l6:Array = [];
for (i=0; i<_l3.length; i++) {
var _l7:MovieClip = _l4.createEmptyMovieClip("container"+i, _l4.getNextHighestDepth());
_l6.push(_l7);
_l1.loadClip("directory/"+_root._l3[i], _l7);
_l7._x = Stage.width;
_l7._y = Stage.height;
}
_l1.addListener(_l2);
_l2.onLoadComplete = function(mc) {
if (mc == _l6[0]) {
mc._x = 0;
mc._y = 0;
_l5++;
_root.switcher(_l5);
}
};
function switcher() {
_root.onEnterFrame = function() {
if (_root._l6[_root._l5-1]._currentframe == _root._l6[_root._l5-1]._totalframes && _root._l6[_root._l5].getBytesTotal() == _root._l6[_root._l5].getBytesLoaded()) {
_root._l6[_root._l5-1].stop();
_root._l6[_root._l5-1]._x = Stage.width;
_root._l6[_root._l5-1]._y = Stage.height;
_root._l6[_root._l5]._x = 0;
_root._l6[_root._l5]._y = 0;
_root._l5++;
}
};
}

15470

Kristik
14.10.2006, 14:36
Хемуль, wvxvw!! Спасибо огромное!! пошле пробовать :)

Kristik
14.10.2006, 15:14
2 Хемуль:
А можно еще один вопрос..
Мне нужно, чтобы это слайдшоу отображалось во весь экран.
Для этого в каждый отдельный клип я вставляю в первый кадр команду

fscommand ("fullscreen", true);
(нашел в форуме)

Все работает, если запускать "слайды" по очереди:) тыкая на них мышкой. Отображаются во весь экран.

А вот если эти уже "полноэкранные" слайды запускать из Вашего loadMoviesSequence, то все отображается в стандартном окне..

В loadMoviesSequence.swf тоже пробовал встроить
fscommand ("fullscreen", true);
Открывается во весь экран, но "слайды" проигрываюются в стандартном, маленьком размере :(

Помогите, пожалуйста..

Хемуль
14.10.2006, 21:53
Красным выделены строки, которые добавились. Исчезли строки, задающие начально положение мувиклипа-контейнера для загружаемой картинки. Теперь, когда картинка загружается, выбирается её бОльшая сторона и картинка маштабируется так, чтобы её бОльшая сторона помещалась в сцену полностью. После чего флешка центрируется внутри сцены. Может не самое лучшее, но вам, наверное, сгодится. Будут вопросы, пишите.
Код:

var movieBaseName:String = "resources/movie";
var movieExtension:String = "swf";
var currentMovie:Number = 0;
var moviesNumber:Number = 4;
var movieContainerClipBaseName:String = "movie";
var loading:Boolean = false;
var firstMovie:Boolean = true;

var clipsLoader:MovieClipLoader = new MovieClipLoader();
var clipsLoaderListener:Object = new Object();

clipsLoaderListener.onLoadStart = function(targetClip:MovieClip)
{
loading = true;
}

clipsLoaderListener.onLoadInit = function(targetClip:MovieClip)
{
var clipScale:Number;
if (targetClip._width > targetClip._height)
{
clipScale = (Stage.width / targetClip._width) * 100;
}
else
{
clipScale = (Stage.height / targetClip._height) * 100;
}
targetClip._xscale = clipScale;
targetClip._yscale = clipScale;
targetClip._x = (Stage.width - targetClip._width) / 2;
targetClip._y = (Stage.height - targetClip._height) / 2;
targetClip._visible = true;
}

clipsLoaderListener.onLoadComplete = function(targetClip:MovieClip)
{
loading = false;
var previousMovie:Number = (currentMovie == 1 ? moviesNumber : currentMovie - 1);
var previousMovieClipName:String = movieContainerClipBaseName + previousMovie;
if (targetClip._parent[previousMovieClipName] != undefined)
{
targetClip.gotoAndStop(1);
}
if (firstMovie)
{
firstMovie = false;
loadNextMovie();
}
targetClip.onEnterFrame = function()
{
if (this._currentframe == this._totalframes)
{
if (loading)
{
this.gotoAndStop(this._totalframes);
}
else
{
var currentMovieClipName:String = movieContainerClipBaseName + (currentMovie);
var currentMovieClip:MovieClip = this._parent[currentMovieClipName];
currentMovieClip.play();
this.removeMovieClip();
loadNextMovie();
}
}
};
}

function loadNewMovie(movieNumber:Number)
{
var movieName:String = movieBaseName + movieNumber + "." + movieExtension;
var movieContainerClipName:String = movieContainerClipBaseName + movieNumber;
var containerClip:MovieClip = this.createEmptyMovieClip(movieContainerClipName, this.getNextHighestDepth());
var previousMovie:Number = (movieNumber == 1 ? moviesNumber : movieNumber - 1);
var previousMovieClipName:String = movieContainerClipBaseName + previousMovie;
this[previousMovieClipName].swapDepths(containerClip);
containerClip._visible = false;
clipsLoader.loadClip(movieName, containerClip);
}

function loadNextMovie()
{
currentMovie++;
if (currentMovie > moviesNumber)
{
currentMovie = 1;
}
loadNewMovie(currentMovie);
}

fscommand ("fullscreen", true);
clipsLoader.addListener(clipsLoaderListener);
loadNextMovie();

Исходник не прикрепляю...

Kristik
14.10.2006, 22:05
2: Хемуль!!! Спасибо :))) ДА, все работает!!! :)))

Хемуль
14.10.2006, 22:12
2 Kristik:
Учтите, что загружаемая флешка центрируется внутри сцены. Поэтому достаточно важно подобрать необходимое соотношение размеров сторон сцены. Просто картинки, линейные размеры которых в пикселях отличаются в разы, могут выглядеть по-разному для разных размеров сцен. Конечно, в идеале лучше иметь одинаковые по размеру картинки и размеры сцены подбирать соответственно.