sprites erstellen und im späteren Räumen nutzen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • sprites erstellen und im späteren Räumen nutzen

    HI Alle

    Ich habe hier sone Babyfrage und ich komme einfach nicht drauf ...
    vielleicht habt Ihr ja ne Idee
    Ich baue gerade an meinem Ladebildschirm rum ... und da ist mir etwas gravierendes aufgefallen...

    Ich möchte einfach nur das ein sprite aus einem File erstellt wird ... und dem Resourcentree hinzugefügt wird.

    das geht ja mit:
    sprite1 = sprite_add(blablabla);

    dann wollt ich das hinzugefügte Sprite in einem anderen Raum benutzen und wenn es nicht mehr gebraucht wird einfach mit:
    sprite_delete(ind) löschen.

    tja soweit so gut ...
    leider funktioniert es nicht ...
    sobald ein Objekt im nächsten Raum das Sprite (sprite1) drawen will kommt natürlich immer die Ansage das die Variable sprite1 fehlt... grummel

    mmmh das wäre nur ein Problem bei den unzähligen Versuchen
    Ich weiß man kann die funkt. (sprite_add) auch einer global.var zuweisen ... aber dann bräuchte ich ja kein Ladebildschirm mehr ...

    mmmh also ich will nur:

    - File laden und Sprite erstellen (vielleicht noch Name für (ind) festlegen)
    - irgendwann mal benutzen
    -wenn’s nicht mehr gebraucht wird löschen

    Ich hoffe Ihr habt ne Idee ... Ich würde mich sehr freuen

    euer Guld
  • also im grunde genommen hast du deine frage selber beantwortet.
    wenn du das sprite einer lokalen variable zuordnest, "vergisst" der game maker im nächsten room den namen, das sprite ist aber theoretisch noch da.
    meine vorschläge:
    1.) du verwendest globle variablen :D
    2.) du könntest ein presidentes object verwenden um die spritenamen-liste in die anderen räume zu tragen.
    3.) du könntest vorsuchen mit der nummer der bilder zu arbeiten. ich glaube die kann man sich aber nicht ausgeben lassen. das ist die nummer unter der der gm das bild abgespeichert hat. diese nummern sind unveränderlich und in aufsteigender reihenfolge. wie man das aber gut löst wüsste ich jetzt auch nicht...
    Battle Command - WeltraumEchtzeitStrategie | Meine GM Spiele auf Box.net
    GCM/FA/O d-(--)@>---xpu s-:- !a C++$@ U- P L+ E W++ N o K-- w++ O? M V PS PE-- Y PGP t 5 X R+++ tv+ b DI D G e+ h? r-- x
  • oh wow ... das ging ja schnell

    Die Idee mit dem persidenten Objekt finde ich garnicht so schlecht... das probier ich mal.

    zu 1. offenbart sich mir eine weitere kleine Frage:
    ist es richtig das bei der Zeile z.B.

    global.sprite1 = sprite_add(blabla);

    die globale Var. (sprite1) nur die Funktion zugwiesen bekommt und diese auch erst ausgeführt wird wenn ein Objekt oder eine andere Funktion die Var. (sprite1) verarbeitet.
    Wenn ja ... ist die Lösung mit globale Vars... nicht so günstig da bei mir die Daten nur bei dem kurzem Ladeinterval Raum(ladebildschirm) geladen werden können ....

    Ich check das jetzt erstmal mit einem persidenten Objekt... das könnte wiederum klappen ... hoffe ich :)

    Thx WIN
  • Original von Guld
    ist es richtig das bei der Zeile z.B.

    global.sprite1 = sprite_add(blabla);

    die globale Var. (sprite1) nur die Funktion zugwiesen bekommt und diese auch erst ausgeführt wird wenn ein Objekt oder eine andere Funktion die Var. (sprite1) verarbeitet.

    soweit ich informiert bin, wird die funktion dann ausgeführt wenn sie definiert wird. also direkt in der zeile wo sprite_add steht.
    und kein problem :D
    Battle Command - WeltraumEchtzeitStrategie | Meine GM Spiele auf Box.net
    GCM/FA/O d-(--)@>---xpu s-:- !a C++$@ U- P L+ E W++ N o K-- w++ O? M V PS PE-- Y PGP t 5 X R+++ tv+ b DI D G e+ h? r-- x
  • so ... ich habe mal mir ner Persidentlösung rumgespielt und es scheint zu funktionieren.
    nur eine Sache bleibt noch offen ...
    wie befreie ich den Speicher von den Sprites wenn ich sie nicht mehr benötige

    bei sprite_delete(ind) brauche ich die (ind) und genau die habe ich ja nicht .

    Ich habe hier mal die kleine Test gm6 (4kb) hochgeladen.

    wenn wir das Löschen des Sprites aus dem Speicher noch hinbekommen ... haben wirs geschafft :)

    euer Guld
    Dateien
    • spritetest.zip

      (3,29 kB, 154 mal heruntergeladen, zuletzt: )
  • Ich versteh nicht ganz warum das ganze in einem Persistent Object sein soll. Das macht das ganze irgendwo unnötig kompliziert.

    Soweit ich das verstehe möchtest du das Sprite Dynamisch laden, Also wenn es gebraucht wird soll es im Speicher sein, ansonsten sollte es gelöscht sein. Probier mal folgendes. Rufe im Create Room des aller ersten Raumes ein Script auf das dir eine globale Variable anlegt:

    GML-Quellcode

    1. {
    2. global.SPR_Sprite01 = -1;
    3. global.SPR_SpriteUsage01 = 0;
    4. }


    -1 Bedeutet das Sprite noch nicht gesetzt ist (ich glaube Resourcen haben werte von 10000 oder mehr, aber gehn wir lieber sicher).

    Jetzt kommt ein Object, das dieses Sprite benötigt. In create machst du dann ca folgendes

    GML-Quellcode

    1. {
    2. if(global.SPR_Sprite01 != -1) //Sprite bereits gesetzt
    3. {
    4. sprite_index = global.SPR_Sprite01;
    5. }
    6. else
    7. {
    8. global.SPR_Sprite01 = sprite_add('info2.gif',-1,false,true,true,true,0,0);
    9. }
    10. global.SPR_SpriteUsage01 += 1; //Ein weiteres Objekt benutzt dieses Sprite
    11. }
    Alles anzeigen


    Okay, im Destroy Event überprüfst du wieviele Objekte das Sprite noch verwenden. Wenn die Anzahl 0 ist, kannst du das Sprite löschen.

    GML-Quellcode

    1. {
    2. global.global.SPR_SpriteUsage01 -= 1;
    3. if(global.global.SPR_SpriteUsage01 == 0)
    4. {
    5. sprite_delete(global.SPR_Sprite01);
    6. global.SPR_Sprite01 = -1;
    7. }
    8. }


    im Room End Event muß eine leicht abgewandelte Version benutzt werden, falls das Objekt Persistent ist.

    GML-Quellcode

    1. {
    2. if(persistent) exit;
    3. global.global.SPR_SpriteUsage01 -= 1;
    4. if(global.global.SPR_SpriteUsage01 == 0)
    5. {
    6. sprite_delete(global.SPR_Sprite01);
    7. global.SPR_Sprite01 = -1;
    8. }
    9. }
    ...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Shoba ()

  • Benutzer online 1

    1 Besucher