Just nu i M3-nätverket
Gå till innehåll

Tips. Hur lägga upp en lång presentation (movieclips eller?)...


bbque:aren

Rekommendera Poster

Hej alla duktiga Flashare,

 

Sitter och försöker knåpa ihop en Flash-presentation.

 

Vilket är det smartaste sättet att lägga upp den. Den kommer att köras på en av oss bestämd dator (alltså inte över webben). Så det gör ingenting i sig att filvikten blir stor.

 

Presentationen kommer att bli kanske 5-6 minuter.

 

Jag tänkte göra en grundmall som rullar på i en stor scen. Sedan tänkte jag läsa in animationer i denna (in och ut nya allt eftersom presentationen rullar på). Jag har börjat lite grann men stötte på problem. Animationen som jag läser in har jag lagt i ett MC (movieclip). Den dyker upp på rätt ställe i huvudfilmen, men hur går jag vidare sedan för att fortsätta spela den vanliga filmen? Jag vill helst inte lägga in massa tomma rutor i huvudfilmen bara för att täcka längden på MC:t (om ni förstår?). Tänkte att jag kunde pausa huvudfilmen och sedan läsa in MC:t, låta den animationen köra en gång och sedan fortsätta huvudfilmen.

 

Hade det varit smartare att göra på nåt annat sätt?

 

Tack på förhand!

 

//mvh Björn

 

Länk till kommentar
Dela på andra webbplatser

Om du i huvudfilmen i en keyframe där MCt laddas in lägger in

stop();

så stannar filmen. Lägger du sedan till

_root.play();

i sista framen inne i MCt så startar den igen när mct har kommit till sitt slut.

 

Länk till kommentar
Dela på andra webbplatser

Tusen tack för hjälpen. En poäng på väg...

 

En fundering till dock. Försökte lägga _root.play() lite tidigare än i sista rutan av MC:t. Tanken var att försöka få huvudfilmen att sättas i gång lite tidigare än i sista rutan. Så det blev lite överlapp!

 

Men det gick ju inte. Går det att lösa? Annars, finns det något smidigare/bättre sätt att ladda in grejer? LoadMovie eller nåt...

 

Tack igen!

 

//mvh Björn

 

Länk till kommentar
Dela på andra webbplatser

Man skulle också kunna göra det lite bökigare för sig och skapa en funktion som pausar ett valt mc i ett visst antal frames:

 

function pausemc(targ, frames){
       targ.stop();
i = 1;
ref = createEmptyMovieClip(targ+"pauser",getNextHighestDepth());
ref.onEnterFrame = function(){
	if(i >= frames-1){
		targ.play();
		removeMovieClip(this);
	}else{
		i+=1;
	}
}
}

 

Den skulle du i ditt fall använda så här:

 

pausemc(_root, laddadmc._totalframes);

Där laddadmc är instansnamnet på movieclippet som ska spelas medan rooten är pausad

 

 

[inlägget ändrat 2005-10-07 11:10:55 av Cechise]

Länk till kommentar
Dela på andra webbplatser

Hej igen,

 

Det här blev lite komplicerat för mig. Kan du utveckla det lite tror du? Du skriver i inledningen "...skapa en funktion som pausar ett valt mc i ett visst antal frames". Vad tjänar jag på det?

 

//mvh Björn

 

Länk till kommentar
Dela på andra webbplatser

nä alltså du tjänar väl kanske inte så mycket på det :) det var bara ett alternativ till första lösningen som gör samma sak.

 

Fördelen med den här är att du intte behöver in i movieclippet och rota och det kan vara lättare om du har en massa olika movieclipp du ska kontrollera. Den är ju också lite mer flexibel i att du godtyckligt kan pausa vilket movieclip som helst i ett visst antal frames direkt från AS...

 

Egentligen var jag nog bara sugen på att göra en funktion :)

 

 

 

[inlägget ändrat 2005-10-07 11:22:53 av Cechise]

Länk till kommentar
Dela på andra webbplatser

Okej:..:-)

 

Jag förstår. Men finns det något sätt så att jag kan få huvudfilmen att börja rulla lite innan animationen är färdig? Animationen är ju ett movieclip nu men den går ju att konvertera till något annat om det behövs...

 

//mvh Björn

 

Länk till kommentar
Dela på andra webbplatser

Det borde funka som du hade skrivit här ovan. Vad var det som inte fungerade då egentligen? (alltså när du flyttade fram _root.play() ett par frames från slutet på mc:t)

 

Länk till kommentar
Dela på andra webbplatser

Hallå igen,

 

Börjar bli en riktig följetong...

 

Jo, sätter jag _root.play() tidigare än i sista rutan på movieclip:et så stoppar Mc:t där och hoppar till huvudfilmen. Den slutar alltså tvärt där...

 

?

 

Hm. Jag laddar inte in MC:t. Det ligger på en frame i huvudfilmen. Är det det som är problemet kanske. Den ska kanske anropas utan att läggas in? Typ att man väljer load.movie eller nåt?

 

//mvh Björn

 

[inlägget ändrat 2005-10-07 11:42:59 av bbque:aren]

Länk till kommentar
Dela på andra webbplatser

Aha ok. Ja då är vi ju tillbaka till samma dilemma som förut. För att resten av mc ska synas när du börjar spela _rooten igen så måste du ha mc:t utdraget i huvudfilens timeline i så många frames som finns kvar i mc:t när du skickar play() till rooten.

 

Om du hajar :)

 

Alltså exempelvis:

klippet kommer fram på frame 20 i rooten och finns bara på den keyframen. Rooten pausas alltså på frame 20. Inne i klippet spelas det och när klippet som är 30 frames långt kommer till frame 25 skickas _root.play(). Då hoppar rooten till frame 21 och klippet syns inte mer. Då skulle alltså klippet måste ligga på 20-25 för att allt skulle synas.

 

 

 

 

För att lösa det här skulle man kunna göra så att man istället för att lägga klippet direkt på tidslinjen laddar in det till rooten med attachMovie och sedan tar bort det när det har spelat klart. För att göra dett skulle man kunna modifiera funktionen litegrann och med hjälp av den ladda in och ta bort movieclip.

 

 

Så här kan man skriva(notera att jag bytte namn på funktionen):

function loadnpause(targ, libtarg, targstart){
targ.stop();	
i = 1;
ref = targ.attachMovie(libtarg, libtarg + "_mc", getNextHighestDepth());
ref.onEnterFrame = function(){
	if(i >= this._totalframes-targstart){
		this._parent.play();
	}else{
		i+=1;
	}
	if(this._totalframes == this._currentframe){
		removeMovieClip(this);
	}
}
}

 

loadnpause(targ, libtarg, targstart);

targdet objekt som ska pausas och där mc:t fästs

libtargLinkagenamnet på movieclippet som ska laddas från biblioteket

rootstartAntalet frames från slutet på mc:t som targ-klippet ska startas

 

 

Detta skulle du alltså kunna använda istället. Ge de movieclip du vill ha med ett linkage namn i biblioteket. Och sedan använder du bara funktionen på den keyframe i huvudtidslinjen du vill ha in dom. Alltså om jag vill ha in klippet "röd" på en viss frame i huvudtidslinjen skriver jag så här på den framen:

loadnpause(_root, "röd", 10);

Då kommer _root att pausas, "röd" laddas in och spelas och när röd är 10 frames från sitt slut så startar _root igen...

 

och "röd" finns då naturligtvis kvar tills det har spelat färdigt. Då det försvinner.

 

 

[inlägget ändrat 2005-10-07 12:01:13 av Cechise]

Länk till kommentar
Dela på andra webbplatser

Det låter ju kanon detta.

 

Fick inte ordning på det först, men nu börjar det likna något. Några funderingar & problem:

 

- hur bestämmer jag placering av mitt MC i koordinater?

- kan jag skala ner mitt MC innefrån funktionen? Den är nämligen för stor i MC:t. Skulle behövas skalas ner innan den läggs på huvudtidslinjen...

- Var är det meningen att jag ska lägga själva funktionen? Nu ligger den i samma frame som jag anropar funktionen?

- kan jag ändra i vilket lager som MC:t hamnar? Skulle vilja att den ligger över vissa lager men under vissa?

 

//mvh Björn

 

[inlägget ändrat 2005-10-07 12:21:13 av bbque:aren]

[inlägget ändrat 2005-10-07 12:39:43 av bbque:aren]

[inlägget ändrat 2005-10-07 12:57:54 av bbque:aren]

Länk till kommentar
Dela på andra webbplatser

Visst

 

Funktionen deklarerar du i första framen på huvudtidslinjen. Alltså koden läggs där .Det är fö god flashsed (tycker iaf jag) att skapa ett speciellt lager där man inte har några objekt utan bara sitt AS.

Sedan anropar du funktionen från andra delar av din flash med hjälp av loadnpause([targ],[libtarg],[rootstart]);

 

- Vad ska jag ändra på i texten för funktionen?

I själva funktionen behöver du inte ändra något. Det enda du behöver ändrä är parametrarna du skickar med när du anropar funktionen. dvs targ, libtarg och rootstart. Förklaringen till vad dom är för nåt såg du ovan.

 

- Ska det vara "" runt _mc i funktionen?

