30. november 2006 - 16:40Der er
19 kommentarer og 1 løsning
Læse actionscript
Jeg har haft læst en lille smule om call(); Så vidt min forståelse fortæller mig, kalder denne en kode fra en anden frame i timelinen, men denne blev overflødig, da man kunn lave sine egne funktioner.
Jeg tænkte på, om man måske kunne bruge denne til at læse et actionscript i en anden frame på timelinen, eller endnu bedre i et mc. Jeg tvivler på, call() er rigtig, men kan det overhovedet lade sig gøre? Hvis ja, hvordan?
// et lille test mc var test_mc:MovieClip = createEmptyMovieClip("test_mc", 0); function test(_str:String):Void { trace(_str+" : "+this); } //læg functionen på movieClippet test_mc.test = test; // test om det virker test_mc.test("her på movieClippet"); // til sammenligning function kaldt herfra test("her fra tidslinien");
Jeg mener, om jeg eventuelt kan læse, om en stop(); indgår i den pågældende frame i et mc, som måske er nået til frame 22. Tallet er ligegyldigt, men det er ikke ligegyldigt, om der er en stop(); derpå eller ej.
For udfordringens skyld ville jeg kort lave en form for pause på timelinen samt alle mcs, og starte dem igen efter lidt tid - men kun, hvis de ikke står på en frame med stop();
Jeg finder en anden løsning :) Dump en svar og scor dine point.
function pauseAll(scope) { if (scope.replay_object != undefined) { trace("play"); for (var r in replay_object) { replay_object[r].play(); } delete scope.replay_object; } else { trace("stop"); var playing_object = new Object(); for (var i in scope) { if (typeof (scope[i]) == "movieclip") { playing_object[i] = new Object(); playing_object[i].frame = scope[i]._currentframe; } } onEnterFrame = function () { delete onEnterFrame; scope.replay_object = new Object(); for (var z in playing_object) { if (scope[z]._currentframe != playing_object[z].frame) { replay_object[z] = scope[z]; scope[z].stop(); } } }; } } test_bt.onRelease = function() { pauseAll(_root); };
// lidt noget rod,, men du kan jo ryde op i det hvis du vil,, og måske lave den så den kalder sig selv i hvert movieClip,, ned i strukturen :)
Ja, okay. Du gør vel det, at du gemmer alle frames, og springer en frame frem, og tjekker alle igen - hvis framen er den samme, står den på en stop();
Det havde jeg selv overvejet også, men kom frem til et hul i tanken: Hvad nu, hvis frame nummer 7 er tom, men i 8 står der stop();, og _currentframe er 7? Så springer den over :) Det duer jo ikke, men jeg har fået en anden idé ud fra dit script. Jeg takker for tiden, du brugte på det, og laver et script der minder om dit.
Af ren nysgerrighed; Er der nogen bestemt årsag til at du definerer en funktion som tagende ingen parametre, men så bare sender nogle med alligevel, og refererer til arguments objektet? Og du har en funktionsdefinition i en onEnterFrame?
Det ved jeg ikke, jeg har ikke sat mig ind i pågældende problem.
Jeg så bare din kode og synes det så lidt sært ud :) - men umiddelbart kan jeg ikke forestille mig at det ville ændre noget væsentligt at flytte funktionsdefinitionen ud af onEnterFrame?
man kunne lige checke for onEnterFrame loops, nu man er i gang :)
knap.onRelease = function() { pauseAll(_root); }; function pauseAll(targ_mc:MovieClip):Void { if (targ_mc.replay_array) { restartAll(targ_mc); } else { targ_mc.replay_array = new Array(); var pauseCheck_array:Array = new Array(); checkPlaying(targ_mc, pauseCheck_array); var p_leng:Number = pauseCheck_array.length; var is_playing_checker:MovieClip = targ_mc.createEmptyMovieClip("is_playing_checker", targ_mc.getNextHighestDepth()); is_playing_checker.onEnterFrame = function() { delete is_playing_checker.onEnterFrame; for (var m = 0; m<p_leng; m++) { var replay_object:Object = new Object(); if (pauseCheck_array[m]._mc._currentframe != pauseCheck_array[m].frame) { pauseCheck_array[m]._mc.gotoAndStop(pauseCheck_array[m].frame); replay_object.replay = true; } if (pauseCheck_array[m]._mc.onEnterFrame) { replay_object.enterframe = pauseCheck_array[m]._mc.onEnterFrame; delete pauseCheck_array[m]._mc.onEnterFrame; } if (replay_object.replay || replay_object.enterframe) { replay_object._mc = pauseCheck_array[m]._mc; targ_mc.replay_array.push(replay_object); } } removeMovieClip(this); }; } } function checkPlaying(_mc:MovieClip, _array:Array):Void { if (typeof (_mc) == "movieclip") { _array.push({_mc:_mc, frame:_mc._currentframe}); for (var m in _mc) { checkPlaying(_mc[m], _array); } } } function restartAll(targ_mc:MovieClip):Void { var r_leng:Number = targ_mc.replay_array.length; for (var r = 0; r<r_leng; r++) { if(targ_mc.replay_array[r].replay){ targ_mc.replay_array[r]._mc.play(); } if(targ_mc.replay_array[r].enterframe){ targ_mc.replay_array[r]._mc.onEnterFrame=targ_mc.replay_array[r].enterframe; }
} delete targ_mc.replay_array; }
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.