webForumDet fria alternativet

Hjälp med slideshow och lager.

Flash

6 svar · 322 visningar · startad av Obbelix

Medlem sedan okt. 2002257 inlägg
Frågan#1

Har laddat ner denna "slideshow" för lite tester (är novis på flash), och har fått det fungera halvvägs.
Det jag vill är att ha flera lager i flashen, säg 5st, och att slideshowen ligger i det understa lagret. Men som det är nu lägger den sig alltid överst även om jag lägger scritptet i det understa lagret.
Nån som vet hur man gör (om det går) så det blir som jag vill ha det?

// set random # variables - each must be 0 for first 'while' loop below
var randomNum = 0;
var randomNumLast = 0;

// parent container
var container_mc = this.createEmptyMovieClip("container",0);
// movie clip containers
container_mc.createEmptyMovieClip("loader1_mc",2);
container_mc.createEmptyMovieClip("loader2_mc",1);

// preload watcher
this.createEmptyMovieClip("watcher_mc",100);

// load xml
images_xml = new XML();
images_xml.ignoreWhite=true;
images_xml.onLoad = parse;
images_xml.load("images.xml");

function parse(success) {
	if (success) {
		imageArray = new Array();
		var root = this.firstChild;
		_global.numPause = Number(this.firstChild.attributes.timer * 1000);
		_global.order = this.firstChild.attributes.order;
		_global.looping = this.firstChild.attributes.looping;
		_global.fadetime = Number(this.firstChild.attributes.fadetime);
		_global.xpos = Number(this.firstChild.attributes.xpos);
		_global.ypos = Number(this.firstChild.attributes.ypos);
		var imageNode = root.lastChild;
		var s=0;
		while (imageNode.nodeName != null) {
			imageData = new Object;
			imageData.path = imageNode.attributes.path;
			imageArray[s]=imageData;
			imageNode = imageNode.previousSibling;
			s++;
		}
		// place parent container
		container_mc._x = _global.xpos;
		container_mc._y = _global.ypos;
		// parse array
		imageArray.reverse();
		imageGen(imageArray);
	} else {
		trace('problem');
	}
}

// depth swapping
function swapPlace(clip,num) {
	eval(clip).swapDepths(eval("container_mc.loader"+num+"_mc"));
}

function loadImages(data,num) {
	if (i==undefined || i == 2) {
		i=2;
		createLoader(i,data,num);
		i=1;
	} else if (i==1) {
		createLoader(i,data,num);
		i=2;
	}
}
function createLoader(i,data,num) {
	thisLoader=eval("container_mc.loader"+i+"_mc");
	thisLoader._alpha=0;
	thisLoader.loadMovie(data[num].path);
	watcher_mc.onEnterFrame=function () {
		var picLoaded = thisLoader.getBytesLoaded();
		var picBytes = thisLoader.getBytesTotal();
		if (isNaN(picBytes) || picBytes < 4) {
			return;
		}
		if (picLoaded / picBytes >= 1) {
			swapPlace("container_mc.loader2_mc",1);
			alphaTween = new mx.transitions.Tween(thisLoader, "_alpha", mx.transitions.easing.Regular.easeOut,0,100,_global.fadetime,true);
			timerInterval = setInterval(imageGen,_global.numPause,data);
			delete this.onEnterFrame;
		}
	}
}
function imageGen(data) {
	// random, or sequential?
	if (_global.order=="random") {
		// choose random # between 0 and total number of images
		while (randomNum == randomNumLast) {
			randomNum = Math.floor(Math.random() * data.length);
			trace(randomNum);
		}
		loadImages(data,randomNum);
		randomNumLast = randomNum;
	} else if (_global.order=="sequential") {
		// start at 0, increment to total number of images, then drop back to zero when done
		if (p==undefined || p==data.length && _global.looping=="yes") { p=0; } else { break; }
		loadImages(data,p);
		p++;
	} else {
		trace ("order attribute in xml isn't correct - must specify either 'random' or 'sequential'");
	}
	clearInterval(timerInterval);
}
stop();
Medlem sedan maj 2005704 inlägg
#2

Då du skapar med flash som ett grafikverktyg så använder du dig av lager, men med innehåll skapat av kod så är det djup som gäller.
Om du använder tex createEmptyMovieClip eller duplicateMovieClip så kommer de normalt hamna över allt annat innehåll.

Så det kan vara lite bökigt att kombinera manuellt och kodat inehåll.
Du skulle kunna göra "container_mc" och de andra clips som skapas med kod nu för hand istället, men då koden använder swapDepth så är det inte en smidig lösning.

Förmodligen får du använda duplicateMovieClip för att flytta upp det innehåll som skall vara på ett högre djup.
Tex göra det som skall ligga på lager5 till ett mc och sedan använda duplicateMovieClip...tex:
lager5.duplicateMovieClip("lager5Kopia", 5);
lager5._visible=false;

Medlem sedan okt. 2002257 inlägg
#3

ok...

Har testat lite med duplicateMovieClip men får inte till det. Vart ska det ligga? i samma actionscript som det andra eller på önskat lagers script?

Och hur anges dupet? Ligger högsta värdet överst eller unders?

Medlem sedan maj 2005704 inlägg
#4

Det skall ligga på samma keyframe som inhehållet skall visas på. Lager spelar ingen roll...normalt håller jag all frame kod på ett dedikerat kod lager.
Är du säker på att du döpt clippet korrekt?

Och högre värde på djupet=överst.

Medlem sedan okt. 2002257 inlägg
#5

Med "lager5.duplicateMovieClip("lager5Kopia", 5);" menar du då namnet på lagret eller namnet på "objektet" som jag gjort om till MovieClip? För det är väl "Instance Name" som är själva namnet på objektet?

Detta var knepigt :OO

Medlem sedan maj 2005704 inlägg
#6

Det var lite förvirrande exempel på namn kanske, my bad.

Jag menade att du gör ett mc av det som skall hamna över det slideshow koden genererar och döpa det till tex "lager5" som instance name.

Lager existerar inte i actionscript och går inte att särskilja eller referera till på något sätt.

Medlem sedan okt. 2002257 inlägg
#7

Till slut så fick jag till det.
Tack för all hjälp! :)

266 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
126 ms — deklarationer (db)
0 ms — hämta statistik (cache)
136 ms — hämta tråd, inlägg och bilagor (db)
127 ms — ändringar (db)