Avatar billede Slettet bruger
12. april 2007 - 13:50 Der er 35 kommentarer og
1 løsning

Er der en grænse for hvor mange MC'er man kan oprette ad gangen?

Hej eksperter!

Jeg sidder og skriver et spil, hvor spilleren styrer et fly, der så kan skyde fjender ned. Der er relativt mange partikkeleffekter: Røg efter flyet, fjenderne og missilerne man affyrer, eksplosioner og øvrige finesser. Alle effekterne indsættes med attachMovie til et ellers tomt MC i _root.
Men: Når der er mere end 2-3 missiler samt spillerens eget fly på skærmen, vil Flash tilsyneladende ikke oprette flere MC'er. Der kommer ikke flere røghaler og nogle gange "eksploderer" missilerne inden de rammer målet.
Hvorfor? Er der en grænse for hvor mange MC'er Flash kan håndtere? Jeg har talt op til omkring 100-200 ad gangen i spillet.
Avatar billede mat Nybegynder
12. april 2007 - 14:14 #1
Det er ikke fordi de oprettes i samme dybde? Der er naturligvis et maks for hvor mange movieclips du kan kaste rundt, men jeg tror umiddelbart det er bestemt ved performance, nærmere end ved antal mc's?

(100-200 movieclips er ihvertfald ikke noget loft)

mvh mat
Avatar billede larsholmgaard_dk Nybegynder
12. april 2007 - 14:20 #2
Det lyder som et skægt spil - må jeg se det? :-)
Avatar billede barklund Nybegynder
12. april 2007 - 15:06 #3
Altså, du attacher vel ikke alle samme sted? Du kan med fordel have 4-5 movieclips, der repræsenterer forskellige lag, og så igen attach'e inden i hver af disse. Det vil nok være en fordel :)
Avatar billede Slettet bruger
12. april 2007 - 15:30 #4
Jerp, Barklund, det har jeg tænkt på. Jeg har et lag til interaktive objekter, et lag til effekter, et lag til projektiler, et lag til baggrunden og et lag til interfacen.
Og nej, mat, jeg bruger forskellige variationer af denne funktion:

var TEMP:String = new String("OBJECT"+_root.OVERLAY.getNextHighestDepth());
_root.OVERLAY.attachMovie("SMOKE_10x10", TEMP, _root.OVERLAY.getNextHighestDepth());
_root.OVERLAY[TEMP]._x = _x;
_root.OVERLAY[TEMP]._y = _y;
delete TEMP;

Hvad kan problemet være?
Avatar billede Slettet bruger
12. april 2007 - 15:32 #5
Eksempelfunktionen kaldes fra MC'et der udgør spillerens fly.
Og larsholmgaard: Jeg kan da uploade en ... øh ... semibeta af spillet :)
Skal lige have fundet et site at smide det ud på.
Avatar billede larsholmgaard_dk Nybegynder
12. april 2007 - 15:39 #6
Helt fint hf2ke - det lyder spændende!
Avatar billede Slettet bruger
12. april 2007 - 15:42 #7
Mht. performance: Spillet forøger min pc's CPU-brug med 10% og hukommelse med 100 mb.
Ikke meget, da jeg har en 1,7 gHz dual core processor og 2 gb ram, samt massere plads på harddisken... Men det tager Flash måske ikke højde for?
Avatar billede Slettet bruger
12. april 2007 - 15:42 #8
:)
Avatar billede Slettet bruger
12. april 2007 - 15:53 #9
Okaj, der er helt sikkert noget galt. Jeg har tjekket det hele - jeg har ingen fejl lavet. Flash må være skyld i følgende fejl:
MC'erne bliver byttet ud. Eksplosioner opfører sig som missiler og missiler eksploderer ikke. Røg og ild forsvinder. Og alligevel: Ingen lag overhovedet.
Avatar billede barklund Nybegynder
12. april 2007 - 15:53 #10
Der er godt nok meget overflødig kode uden rigtig at gøre så meget... :)

og getNextHighestDepth() kan være farligt, med mindre du har 1000% styr på, hvad der kommer i det aktuelle movieclip.

Jeg ville have en tæller for hvert lag som wrappede ved for eksempel 100 (der er vel ikke mere end 100 symboler i samme lag på én gang?) og så ville det se ud som:

DepthManager.attachSymbol(DepthManager.OVERLAY, "SMOKE_10x10", _x, _y);

Og så kunne min DepthManager lave noget med:

class DepthManager {
public static var OVERLAY:String = "overlay";
public static var OTHERLAY:String = "otherlay";
private static var WRAPPER:Number = 100;
private static var inited:boolean = false;
private static var paths:Object;
private static var depths:Object;
private static init() {
  if (inited) return;
  inited = true;
  paths = new Object();
  paths[OVERLAY] = _root.OVERLAY;
  paths[OTHERLAY] = _root.some_other_path;
  depths = new Object();
  depths[OVERLAY] = 0;
}
public static attachSymbol(layer:String, name:String, x:Number, y:Number):MovieClip {
  init();
  depths[layer] = depths[layer] + 1 % WRAPPER;
  var c:MovieClip = paths[layer].getInstanceAtDepth(depth);
  if (c) c.removeMovieClip();
  return paths[layer].attachMovie(name, layer+"_"+depth, depth, {_x:x, _y:y});
}
}

Noget i den stil :)

Så får du nemlig ryddet alle de gamle movieclips op uanset om de måtte huske at gøre det selv eller ej.

Puha, det er sgu ikke meget AS2 jeg får lavet for tiden - det er jo helt old school :)

--
Morten Barklund
Avatar billede Slettet bruger
12. april 2007 - 16:07 #11
Så jeg laver eksempeltvis en klassefil med den kode og bruger attachSymbol() til at lave nye objekter?
Avatar billede barklund Nybegynder
12. april 2007 - 16:09 #12
ja :) og så laver du en konstant per layer du har og retter lidt i init, så den initer korrekt :)
Avatar billede Slettet bruger
12. april 2007 - 16:09 #13
Øh, hvad mener du med layer? Depth?
Avatar billede barklund Nybegynder
12. april 2007 - 16:10 #14
per movieclip-lag (overlay, background, ...)
Avatar billede Slettet bruger
12. april 2007 - 16:11 #15
Okaj, tak... Tester lige.
Avatar billede Slettet bruger
12. april 2007 - 16:15 #16
Hvad vil du med OTHERLAY?
Avatar billede Slettet bruger
12. april 2007 - 16:23 #17
Ja, undskyld, men jeg må give dig ret... Du er en lille smule rusten ;)
Du har reffereret til en variabel 'depth' et par gange. Mener du 'depths[layer]'?
Avatar billede barklund Nybegynder
12. april 2007 - 16:34 #18
nåja, der skulle være en var depth:Number = depths[layer]...

og OTHERLAY er bare et eksempel på et andet lag :)
Avatar billede Slettet bruger
12. april 2007 - 16:35 #19
Okaj :)
Kan ikke lige få dit eksempel til at virke, men hvad skal det helt præcist gære? Bare oprette nye MC i et andet givet MC og sørge for at depth holdes under 100?
Avatar billede barklund Nybegynder
12. april 2007 - 16:53 #20
For det første abstraherer det hele skidtet med at skulle holde styr på dybder og den slags væk fra de steder, hvor du "blot" skal have oprettet nye symboler.. hvis nu du 10 forskellige steder opretter symboler, så ville du jo skulle rette alle steder, hvis du ville ændre metoden det blev gjort på.

