Zu viele Instanzen?!?!

  • GM 8

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

  • Zu viele Instanzen?!?!

    Folgender Code für eine Wasserfließengine, wie bei Minecraft (nur halt 2d)

    GML-Quellcode

    1. //Setting the room speed lower will decrease the flow speed.
    2. //Setting the room speed higher will increase the flow speed.
    3. //Water Flowing code
    4. if !place_meeting(x,y+8,obj_dirt)
    5. {
    6. instance_create(x,y+8,obj_water)
    7. }
    8. else
    9. if !place_meeting(x-8,y,obj_dirt) && place_meeting(x,y+8,obj_dirt)
    10. {
    11. instance_create(x-8,y,obj_water)
    12. }
    13. if !place_meeting(x+8,y,obj_dirt) && place_meeting(x,y+8,obj_dirt)
    14. {
    15. instance_create(x+8,y,obj_water)
    16. }
    17. //
    18. //Sprite changes
    19. if place_meeting(x+8,y,obj_water) && place_meeting(x,y+8,obj_water)
    20. {
    21. sprite_index = spr_water_slopel
    22. }
    23. else
    24. if place_meeting(x-8,y,obj_water) && place_meeting(x,y+8,obj_water)
    25. {
    26. sprite_index = spr_water_sloper
    27. }
    28. if place_meeting(x-8,y,obj_water) && place_meeting(x+8,y,obj_water)
    29. {
    30. sprite_index = spr_water
    31. }
    32. if place_meeting(x-8,y,obj_water) && place_meeting(x+8,y,obj_water) && place_meeting(x,y-8,obj_water)
    33. {
    34. sprite_index = spr_water
    35. }
    36. if place_meeting(x,y-8,obj_water)
    37. {
    38. sprite_index = spr_water
    39. }
    Alles anzeigen


    jetzt frage ich mich allerdings, wieso sich die Instanzen mit jedem Step verdoppeln? Wisst ihr weiter?
    Grüße Stupe
  • bevor ich das wasser hinzugefügt habe gab es keine Probleme. Die Engine für das Wasser hab ich von Yoyogames. Aleerdings stand überall statt !place_meeting place_empty. Allerdings fließt das Wasser dann nicht wenn der Player bzw ein anderes Object im Weg ist. Mit place_emty hat es auch ohne Probleme geklappt. ?(
    Grüße Stupe
  • Das ist einfach: Zwischen !place_meeting und place_empty besteht ein Riesenunterschied. Letzteres hat nämlich keine Parameter - das bedeutet, es gibt nur true zurück, wenn sich an der überprüften Position keine Instanz irgendeines Objektes befindet. !place_meeting dagegen prüft das nur für ein einziges Objekt - in deinem Fall obj_dirt. Ob an der entsprechenden Position aber bereits Wasser ist, wird nicht geprüft. Das hat zur Folge, dass immer weiter Wasser an der selben Stelle generiert wird und die Instanzenzahl so immer schneller zunimmt.

    Lösen kannst du's, indem du allen Objekten, die Wasser stoppen sollen (und dazu zählt auch das Wasser selbst!) ein Parent-Objekt zuweist und dann einfach das als Kollisionsprüfung hernimmst. Viel Erfolg. ^^
  • Du kannst jedem Objekt im gleichen Editor, in dem du ihm Events und Code verpasst, ein Parent zuweisen. Das ist quasi ein Objekt höherer Ordnung - wenn du zum Beispiel den Objekten o_apfel und o_banane das Parent-Objekt p_obst zuweisen würdest, könntest du von da an in jeder Kollisionsabfrage einfach Sachen wie

    GML-Quellcode

    1. if place_meeting(x,y,o_obst) /*bla*/;
    schreiben - diese Abfrage wäre wahr, sobald entweder o_apfel oder o_banane an die entsprechende Position geraten.

    Also würde ich in deinem Fall vorschlagen, dass du ein Parent erstellst - nennen wir es mal p_waterblocker - und allen Objekten, die Wasser blockieren sollen, dieses Parent zuweist. Dann ersetzt du in deinen "if !place_meeting"s da oben einfach obj_dirt durch das neu erstellte p_waterblocker und hast von da an keine Probleme mehr mit dieser Engine.

    ...hoff ich zumindest mal. ^^
  • Ich hab das Ding jetzt mal bei mir nachgebaut. Stellt sich heraus, das funktioniert deswegen nicht, weil das Wasser selbst auch für die Erstellung von neuem Wasser links und rechts berücksichtigt wird. Das heißt, wenn ein Wasserblock auf einem anderen Wasserblock liegt, erstellt er neues Wasser links und rechts. Deswegen diese seltsame Pryamidenstruktur.
    Gelöst hab ich das einfach über ein zweites Parent-Objekt. Die gmres-Datei ist im Anhang, aber ich erklär's dir trotzdem mal:

    p_wblock - Parent für alles, was Wasser blockiert, auch Wasser selbst.
    p_b_nowater - Hat p_wblock als Parent und ist selbst das Parent für alle Blöcke, die Wasser aufhalten, aber selbst keine Wasserblöcke sind.
    o_d - Der Erdblock. Hat p_b_nowater als Parent.
    o_w - Der Wasserblock. Hat p_wblock als Parent und folgenden Code:
    :event_create: Create

    GML-Quellcode

    1. alarm[0]=room_speed/3;



    :event_timer: Alarm 0

    GML-Quellcode

    1. if !place_meeting(x,y+32,p_wblock) // Kein neues Wasser nach unten, wenn da schon irgendwas ist.
    2. {
    3. instance_create(x,y+32,o_w)
    4. }
    5. else
    6. if !place_meeting(x-32,y,p_wblock) && place_meeting(x,y+32,p_b_nowater) // Wasser nach links, wenn links nichts ist und unten was solides ist - also kein Wasser
    7. {
    8. instance_create(x-32,y,o_w)
    9. }
    10. if !place_meeting(x+32,y,p_wblock) && place_meeting(x,y+32,p_b_nowater) // Das gleiche rechts.
    11. {
    12. instance_create(x+32,y,o_w)
    13. }
    Alles anzeigen


    So funktioniert es, du musst es nun nur noch auf dein Spiel anpassen.
    Dateien
    • wasser.zip

      (1,33 kB, 119 mal heruntergeladen, zuletzt: )
  • Ok sry hätte auch ein bisschen mitüberlegen können :S

    Musste schleißlich nur am Ende des Alarm-Events wieder alarm[0]=room_speed/3 einfügen. Danke für deine Hilfe


    Brauche doch nochmal Hilfe. Wenn ich jetzt einen Block unter dem Wasser zerstöre, fließt das Wasser zwar nach, aber die Blöcke, die nach der Physik weg sein müssten sind immer noch da. (siehe Bild)

    Edit: sry wegen Doppelpost. Kann das bitte jemand zusammenschieben?
    Edit by J@kob: erledigt!
    Bilder
    • screenshot102.png

      5,9 kB, 640×480, 170 mal angesehen
    Grüße Stupe
  • xgamesproduction schrieb:

    echt? ist das bei minecraft auch so? Ich denke das wär mir n bisschen zu kompliziert. So gut bin ich leider (noch) nicht


    Sagen wir es so. Es sollte bei Minecraft nicht so sein, aber es ist sehr, sehr bugbelastet. Vor allem in der neuen Version, in dem der Wasserfluss geändert wurde, hackt es bei Minecraft auch manchmal, da muss man anstelle der ursprünglichen 1-2 Wasserblöcke dochmal ein paar per Hand entfernen. Ich würde prüfen, ob oberhalb, links oder rechts ein Wasserblock ist (beim Zerstören eines Blockes), und dann prüfen, ob nachgeflossen wird / ob von dem Ursprungswasser ein anderer Weg da lang führt.
  • Benutzer online 1

    1 Besucher