Kollisions-Prioritäten

  • GM 8
  • Kollisions-Prioritäten

    Huhu,
    nun stehe ich vor einem weiteren unerwarteten Problem :P

    Durch ausprobieren habe ich folgendes herausgefunden:

    Sind in einem Objekt mehrere Kollisions-Trigger, werden sie von oben nach unten in jedem Step durchgearbeitet. Da eine Einheit aber nur pro Sekunde 1x angreift, wird, wenn mehrere Kollisionen gleichzeitig stattfinden, immer das erste angegriffen.
    Das führt dazu, dass meine Soldaten stumpf die Burg attakieren, obwohl sie von später gespawnten Einheiten verprügelt werden.

    Nun wollte ich die die Kollision mit den Einheiten hoch-ziehen, aber das geht nicht.
    Wie kann ich die Prioritäten jetzt ändern?

    Am liebsten wäre mir allerdings, dass zufällig ein Objekt ausgewählt wird, sodass quasi die Burg und die Soldaten gleichzeitig angegriffen werden, da die beiden Extremvarianten schlecht ins Balancing passen.

    Ich hoffe ihr versteht mein Problem und habt Lösungsvorschläge :D

    Gruß
    Naibaf
    True story!
  • Du müsstest alle Kollisionen zuerst abfragen, auswerten (in deinem Fall per random) und in eine Prioritäts-Liste packen.
    Dann das prioritierte Element auswählen und dann erst den Angriffsbefehl erteilen.
    wenn du die Kollisions-Events benutzt kannst du frühestens im step_end den Angriffsbefehl geben. Bei 1 Angriff pro sec sollte es aber kein großes Problem sein.
  • Ich verstehe nicht ganz. Ein weiteres Problem ist, dass ich mit dem Befehl "other" arbeite, dieser Befehl ist nur im Kollisions-Event verfügbar.

    Könntest du mir vielleicht mal eben, nur in Worten, folgendes Szenaria konzipieren:

    Pro Sekunde 1 Angriff
    Kollision 1
    Kollision 2
    Kollision 3

    Das Problem ist, dass solange eine Kollision mit "1" besteht, immer "1" angegriffen wird, da das erste Kollisionsevent pro Step auch als erstes abgefragt wird.

    Gruß
    naibaf
    True story!
  • TrunX schrieb:

    Speicher die IDs aller Kollisionsobjekte in eine Liste oder Array und such dir anschließend dein Ziel raus.


    Also das muss mir jemand detailierster erklären. Bin leider noch Anfänger was das skripten angeht.

    Was ist ein Array?
    Wie meinst du das mit der Liste?
    Und wie funktioniert das dann mit dem Befehl other.xyz?

    Gruß
    naibaf
    True story!
  • Im Begin-Stepevent:

    GML-Quellcode

    1. i=0

    Im Collisionsevent mit den Zielobjekten:

    GML-Quellcode

    1. zielobjekt[i]=other //evtl. auch other.id
    2. i+=1;


    im Endstepevent oder an welcher Stelle du auch immer den Angriff ausführen willst erhälst du dann mittels "zielobjekt[x]", wobei x ne Zahl zwischen 0 und i sein muss, die id des ziels.
    Wenn du zb. nur die lebensvariable eines per zufall bestimmten Ziels abziehen willst:

    GML-Quellcode

    1. zielobjekt[floor(random(i))].leben-=schaden
  • Okay, danke.

    Nur damit ich die Logik dahinter verstehe, bevor ich anfange zu skripten (ich will ja lernen):

    Im Begin-Stepevent wird die Variable "i" erstellt.

    In den einzelnen Kollisionsevents wird nacheinander eine Liste aufgebaut, die folgendermaßen aussehen könnte (aber in jedem Step (i.d.R. 30 mal pro Sekunde):

    zielobjekt[0]=gegner1
    zielobjekt[1]=burgwall
    zielobjekt[2]=gegner2

    Nun wird im Endstep-event einer dieser variablen zufällig ausgewählt (hier habe ich Spielraum für unterschiedliche Wahrscheinlichkeiten oder Prioritäten)

    Beispielsweise:

    zielobjekt[1].leben

    Wäre dann die variable leben im zielobjekt.

    Soweit richtig verstanden? :D

    Ist die ID jetzt Objekt-gebunden oder wirklich instanz-gebunden?
    Ich will bzw muss halt nur auf die Instanz zugreifen, mit der die Soldaten kollidieren, da ja sonst alle instanzen dieses Objekts schaden erleiden würden.


    MfG
    True story!