For det andet, så sørger det for at der altid max er 100 movieclips i hvert lag. Om det virker eller ej, skal jeg ikke lige kunne sige, men det er ganske ligetil, så det skulle være til at forstå ideen bag og trace sig igennem for at få til at virke :)
Avatar billede Slettet bruger
13. april 2007 - 07:51 #21
Ok, det lyder jo fornuftigt. Jeg prøver mig lige lidt frem selv så, skriver nok tilbage i eftermiddag.
Avatar billede Slettet bruger
13. april 2007 - 07:56 #22
Forresten er 100 ikke nok... Rettere 2000.
Avatar billede Slettet bruger
13. april 2007 - 08:54 #23
Ups, der er noget jeg ikke forstår. Je ghar nu lavet en funktion der ... øh ... "virker". Desværre "virker" den delvist på root!
Når jeg bruger:


class SYMBOLS {
   
    private static var MAX:Number = new Number(100);
    private static var DEPTH:Array = new Array();
   
    public static function ATTACH(_PARENT:String, _SYMBOL:String, _ARGUMENTS:Array):MovieClip {
        if (DEPTH[_PARENT]==undefined || DEPTH[_PARENT]>=MAX-1) {
            DEPTH[_PARENT] = 0;
        } else {
            DEPTH[_PARENT]++;
        }
        return _root[_PARENT].attachMovie(_SYMBOL, "SYMBOL"+DEPTH[_PARENT], DEPTH[_PARENT], _ARGUMENTS);
    }
   
}


Og:


SYMBOLS.ATTACH("OVERLAY", "FIRE_5x5_15", [_x=100, _y=100);


Bliver _root rykket til (100;100)!
Hvorfor?
Avatar billede Slettet bruger
13. april 2007 - 08:54 #24
*SYMBOLS.ATTACH("OVERLAY", "FIRE_5x5_15", [_x=100, _y=100]);
Avatar billede barklund Nybegynder
13. april 2007 - 09:19 #25
{_x:100, _y:100}

hedder det - du har skrevet:

[_x = 100, _y = 100];

Hvilket betyder:

_x = 100;
_y = 100;
[_x, _y]

Altså du flytter _x og _y hvor du er, og så giver du den et array af den nye _x og _y hvilket overhovedet ikke giver mening :)

Fjerde argument til attachMovie er et objekt - ikke et array :)
Avatar billede Slettet bruger
13. april 2007 - 10:33 #26
Ups, ja, ved det - det er Object, IKKE Array :)
Glemte at skrive, at jeg fandt ud af det.... Anyway, lige et sekundt...
Avatar billede Slettet bruger
13. april 2007 - 10:54 #27
Heyyyyy nu virker det :D
Takker, gi' mig lige et svar ;)
Avatar billede barklund Nybegynder
13. april 2007 - 11:01 #28
Great :)
Avatar billede barklund Nybegynder
13. april 2007 - 12:01 #29
Og tark :)
Avatar billede larsholmgaard_dk Nybegynder
13. april 2007 - 12:23 #30
Link? Jeg vil spille 'Røg efter fly, fjender, missiler og eksplosioner'-spil! :-)
Avatar billede barklund Nybegynder
13. april 2007 - 12:29 #31
Det lyder meget som Heli Attack 3: http://www.miniclip.com/games/heli-attack-3/en/

:)

--
Morten Barklund
Avatar billede Slettet bruger
15. april 2007 - 10:50 #32
Nice spil :)
Men det er ikke ligefrem den type...
Avatar billede Slettet bruger
15. april 2007 - 10:50 #33
Damn, jeg skal først have adgang til en side hvis jeg skal kunne uploade det... og det har jeg ikke!
Avatar billede Slettet bruger
01. maj 2007 - 10:49 #34
Jeg regner med snart at uploade en beta... :)
Avatar billede larsholmgaard_dk Nybegynder
02. maj 2007 - 15:42 #35
Så kan jeg snart pløkke med missiler. :-)
Avatar billede Slettet bruger
16. maj 2007 - 18:12 #36
SÅ! Glemte at skrive, da jeg uploadede betaen (sorry), men her en den fulde!
http://www.maqhem.com/toke
Det er kun en midlertidig placering. Jeg skal have købt et domæne selv...
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