Ja. Det andra argumentet i attachMovie funktionen är "newName" alltså det nya instansnamnet för movieclippet som attachas. Jag valde här att skapa det namnet genom att ta linkagenamnet(libtarg) och lägga på"_mc" på slutet. Ett movieclip som har linkage namnet "intro" i biblioteket kommer alltså heta "intro_mc" när det används på scenen.

 

- Vad menas med "this"?

This är en referens till sig själv. I det här fallet används det vid ett par tillfällen på det attachade movieclippet. Jag kan försöka förklara hela förloppet i funktionen. Tänk att vi kallar på den genom den här raden:

 

loadnpause(_root, "intro", 10);

 

Funktionen börjar med att ta emot det du skickar med (targ, libtarg, targstart). Först stoppar den targ (i det här fallet _root, eftersom det är den du ska pausa). Sedan attachar den movieclippet libtarg (intro) till targ(_root) och sparar en referens till det skapade objektet i variabeln "ref". Det ligger nu alltså ett nytt movieclip skapat från libtarg(intro) på targ(_root).

Med hjälp av referensen som sparats i ref tilldelas det nya movieclippet en onEnterFrame funktion. Den utför alltså det som står i den funktionen varje frame (dvs har du tex 12 fps gör den det 12ggr i sekunden). Det den gör är att den, varje frame, kollar ifall klippet har kommit så långt att det totala antalet frames i klippet - targstart(10 här. Antalet frames kvar när targ(_root) ska startas) är lika med eller mindre än den framen den är på. Ifall det är så startar den targ(_root) genom att kalla på this._parent.play();.

Där "this" referear tills sig själv(alltså movieclippet intro_mc) och _parent till dess "förälder" movieclippet det ligger i/är attachat till. I det här fallet är det _root alltså börjar _root spelas.

Den andra ifsatsen kollar ifall movieclippet själv har spelat färdigt och ifall det plockar den bort sig själv från scenen med removeMovieClip(this);

 

Väldigt lång förklaring men ja hoppas det hjälper lite :)

 

 

 

Edit:

Upptäckte förrensten när jag höll på att förklara som bäst att variablen i inte behövs över huvudtaget, kvarleva från förra funktionen. Här kommer en revision :)

 

function loadnpause(targ, libtarg, targstart){
targ.stop();	
ref = targ.attachMovie(libtarg, libtarg + "_mc", getNextHighestDepth());
ref.onEnterFrame = function(){
	if(this._currentframe >= this._totalframes-targstart){
		this._parent.play();
	}
	if(this._totalframes == this._currentframe){
		removeMovieClip(this);
	}
}
}

 

 

Möjligt att radbrytningarna blir konstiga när du copy-pastar.

 ref = targ.attachMovie(libtarg, libtarg + "_mc", getNextHighestDepth());

Ska i varje fall vara på en rad.

 

[inlägget ändrat 2005-10-07 13:10:56 av Cechise]

Länk till kommentar
Dela på andra webbplatser

Det börjar ju bli ordning nu.

 

 

Har fått ordning på frågorna i föregående inlägg förutom:

 

- Hur bestämmer jag i vilket lager den ska hamna?

 

Tack så jättemycket för hjälpen så här långt!

 

//mvh Björne

 

[inlägget ändrat 2005-10-07 13:32:43 av bbque:aren]

Länk till kommentar
Dela på andra webbplatser

Det här med lager är lite speciellt. Man brukar använda depth för att få objekt att hamna på olika djup i scenen. Detta kan man i actionscript sätt numeriskt och det sker automatiskt när du lägger in objekt i en scen med manuellt.

 

Just i det här fallet som vi håller på med tilldelas det nya klippet som attachas det "nästa högsta djupet" (getNextHighestDepth) mao det lägger sig överst.

 

Det står en del i flashhjälpen om djup och liknande. Även här kan du läsa:

http://www.kirupa.com/developer/actionscript/depths.htm

 

Länk till kommentar
Dela på andra webbplatser

hej,

 

jag hittade någonstans att man kunde välja:

 

myMovieClip.swapDepths(depth)

myMovieClip.swapDepths(target)

 

för att på så vis byta så att huvudtidslinjen hamnar över det inhämtade movieclipet, det kunde vara användbart för mig...

 

vet du hur man gör i mitt fall?

 

//mvh Björne

 

Länk till kommentar
Dela på andra webbplatser

Objekten i huvudtislinjen har alla individuella djup så du måste flytta objektet bakom alla dessa. Kanske är lite ful-varning på det här men här kommer det ändå :)

 

Depth values for movie clips can range from -16384 to 1048575.

 

Alltså borde du bara kunna sätta djupet till -16384 på klippet så kan ju inget lägga sig under det. Då hamnar det allra längst bak.

Det gör du genom att ersätta getNextHighestDepth() med -16384. Notera att ifall du gör så kommer du förlora förmågan att ladda in flera klipp samtidigt med funktionen eftersom de då ersätter varran när dom har samma djup.

 

 

Ett annat sätt som kanske är enklare och smidigare är att du skapar en så kallad container. Du skapar ett tomt movieclip (eller ett movieclip med en osynlig ruta eller nåt i ifall du vill ha det en specifik storlek) som du placerar ut på scenen där du vill ha den (längst bak). Sedan ändrar du i funktionen så att klippen attachas dit istället för till targ(_root).

 

Jag rekommenderar det senare alternativet. Det är snyggare och ger betydligt bättre kontroll.

Funktionen måste dock ändras så den ser ut så här:

 

function loadnpause(targ, libtarg, targstart) {
targ.stop();
ref = container_mc.attachMovie(libtarg, libtarg+"_mc", getNextHighestDepth());
ref.onEnterFrame = function() {
	if (this._currentframe>=this._totalframes-targstart) {
		targ.play();
	}
	if (this._totalframes == this._currentframe) {
		removeMovieClip(this);
	}
};
}

 

 

Länk till kommentar
Dela på andra webbplatser

Hej,

 

Lite fram kommer vi hela tiden, men nya frågor dyker upp. Får inte ordning på det nu.

 

Detta står i första rutan på huvudtidslinjen (i Actions-lagret):

 

function loadnpause(targ, libtarg, targstart){
targ.stop(); 
ref = mc_Container.attachMovie(libtarg, libtarg + "mc_omsattning", getNextHighestDepth());
ref._xscale = ref._yscale=75;
ref._x = 426;
ref._y = 180;
ref.onEnterFrame = function(){
if(this._currentframe >= this._totalframes-targstart){
targ.play();
}
if(this._totalframes == this._currentframe){
removeMovieClip(this);
}
}
}

 

Detta står i rutan i huvudtidslinjen där jag vill att MC:t ska börja köras (också i actionslagret):

 

loadnpause(_root, "link_omsattning", 60);
;

 

I lagret längst ner på huvudtidslinjen (döpt container) har jag lagt in min container på första rutan (den heter mc_Container). Behöver man lägga in "linkage" på denna också? Har jag inte gjort iaf...

 

Mitt MC som innehåller själva animationen heter mc_omsattning. Den har linkage-namn: link_omsattning.

 

 

förstår vad som går fel???

 

//mvh Björne

 

Länk till kommentar
Dela på andra webbplatser

förstår vad som går fel???

 

Vad är det som går fel? Syns den inte?

 

Isf kan det bero på att du har satt refs x och y. Jag antar att detta var för att få den att ligga rätt på scenen.

Nu eftersom att movieclippet attachas till mc_container blir x och y relativt till mc_containers x och y.

Nu beror det alltså lite på var registreringspunkten ligger i mc_container. Ligger den upp i vänstra hörnet kommer alltså refs x och y 0 vara samma som mc_containers x och y. Dvs om mc_container ligger på x 400 och y 500 blir det även refs position ifall dess x och y är satt till 0. Är de däremot satta till 426 och 180 som nu hamnar ref (i förhållande till scenen) på x826 y680.

Mao ifall du inte kan se ref kan det bero på att det har hamnat utanför scenen.

 

Du kan när du testar filmen trycka ctrl+L så listas alla objekt som finns just då och se om objektet har skapats.

 

 

 

[inlägget ändrat 2005-10-07 15:55:57 av Cechise]

Länk till kommentar
Dela på andra webbplatser

Hej,

 

Ska fila på placering av movieclippet, så att de kommer på samma plats i fortsättningen,

 

anledningen till att det inte funkade ( = inget mc syntes) var att jag inte hade gett containern något instansnamn!

 

Så nu behöver jag nog inte mer hjälp just nu!

 

TACKAR JÄTTEMYCKET FÖR ALL HJÄLP (skriker jag nu? iaf: stort tack)

 

Ha en trevlig helg,

 

kommer säkert mer frågor efter hand!

 

//mvh Björn

 

Länk till kommentar
Dela på andra webbplatser

anledningen till att det inte funkade ( = inget mc syntes) var att jag inte hade gett containern något instansnamn!

 

Brukar hända mig rätt ofta också :) Har nån otrevlig vana att alltid trycka ctrl+S just efter jag har skrivit in det och sen tro att det sitter där. Men när jag går direkt och testar filmen efteråt försvinner det igen. Irriterande men jag har äntligen lyckats vänja mig vid att trycka enter istället nu för tiden, vilket har snabbat upp mitt arbetsflöde otroligt. Kunde sitta skitlänge och inte fatta vad felet var :)

 

 

Lycka till :thumbsup:

 

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...