Spiel hängt sich wegen Partikeln auf

  • GM 7

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

  • Spiel hängt sich wegen Partikeln auf

    Hallo zusammen!

    Ich habe ein Problem mit den Partikeln. I.d.R. funktionieren sie sehr gut, aber ich habe nun Partikel an Objekten, welche von anderen Erzeugt werden und durch den Raum fliegen (Kurz: die Patrone von einer Waffe). Nun kann es sein, dass auf dem Bildschirm mehrere solcher Objekte existieren. Wenn man sich ca. eine Minute im Level befindet oder mehrere solcher Level durchspielt, hängt sich das Spiel auf. Die Partikel erscheinen nicht mehr, alles ruckelt und Ende.

    Es scheint so, als sei der Speicher (welcher auch immer :D ) geflutet.

    Hier zum Code:

    Jeder Partikeleffekt ist ein eigenes Objekt, welches im Step aufgerufen ist. Eingebunden in der Patrone kommt es auf das selbe hinaus, habe ich schon versucht.

    Im Create wird laufend ein Alarm ausgelöst, welcher die Instanz gleich wieder löscht. Im Draw schaut der Code so aus:

    GML-Quellcode

    1. particle = part_system_create();
    2. particlep = part_type_create();
    3. part_type_life(particlep,5.90,41.30);
    4. part_type_shape(particlep,7);
    5. part_type_size(particlep,0.10,0.33,0,0);
    6. part_type_scale(particlep,1,1);
    7. part_type_speed(particlep,1,2,-0.09,0);
    8. part_type_gravity(particlep,0.15,90);
    9. part_type_color3(particlep,make_color_rgb(81.60,81.60,94.35),make_color_rgb(109.65,124.95,109.65),make_color_rgb(163.20,165.75,160.65));
    10. part_type_orientation(particlep,0,0,0,0,1);
    11. part_type_direction(particlep,0,360,0,0);
    12. part_type_alpha3(particlep,0.79,0.86,0.97);
    13. part_type_blend(particlep,1);
    14. emitter = part_emitter_create(particle)
    15. part_emitter_region(particlep,emitter,x-0,x+0,y-0,y+0,0,0)
    16. part_emitter_burst(particlep,emitter,particlep,1)
    Alles anzeigen


    Kann mir da jemand weiter helfen? ;(
  • Jop, das schaut nach ner RAM Überfüllung aus.
    Du erstellst in jedem Step mehrere Partikelsysteme und Partikelarten und löschst sie nie, kein Wunder ist nach einer Weile kein RAM mehr frei. Am Besten wäre es, wenn du das Partikelsystem und die Partikelart nur einmal erstellst, dafür aber global (mach dazu einfach ein Controller Objekt, welches einmal die Partikel erstellt). Den Emitter erstellst du vorzugsweise im Create Event und verwendest ihn dann im Draw Event (und nicht vergessen den Emitter zu löschen wenn die Instanz zerstört wird).
    int (*x(*x(int))[5])(int*);
    Confused? Yes, it's C!
  • Das klingt plausibel. Ich habe es auch immer wieder... versucht zu löschen. Im Step des Partikels wird er sofort wieder gelöscht. Allerdings bin ich mir nicht sicher, ob ich es richtig mache. Somit die Frage: wie lösche ich den aktuellen Emitter aus dem RAM?
  • GML-Quellcode

    1. part_emitter_destroy(ps,ind)

    Zerstört den Emitter ind im Partikelsystem ps

    Ein wichtiger Grundsatz ist, dass man wenn möglich nie Ressourcen im Step oder Draw Event erstellen sollte, wenn man sie nicht ganz sicher im gleichen Step wieder löschst.
    int (*x(*x(int))[5])(int*);
    Confused? Yes, it's C!
  • Halte dich einfach an den Post.
    Mach alles außer dem Emitter Zeugs in ein Controller Objekt (obj_partcontrol oder so), welches du im Raum platzierst. Eine Sache wäre da aber noch: Es ist - meiner Meinung nach - effizienter keine Emitter bei sich bewegenden Objekten zu nehmen. Also im End Step Event der Kugel einfach:

    GML-Quellcode

    1. part_particles_create(obj_partcontrol.particlep,x,y,obj_partcontrol.particle,1);
  • Danke für die Antworten. Habe es nach bestem Wissen und Gewissen versucht, aber ich bekomme es einfach nicht hin. Entweder ich habe keine Partikel oder es stürzt ab.

    Lösung: bleiben lassen.

    Edit: Interessant. Eben habe ich versucht den Partikel gleich nach der Erstellung zu löschen. Man sieht keine Partikel mehr (Objekt wird sofort gelöscht) und es hängt sich immer noch auf. In meinem Testlevel immer nach 34 Sekunden.

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

  • Du darfst weder das Partikelsystem noch die Typen löschen, wenn du sie verwendest.
    Um das System und die Typen zu erstellen musst du das Create Event benutzen, jeden Step solche zu erstellen ist Wahnsinn :P
    Vielleicht benutzt du lieber die einfachen Effekte, wo du dich nicht um den Erstellungskram kümmern musst ;)
  • Erstellung von Partikelsystemen, -emittern und -typen -> Create Event.
    Erstellung von einzelnen Partikeln -> Andere Events.

    Nochmal zur Erinnerung:

    copyboy schrieb:

    [...] Also im End Step Event der Kugel einfach:

    GML-Quellcode

    1. part_particles_create(obj_partcontrol.particlep,x,y,obj_partcontrol.particle,1);
    (Das sollte diesen Schweif erzeugen.)

    EDIT:
    Dur'Rean: Die Funktion oben macht das Alles ein wenig einfacher.
    Yamm: Lass das Emitter-Zeugs ganz weg.
  • du musst lediglich die

    GML-Quellcode

    1. part_emitter_region(particlep,emitter,x-0,x+0,y-0,y+0,0,0)
    2. part_emitter_burst(particlep,emitter,particlep,1)


    in jedem step ändern. alles andere wird nur einmalig erstellt
    Funktioniert perfekt. Mehr wollte ich nie. 8o