Avatar billede maqhem Nybegynder
30. november 2006 - 16:40 Der 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?

Nicolaj
Avatar billede rohaje Nybegynder
30. november 2006 - 16:43 #1
// 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");
Avatar billede rohaje Nybegynder
30. november 2006 - 17:13 #2
undskyld,, havde lige misforstået det helt og aldeles :D
Avatar billede mat Nybegynder
30. november 2006 - 17:30 #3
Såvidt jeg kan se er call bare en substitut for (), altså den gør det samme som et almindeligt funktionskald, bare med en "scope parameter" for this?

jvf; http://www.adobe.com/support/flash/action_scripts/actionscript_dictionary/actionscript_dictionary370.html

Mener du at du vil kalde funktioner i en frame der endnu ikke er initieret? Umiddelbart synes jeg det lyder som en lidt sær konstruktion?

mvh mat
Avatar billede maqhem Nybegynder
30. november 2006 - 18:20 #4
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.

Kan jeg finde ud af dette?
Avatar billede rohaje Nybegynder
30. november 2006 - 22:10 #5
Det kan du ikke..
vil du ud med hvad du ville bruge det til?
Avatar billede maqhem Nybegynder
01. december 2006 - 05:20 #6
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.
Avatar billede rohaje Nybegynder
01. december 2006 - 15:18 #7
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 :)
Avatar billede maqhem Nybegynder
01. december 2006 - 16:29 #8
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.

Takker.
Avatar billede maqhem Nybegynder
02. december 2006 - 14:58 #9
Hér er, hvad jeg kom frem til:

//--
knap.onRollOver = function() {this.useHandCursor = false};
knap.onPress = togglePause;
function stopAll():Void {
    if(!frames && !objects) {
        frames = new Object();
        objects = new Array();
    }
    for(var i:String in (arguments[0] ? arguments[0] : _root)) {
        if(typeof((arguments[0] ? arguments[0] : _root)[i]) == "movieclip") {
            objects.push((arguments[0] ? arguments[0] : _root)[i]);
            frames[(arguments[0] ? arguments[0] : _root)[i]] = new Object();
            frames[(arguments[0] ? arguments[0] : _root)[i]].f = (arguments[0] ? arguments[0] : _root)[i]._currentframe;
            stopAll((arguments[0] ? arguments[0] : _root)[i]);
        }
    }
    onEnterFrame = function() {
        delete onEnterFrame;
        repeat(arguments[0] ? arguments[0] : _root);
        function repeat():Void {
            for(var i:String in arguments[0]) {
                if(typeof(arguments[0][i]) == "movieclip") {
                    frames[arguments[0][i]].s = frames[arguments[0][i]].f == arguments[0][i]._currentframe ? false : true;
                    arguments[0][i].gotoAndStop(frames[arguments[0][i]].f);
                    repeat(arguments[0][i]);
                }
            }
        }
    }
}
function startAll():Void {
    if(frames && objects) {
        for(var i:String in objects) {
            if(frames[objects[i]].s) {
                objects[i].play();
            }
        }
        delete frames
        delete objects;
    }
}
function togglePause():Void {
    if(frames && objects) {
        startAll();
    } else {
        stopAll();
    }
}
//--

Det kan jo nok laves nemmere, men så fik jeg det i det mindste lavet selv også :)
Jeg fik idéen ud fra dit script, rohaje.
Avatar billede maqhem Nybegynder
02. december 2006 - 14:59 #10
Hvorfor er mit så meget større end rohajes? :(

Jeg må have lavet alt for meget kode.
Avatar billede mat Nybegynder
02. december 2006 - 17:54 #11
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?

mvh mat
Avatar billede maqhem Nybegynder
02. december 2006 - 20:49 #12
Hvis du snakker om stopAll og startAll, så er det fordi, jeg ikke ved hvordan jeg skal fasttype _root.
Avatar billede mat Nybegynder
02. december 2006 - 21:36 #13
Jeg mener at du eksempelvis definerer repeat som;

function repeat():Void {
...
}

og kalder den rekursivt med;

repeat(arguments[0][i]);

dvs du sender en parameter med til repeat, men i din definition siger du at den ingen parametre tager?

Og du definerer repeat i onEnterFrame? (jeg er ikke en stor fan af funktionsdefinitioner i funktioner) :)

_root er af typen movieclip (såvidt jeg ved);

trace(typeof(_root));

mvh mat
Avatar billede maqhem Nybegynder
02. december 2006 - 22:00 #14
Hvordan vil du ellers ordne det uden onEnterFrame?
Avatar billede mat Nybegynder
02. december 2006 - 22:14 #15
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?
Avatar billede maqhem Nybegynder
02. december 2006 - 22:16 #16
Måske ikke...
Avatar billede rohaje Nybegynder
02. december 2006 - 22:17 #17
mat mener bare at du ikke behøver definere repeat inden i onEnterFrame
Avatar billede rohaje Nybegynder
02. december 2006 - 22:17 #18
hov,, jeg var vildt bagud, havde ikke opdatret siden :D
Avatar billede maqhem Nybegynder
02. december 2006 - 22:26 #19
Ja, så meget fik jeg med :)
Avatar billede rohaje Nybegynder
03. december 2006 - 02:08 #20
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;
}
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester