Avatar billede altschuler Nybegynder
12. marts 2005 - 11:16 Der er 30 kommentarer og
1 løsning

Slette et movieclip med actionscript?

Jeg har brug for at slette et mc når det "løber ud af skærmen".

Jeg har lavet det sådan at der bliver genereret et nyt mc i en onEnterFrame og så kører movieclippet selv derudaf med en kode den har "i sig selv".

Men når movieclippet kører ud af skærmen skal det meget gerne bliver slettet, for ellers kommer det til at kører meget skidt i længden.

mit script ser sådan her ud indtil nu:

_root.createEmptyMovieClip("obControl", 0);
var ypos:Number = 100;
var counter:Number = 0;
var ranGen:Number = 0;
var oldY:Number;
var points:Number = 0;
obControl.onEnterFrame = function() {
    points += 1;
    pointsTxt.text = points;
    counter += 1;
    if (counter == 1) {
        counter = 0;
        ranGen = Math.floor(Math.random()*2);
        oldY = ypos;
        attachMovie("dot", "dotNew", _root.getNextHighestDepth(), {_x:705, _y:ypos});
        if (ranGen == 0) {
            if (ypos<5) {
                ypos = oldY+5;
            } else {
                ypos = oldY-5;
            }
        } else if (ranGen == 1) {
            if (ypos>195) {
                ypos = oldY-5;
            } else {
                ypos = oldY+5;
            }
        }
    } else {
        //nothing
    }
};
stop();


Og et eksempel kan ses her www.altschuler.dk/simon/eksperten/dots.swf

Håber der er nogen der kan give et hint ;)

pft
Avatar billede barklund Nybegynder
12. marts 2005 - 12:29 #1
Det er et lidt omstændigt script for så lidt. Og derudover er det jo din dot, der selv skal fjerne sig . og derfor er det dennes script, som vi gerne vil se,
Avatar billede altschuler Nybegynder
12. marts 2005 - 12:35 #2
Sådan 100 points ;) og her er scriptet for min dot (meget enkelt):

dot.onEnterFrame = function() {
    this._x -= 3;
};

Men det skal lige siges, at de mc der bliver lavet er et mc som jeg kalder dotMover, og som så har et andet mc i sig der hedder dot.
Avatar billede altschuler Nybegynder
12. marts 2005 - 12:38 #3
Nåå, nu fatter jeg hvad du mener med "omstændigt script for så lidt"... troede det var points lol :P

Men altså, jeg kan ikke lige se andre måder at gøre det på.
Avatar billede barklund Nybegynder
12. marts 2005 - 12:42 #4
Altså, du laver jo kun et nyt movieclip, hvis counter er 1 - og det er den kun 1 gang? Så i virkeligheden venter du bare 1 frame med at lave et movieclip og laver derudover ikke andet.

Og for at vi kan få din prik til at fjerne sig, så tester vi da bare, om den har flyttet sig ud af skærmen:

dot.onEnterFrame = function() {
    this._x -= 3;
    if (this._x < this._width/2) this.removeMovieClip();
};

Så er den væk igen :)
Avatar billede barklund Nybegynder
12. marts 2005 - 12:44 #5
Hm, du nulstiller også counter hver gang - så i virkeligheden bliver du ved med at lave en prik? Hvad gør counter så?

Prøv en gang at kigge på disse shoot 'em up-spil, der er nok noget script, du kan låne:

http://actionscript.dk/bogen/shootemup/

--
Morten Barklund
Avatar billede altschuler Nybegynder
12. marts 2005 - 13:30 #6
Hmm gad godt vide hvorfor jeg har sat den der counter på... o_O

Men altså det virker ikke endnu. Nu ser scriptet for "dot" således ud:

dot.onEnterFrame = function() {
    this._x -= 3;
    if (this._x < this._width/2) {
    this.removeMovieClip();
    }
};

Hvilket ikke virker, har prøvet bare at gøre sådan her:

dot.onEnterFrame = function() {
    this._x -= 3;
    this.removeMovieClip();
};

Men der sker ikke noget alligevel ...

(Det spil der får mig bare til at glæde mig endnu mere til at jeg skal ind og hente mit eksemplar i næste uge ^__^)
Avatar billede barklund Nybegynder
12. marts 2005 - 13:58 #7
Du kan også downloade FLA-filerne til spillet - og derigennem kopiere den del af scriptet, du skal bruge.

Hm, hvor ligger det script henne - eller rettere, hvor ligger den dot henne?

Det kunne tyde på, at den lige skal swappes op en gang:


dot.onEnterFrame = function() {
    this._x -= 3;
    if (this._x < this._width/2) {
        this.swapDepths(1);
        this.removeMovieClip();
    }
};
Avatar billede altschuler Nybegynder
12. marts 2005 - 16:36 #8
Hmm det virker ikke. Det virker lidt som om der er noget galt med måden at gjerne movieclippet på. For det virker ikke engang når jeg bare opretter et movieclip og sætter det til at "forsvinde" i frame 1.
Avatar billede barklund Nybegynder
12. marts 2005 - 18:05 #9
Hm, måske der ligger noget i dybde 1 i forvejen - prøv at smide det langt væk:

dot.onEnterFrame = function() {
    this._x -= 3;
    if (this._x < this._width/2) {
        this.swapDepths(50000);
        this.removeMovieClip();
    }
};

Det plejer at gøre tricket, at swappe det op i en positiv dybde, før man kan fjerne det.
Avatar billede altschuler Nybegynder
12. marts 2005 - 18:44 #10
Utroligt, det virker stadigvæk ikke :(

Har også prøvet med _root.getNextHighestDepth();, men med samme resultat. Men som sagt tror jeg ikek det er dybden den er gal med, for jeg kan ikek engang fjerne et mc jeg bare ligger det i frame 1, og skriver "spas.removeMovieClip();" i frame 1.

Er ret lost...
Avatar billede barklund Nybegynder
12. marts 2005 - 18:58 #11
Du kan ikke fjerne et movieclip med removeMovieClip, hvis du manuelt har placeret det på scenen - kun hvis du swapper det op til en positiv dybde først. MovieClips manuelt placeret ligger nemlig i dybden -16384 og opaf. Derfor skal man swappe først.

Men jeg forstår ikke, hvilket movieclip det er, du vil fjerne - altså du kopierer en dot ud på scenen, og den indeholder igen et movieclip der hedder dot? Du kan jo bare fjerne det movieclip, som du duplikerer ud.
Avatar billede altschuler Nybegynder
12. marts 2005 - 19:06 #12
ALtså jeg kopierer et (mange) movieclip ud på scenen som hedder dotMover, og i det ligger dot. Så vil jeg fjerne dotMover...
Avatar billede altschuler Nybegynder
12. marts 2005 - 19:06 #13
Og nu har jeg lige fået det til at virke.. skrev:

dot.onEnterFrame = function() {
    this._x -= 3;
    if (this._x<this._width/2) {
        this._parent.swapDepths(50000);
        this._parent.removeMovieClip();
    }
};

Smid et svar så får du points
Avatar billede barklund Nybegynder
13. marts 2005 - 14:23 #14
Hm, hvorfor to movieclips i hinanden? Et enkelt yderst havde været rigeligt.
Avatar billede altschuler Nybegynder
13. marts 2005 - 15:52 #15
Jamen kan jeg det? Det ene er jo bare selve prikken og det andet flytter den. Så skal jeg flytte prikken fra hovedtidslinien, odder?
Avatar billede barklund Nybegynder
13. marts 2005 - 15:56 #16
Du kan da bare give den en onEnterFrame i det du duplikerer den:

function flytPrik() {
    this._x -= 3;
    if (this._x<this._width/2) {
        this.removeMovieClip();
    }
};
...
    var d = _root.getNextHighestDepth();
    var m = attachMovie("dot", "dot_"+d, d, {_x:705, _y:ypos});
    m.onEnterFrame = flytPrik;
...

See? ;)

--
Morten Barklund
Avatar billede altschuler Nybegynder
13. marts 2005 - 16:46 #17
Smart :D, men har kun et problem med at slette dem nu, hmm. Det burde ellers virke, scriptet ser sådan her ud(har ændret det til "Red" på det hele fordi jeg både har en række af sorte og røde prikker nu):

function flytPrik() {
    this._x -= 3;
    if (this._x<0) {
        this.removeMovieClip();
    }
};
_root.createEmptyMovieClip("obControlRed", 5000);
var yposRed:Number = 150;
var ranGenRed:Number = 0;
var oldYRed:Number = 0;
var pointsRed:Number = 0;
obControlRed.onEnterFrame = function() {
    pointsRed += 1;
    pointsTxtRed.text = pointsRed;
    ranGenRed = Math.floor(Math.random()*2);
    oldYRed = yposRed;
    var d = _root.getNextHighestDepth();
    var m = attachMovie("dotRed", "dotRed_"+d, d, {_x:705, _y:yposRed});
        m.onEnterFrame = flytPrik;
    if (ranGenRed == 0) {
        if (yposRed<5) {
            yposRed = oldYRed+5;
        } else {
            yposRed = oldYRed-5;
        }
    } else if (ranGenRed == 1) {
        if (yposRed>195) {
            yposRed = oldYRed-5;
        } else {
            yposRed = oldYRed+5;
        }
    }
};
stop();
Avatar billede barklund Nybegynder
13. marts 2005 - 16:48 #18
function flytPrik() {
    this._x -= 3;
    if (this._x<0) {
        trace("jeg skal slettes: "+this);
        this.removeMovieClip();
    }
};

Sker der så noget?
Avatar billede altschuler Nybegynder
13. marts 2005 - 16:50 #19
Ja det kan man vidst roligt sige :)
Avatar billede barklund Nybegynder
13. marts 2005 - 16:53 #20
Men bliver dine movieclips så slettet?
Avatar billede altschuler Nybegynder
13. marts 2005 - 16:57 #21
Nej, får kun en mega output fil, hvor alle navnene står, og de passer også, altså med at de hedder et eller andet ret stort minus tal, f.eks.:

jeg skal slettes: _level0.dot_1048630
Avatar billede altschuler Nybegynder
13. marts 2005 - 16:57 #22
Hovsa, ikke noget minus tal, bare et tal :)
Avatar billede barklund Nybegynder
13. marts 2005 - 17:04 #23
1 million? det var godt nok et stort tal :/

Prøv at bruge en almindelig tæller:

function flytPrik() {
    this._x -= 3;
    if (this._x<0) {
        this.removeMovieClip();
    }
};
_root.createEmptyMovieClip("obControlRed", 5000);
var yposRed:Number = 150;
var ranGenRed:Number = 0;
var oldYRed:Number = 0;
var pointsRed:Number = 0;
var counter:Number = 0;
obControlRed.onEnterFrame = function() {
    pointsRed += 1;
    pointsTxtRed.text = pointsRed;
    ranGenRed = Math.floor(Math.random()*2);
    oldYRed = yposRed;
    var d:Number = ++counter;
    var m:MovieClip = attachMovie("dotRed", "dotRed_"+d, d, {_x:705, _y:yposRed});
    m.onEnterFrame = flytPrik;
    if (ranGenRed == 0) {
        if (yposRed<5) {
            yposRed = oldYRed+5;
        } else {
            yposRed = oldYRed-5;
        }
    } else if (ranGenRed == 1) {
        if (yposRed>195) {
            yposRed = oldYRed-5;
        } else {
            yposRed = oldYRed+5;
        }
    }
};
stop();
Avatar billede altschuler Nybegynder
13. marts 2005 - 17:13 #24
Smukt, så virker det :D

Tak for hjælpen, og smid et svar :)
Avatar billede barklund Nybegynder
13. marts 2005 - 17:31 #25
Tror det var din getNextHighestDepth, der gav problemer - da du åbenbart havde et movieclip helt oppe i millionerne. Deroppefra er det ikke til at slette noget igen.
Avatar billede barklund Nybegynder
13. marts 2005 - 17:31 #26
Og et svar :)
Avatar billede altschuler Nybegynder
13. marts 2005 - 17:38 #27
Troede ikke engang det var muligt at komme så højt op. Men så ved man da det :)
Avatar billede barklund Nybegynder
13. marts 2005 - 17:40 #28
Mjo, men det er en øvre grænse et eller andet sted deroppe omkring, hvorefter man ikke an unloade movieclips længere...
Avatar billede barklund Nybegynder
13. marts 2005 - 17:41 #29
Som vist nok er 2^20 = 1048576 - hvilket umiddelbart tyder på, at det var derfra, dine movieclips startede :)
Avatar billede barklund Nybegynder
13. marts 2005 - 17:41 #30
Og tark for points ;)
Avatar billede altschuler Nybegynder
13. marts 2005 - 18:16 #31
Selv tak ^__^
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

IT-JOB

Politiets Efterretningstjeneste

GenAI Specialist i PET

Netcompany A/S

Network Engineer

Riskpoint A/S (Riskpoint Solutions Limited)

IT Business Analyst