Instanzen in bestimmten Bereich deaktivieren

  • GM 8

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

  • Instanzen in bestimmten Bereich deaktivieren

    Guten Tag!

    Ich habe ein Problem, welches ich einfach nicht lösen kann ... Ich saß nun auch einige Tage dran
    bevor ichs hier reinposte, aber nu seid ihr meine letzte Hoffnung.

    Ich arbeite nun ja an ein RPG/MMORPG Spiel.. damit kein Spieler einen Vorteil gegenüber anderen hat, weil
    die Person einen größeren Bildschirm hat, habe ich eine Art Schatten am Rand eingebaut, in dessen Bereich
    Objekte deaktiviert werden die das Game Play beenflussen (z.B. Gegner, NPC's usw.)

    Objekte außerhalb des Bildschirms werden ohnehin deaktiviert, da die map sehr groß werden könnte.

    Zuvor hatte ich alles mit Tiles gelöst, da diese ja nicht deaktiviert werden. Aber ich habe alles auf Objekte umgestellt
    da ein wenig umständlichh ist verschiedene Aktionen durchzuführen.

    Was ich versucht habe:

    Objekte ausherhalb des Views deaktivieren [funktioniert].
    Objekte innerhalb des Views aktivieren [funktioniert].
    Bestimmte Objekte im Bereich des Schattens deaktivieren [geht nicht]

    Woran es scheitert?
    Ich habe seeehr viel rumprobiert, und ich kann definitiv sagen, dass es irgendwie an der Zeile liegen muss die
    das Objekt deaktiviert. Folge ist dann, dass das komplette Spiel abstürtzt.

    Komischer Weise funktioniert es in diesem Fall einmal bei dem Hasen Objekt. Aber im
    nächsten Moment stürtzt das spiel einfach ab bzw. freezed.

    Hier der Code

    GML-Quellcode

    1. //INSTANZEN DE- UND AKTIVIERUNG
    2. instance_activate_region(view_xview[view_current],view_yview[view_current],view_wview[view_current],view_hview[view_current],1)
    3. instance_deactivate_region(view_xview[view_current],view_yview[view_current],view_wview[view_current],view_hview[view_current],false,true);
    4. with(obj_rabbit)
    5. {
    6. if (point_distance(x,0,obj_sample_player.x,0)>400 || point_distance(0,y,0,obj_sample_player.y)>304)
    7. {
    8. instance_deactivate_object(id);
    9. }
    10. }
    11. instance_activate_object(obj_init);
    12. instance_activate_object(obj_inventory_init);
    13. instance_activate_object(obj_inventory_cbar);
    14. instance_activate_object(obj_inventory_background);
    15. instance_activate_object(obj_inventory_slot);
    16. instance_activate_object(obj_inventory_closebutton);
    17. instance_activate_object(obj_dead_body);
    18. instance_activate_object(obj_monster_healthbar);
    19. instance_activate_object(obj_rabbit_creation_point);
    20. instance_activate_object(obj_water);
    Alles anzeigen


    Und kann ich das ganze durch ein Parent laufen lassen [with (obj_parent){}], sodass die
    childs sich dadurch deaktivieren?

    Ich hoffe echt ihr könnt mir helfen :s
    Danke schonmal


    mfg
  • Das könnte ich theoretisch machen, aber ich möchte ja, dass alle anderen Objekte die das Gameplay nicht beeinflussen ja
    trotzdem im Schatten geladen werden. Trotzdem danke für den Vorschlag :)

    Deshalb versuche ich ja lediglich die Objekte zu deaktivieren wenn sie im Schatten sind, weil das ja weniger sind als
    die die trotzdem sichtbar sein sollen. Ich wünschte das Spiel würde mir ein Error anzeigen was mir hilft anstatt zu freezen : /
  • Hmm, dann versteh ich nicht, warum deine Variante nicht funktioniert.

    Probier doch mal:

    GML-Quellcode

    1. with (all) {
    2. if (x < (screen_width/2 - 400) || x > 800 || y < (screen_height/2 - 304) || y > 608) instance_destroy();
    3. }


    Gruß

    EDIT: Ich hab jetzt with (all) da stehen, wenn es klappt, kannst du das ja in with(obj_rabbit) ändern^^
    bzw statt instance_destroy(); instance_deactivate_object(id);
  • So habs bisauf die Abfrage übernommen, weil der Player irgendwie in den Koordinaten 4939,8946 steht :p
    Zuerst war alles weg. Wahrscheinlich, weil der View ganz am Anfang noch bei 0,0 steht -.-
    Also hab ich einfach nen Alarm reingepackt. Dann ging es soweit.

    Als nächstes hab ich dann "instance_destroy();" zu "instance_deactivate_object(id);" geändert.
    Das Spiel hängt sich einfach auf ... und ich weiß nicht wieso :D

    Vielleicht ist diese funktion Fehlerhaft oder kollidiert irgendwie mit der "instance_deactivate_region" Funktion?
    Irgendwie scheint es hoffnungslos zu sein :(
  • Nah die Abfrage die ich habe ist schon richtig :)

    GML-Quellcode

    1. if (point_distance(x,0,obj_sample_player.x,0)>400 || point_distance(0,y,0,obj_sample_player.y)>304)


    Da wird der Abstand zwischen dem Objekt und dem Spieler gemacht. Der Spieler ist immer Mittig und somit
    wird ermittelt, ob das Objekt innerhalb des Schattens ist. Mit einer Textbox hab ich dann auch gemerkt, dass
    die Abfrage soweit funktioniert. Die Instanz zu löschen geht soweit auch, nur bei dem deaktivieren gib das Spiel den Geist auf :s
  • Vllt kannst du es einfach drehen und dann auch die ersten beiden Zeilen weglassen:

    GML-Quellcode

    1. // instance_deactivate_object(all);
    2. with (all) {
    3. if (x > (screen_width/2 - 400 + obj_sample_player.x) &&
    4. x < (screen_width/2 + 400 + obj_sample_player.x) &&
    5. y > (screen_height/2 - 304 + obj_sample_player.y) &&
    6. y < (screen_height/2 + 304 + obj_sample_player.y) )
    7. instance_activate_object(id);
    8. }
  • Da stoßt man auf ein Hinderniss :D
    Ich kann einem deaktiviertem Objekt leider nicht sagen, dass es sich wieder aktivieren soll :D

    Schade, dass es kein deactivate_region_object gibt oder so.

    Hat denn niemand anders noch ne Idee was hier der Fehler ist?
  • Okay, letzter Versuch:

    GML-Quellcode

    1. with (all) {
    2. if (x < (screen_width/2 - 400 + obj_sample_player.x) || x > (screen_width/2 + 400 + obj_sample_player.x) || y < (screen_height/2 - 304 + obj_sample_player.y) || y > (screen_height/2 + 304 + obj_sample_player.y)) instance_deactivate_object(id);
    3. }


    Gruß

    EDIT:
    Wenn du die Abfrage nur auf den Bildschirmausschnitt begrenzen willst, wird die Abfrage um einiges länger. Aber das sollte es eigentlich tun. Diese Abfrage war mein erster Gedanke, sieht aber nicht sehr elegant aus meiner Meinung nach.
  • Ich glaube du verstehst mich nicht ganz.
    Die Abfrage die ich (die ich im ersten Post stehen hab) ist nicht das Problem. Die
    funktioniert einwandfrei und wie ich es möchte. Das Problem liegt an der Funktion:
    instance_deactivate_object(id);

    Diese Funktion freezed das ganze Spiel.

    Nach langem suchen habe ich auch etwas hilfreiches in einem anderen Forum gefunden:

    Quellcode

    1. Do not instance_deactivate instances on create or the internal GM instance list will not match... Instances created after an instance that deactivated itself will have their creation event skipped.
    2. Don not instance deactivate on room start, GM will have a memory overrun problem and crap out.
    3. If you need to deactivate an instance when the game starts, create an alarm, set it to 1 and deactivate the instance in the alarm...


    Heißt soviel wie, wenn eine Instanz die gerade erstellt wird, sofort deaktiviert wird, wird beim nächsten aktivieren dieser Instanz ohne
    dem Create Event fortfahren und verursacht eine kritische Situation für das Spiel.

    So nun habe ich dem Hasen im Create Event eine Alarm Zeit von 1 Step gegeben, wodrin eine variable "true" wird.
    Erst wenn diese Variable "true" ist kann, wird die Instanz deaktiviert.

    Jetzt funktioniert es !! Fast ...

    Der Hase wird im Schatten deaktiviert und im Sichtbereich wieder aktiviert, aber aus irgendeinem Grund
    reagiert das Spiel irgendwann nach 20 sek - 2 min. nichtmehr. Irgendwo muss wohl noch etwas falsch sein, aber was?

    Hier nochmal meine neue Abfrage:

    GML-Quellcode

    1. with(obj_rabbit)
    2. {
    3. if ((point_distance(x,0,obj_sample_player.x,0)>400 || point_distance(0,y,0,obj_sample_player.y)>304) && activ==true)
    4. {
    5. instance_deactivate_object(id);
    6. }
    7. }



    mfg

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Unistyle ()

  • Kann niemand helfen?

    Edit: Sry für den Doppelpost. Hab das hier erst jetzt gefunden:

    Ab sofort ist es möglich, einen Beitrag durch Editieren als neu zu kennzeichnen. ..
    Anscheinend kann mir hier aber niemand helfen. Trotzdem danke an Psychodelics, dass er es wenigstens versucht hat :)
    Dann ist das Thema glaub ich hiermit erledigt ..

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

  • Ich habe das nun anders gelöst, da es sich als schwieriger erwiesen hat als erwartet.

    Und zwar verwende ich ja bereits die Funktionen "instance_deactivate_region" und "instance_activate_region"
    die auch im gegensatz zu "instance_deactivate_object" sehr zuverlässig funktionieren.

    Also habe ich es zuerst damit gelöst, dass die bestimmten Objekte einfach auf "visible=false" setze.
    Damits aber noch besser ausschaut lasse ich die sprites langsam verschwinden und wieder auftauchen:

    GML-Quellcode

    1. if (instance_exists(healthbar)) //Abfrage ob die eigenerstellte Healthbar bereits erstellt wurde
    2. {
    3. if ((point_distance(x,0,obj_sample_player.x,0)>400 || point_distance(0,y,0,obj_sample_player.y)>304)) //Abfrage für den Schattenbereich
    4. {
    5. if(image_alpha>0)
    6. {
    7. image_alpha-=0.01; //Die Transparenz des Hasensprite pro step erhöhen
    8. healthbar.alpha-=0.01; //Variable der Healthbar für draw_set_alpha
    9. }
    10. }
    11. else
    12. {
    13. if(image_alpha<1)
    14. {
    15. image_alpha+=0.01; //Wieder langsam sichtbar machen
    16. healthbar.alpha+=0.01; //Das selbe^^
    17. }
    18. }
    19. }
    Alles anzeigen


    Falls Leute mal auf diesen Thread stoßen, weil sie Probleme mit "instance_deactivate_object" haben,
    kann ich euch nur sagen was ich beobachten konnte:

    Mit dieser Funktion wird ein Object deaktiviert, und zwar ungeachtet darauf ob ein Event den Code
    durchlaufen hat.
    Z.b. könnte somit (je nach Situation) das gewünschte Objekt schon dann deaktiviert werden, bevor das Create
    Event begonnen hat/abgeschlossen ist.

    Das kann das ganze System (bei mir nur kurzzeitig) hängen. Zumindest ist das Spiel gefreezed
    und es blieb nichts anderes übrig als das Spiel anderweitig zu beenden.

    Da bei mir noch andere Objekte von der Hasen Instanz abhängig war (Healthbar), wäre es zu kompliziert gewesen,
    weshalb ich es nun auf anderem Wege gelöst habe.

    Zur Lösung die ich leider noch nicht bestätigen kann:
    Um eine bestimmte Instanz zu löschen, sollte man vorher abfragen z.B. "if (activ==true) {instance_deactivate_object(id);}
    ob eine Variable true ist. So kann man das Create Event auf jeden Fall durchlaufen lassen.

    Dann muss man zu Anfang einfach einen Alarm setzen: alarm[0]=1;
    und im Alarm setzt man "activ=true;"


    mfg

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