Frage zur Schadensberechnung

  • GM 8

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

  • Frage zur Schadensberechnung

    Hallo liebe GM-Community!

    Ich stehe in meinem Projekt derzeit vor einem Problem. Undzwar bin ich mir nicht sicher, bzw habe momentan noch keine Ahnung, wie ich meine Schadensberechnung errechnen lassen soll.

    Dabei geht es nicht um die Formel selber, sondern vielmehr weiß ich jetzt nicht, wie ich dem Programm zu erkennen geben kann, welche zwei Objekte sich gegenseitig Schaden zufügen. Ich könnte jetzt in jedem meiner Objekte jeweils eine Kollisionsabfrage für alle vorhandenen Objekte hinzufügen, doch wäre dieser Aufwand bei mehreren hundert Objekten groß denke ich. Zudem muss noch abgefragt werden, ob das Objekt/die Einheit feindlich oder freundlich gesinnt ist, undzwar ohne für feindliche Einheiten andere Objekte zu verwenden. Zugleich muss der Code so aufgebaut sein, dass meine KI sofern ein Feind in der Nähe ist sich zu diesem bewegt und in diesem Code kann ich leider schlecht hundert verschiedene Distanzen vergleichen lassen.
    Deshalb dachte ich mir, dass alle feindlichen Einheiten jeweils ein unsichtbares "enemy"-objekt auf sich bekommen, damit ich dann nur noch eine Distanz zu dem Objekt "enemy" im Code erwähnen muss.
    Ich bin derzeit auch noch am Grübeln, ob ich durch die Kollision mit dem Objekt "enemy" eine Schadensberechnung zwischen zwei Objekten verbinden kann.

    Ich suche also quasi eine Möglichkeit zu vermeiden, in etwa hundert Objekten jeweils 100 Kollisionsabfragen laufen lassen zu müssen.

    Stand jemand schonmal vor einem ähnlichen Problem oder hätte eine Lösung dafür? Ich wäre sehr dankbar.
    Ich hoffe, dass ich mein Problem nicht zu umständlich erklärt habe, es ist an sich leider schon sehr kompliziert. Falls Fragen offen sind, dann fragt ruhig nach :).

    Mfg,

    lordvanzed
  • Ich geb dir mal ein Stichwort: parent-Objekte.
    Durch die Benutzung dieser hilfreichen Kameraden kannst du beliebig viele Objekte unter einem Mutterobjekt zusammenfassen. Willst du zum Beispiel Kollisionen mit verschiedenen Gegnern abfragen, erstellst du einfach ein neues, codeloses Objekt namens obj_gegner o.ä. und weist allen Gegnern im Objekteditor dieses Objekt als Parent zu. Somit musst du dann nur noch Kollisionen mit obj_gegner abfragen und reduzierst die Verwendung von zigtausend Kollisionsevents auf eines. Extrem praktische Sache. :)
    Und mit dem unsichtbaren Enemy-Objekt warst du ja quasi schon auf dem richtigen Gedankengang. Parent-Objekte funktionieren im Prinzip genau so - der einzige Unterschied ist, dass "obj_gegner" nie explizit im Raum erstellt wird, sondern eben stellvertretend für alle Unterobjekte verwendet wird, wo immer du es einsetzt - sei es nun in Kollisionsabfragen, "with"-Statements oder Zählern wie instance_number oder instance_exists.
    Außerdem praktisch: Du kannst auch weiterhin einzelne Unterobjekte ansteuern. Zum Beispiel kannst du mit obj_gegner.HP=100 die Lebensenergie aller Gegner auf 100 setzen, und dann mit obj_zombie.HP=120 die HP eines einzelnen Gegners nochmal auf einen anderen Wert setzen. Ob und wann du das Oberobjekt abfragst, bleibt dir überlassen und hängt halt davon ab, wann du's brauchst.
  • Wow, das war wirklich gut erklärt, danke!
    Ahh, jetzt verstehe ich erst richtig, was das Parenting für Vorteile hat =). Okay, ich denke damit werde ich viel anfangen können.

    Kann man eigentlich auch Parent-Objekte parenten? Also dass ich quasi ein Parent habe für alle Zombies, eins für alle Soldaten und diese dann mit einem Objekt zb: "lebewesen" parente? Wenn ich also dem Objekt lebewesen Schaden erhalten lasse, würden dann die Unterobjekte "Soldaten" und "Zombies" und somit auch alle denen untergeordneten Objekte diesen Schaden erhalten?

    Edit:
    Was mir nun noch einfällt ist ein weiteres Problem: Undzwar, kann man Objekte auch im Spiel selbst sinnvoll parenten lassen? Sagen wir ich spiele mit Zombies und kämpfe gegen andere Zombies, dann dürften ja nur die feindlichen Zombies mit "enemy" geparented sein, damit die KI nicht auf die eigenen Zombies losgeht.
    Ich will die Codes auch so aufbauen, dass ich später dann auf einfache Weise ein Multiplayergame daraus machen kann, deshalb arbeite ich bei den HP Variablen mit 2D Arrays und zum teil mit 2D Arrays in 2D Arrays. Also global.hp[1,1] würde beispielsweise heißen "die HP der Einheit 1 von Spieler 1". Sagen wir mal, dass Zombie von Spieler 1 ( global.atk[1,2] ) den Soldaten von Spieler 2 angreift ( global.hp[2,1] ). Dann würde ich das so machen (der Einfachheitshalber habe ich die Formeln stark vereinfacht):


    Step event von Zombie:

    Quellcode

    1. if (distance_to_object(enemy))<=global.range[1,2]
    2. {move_towards_point(instance_nearest(x,y,enemy).x,instance_nearest(x,y,enemy).y, global.tempo[1,2])


    Kollisions event Zombie, wenn Zombie mit dem Soldaten kollidiert:

    Quellcode

    1. global.hp[2,1]-=global.atk[1,2]


    Nur weiß ich jetzt nicht, wie ich herausfinden soll, welches Unterparentobjekt (welche der Feindeinheiten) getroffen wurde, ohne dafür in jedem Objekt eine Kollision einzufügen o_O.
    Hmmm.. gott, das mit den Objektzuordnungen ist ja wirklich katastrohpal kompliziert bei zwei Spielern und so vielen verschiedenen Objekten xDD.


    Edit 2:
    Ich habe mal in Paint versucht mein Hindernis, vor dem ich jetzt stehe besser zu erläutern. Hat auch recht lange gedauert XD.


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

  • Ja, man kann auch Großeltern etc. definieren, indem du dem Parent wiederum einen Parent zuweist.
    Man sollte an der Stelle noch anmerken, dass du darauf verzichten solltest, Eltern und Kinder gleichzeitig im Raum zu haben - denn dann werden auch verhaltensweisen im laufenden Spiel vererbt (vspeed und so).

    Zu deinem Problem: Bitte erkläre nochmal in wenigen Worten, was im Spiel passieren soll. Nicht programmtechnisch, sondern im Spiel. Ich habe nämlich grad die Vermutung, dass viel zu kompliziert denkst.
  • Befindest du dich im Kollisions-event, kannst du auf Objektvariablen des kollidierten Objekts über other.variable zugreifen.
    Ich denke das sollte dein Problem in etwa beheben oder?

    grüße
    naibaf77

    //edit:
    Demnach kannst du ganz leicht auf die einzelnen Werte zugreifen und verändern ohne für jedes Objekt einen eigenen "Block" einzurichten.
    True story!
  • Danke für die Antworten erstmal :).
    Also was ich derzeit versuche ist eigentlich nur, dass bei einer Kollision von zwei Objekten eine Schadensberechnung stattfinden kann, undzwar sollen dafür beide Objekte ihre Werte aus dem globalen Variablenspeicher benutzen. (Da ich diese globalen Werte besser durch Effekte etc. bedingen kann)

    Das mit "other" in einer Kollision habe ich versucht, stehe aber da vor dem Problem, dass beide Objekte mit " global.atk[1, index] " damit die selben globalen variablen ansprechen würden. Die formel müsste stark vereinfacht so aussehen:

    (Sagen wir mal die lokal gespeicherte Indexzahl vom Verteidiger ist 2 und vom Angreifer ist 7)

    global.hp[player2, index]-=global.atk[player1, index]

    das soll also nach der "index"-abfrage dabei rauskommen:

    global.hp[player2, 2]-=global.atk[player1, 7]


    Da ich aber im selben Code mit "index" nicht zwei verschiedene lokale variablen ansprechen lassen kann, also sagen wir mal index(self) und index(other), stehe ich nun vor einem ernsten Problem. =/
    Gibt es so eine Möglichkeit in einem Code in einer Kollision die Lokalen Variablen von zwei Objekten zu vermischen? :sauf:

    Hoffe es war nicht schon wieder zu kompliziert erklärt.. aber es ist irgendwie auch recht kompliziert :deal: .
  • Du denkst zu kompliziert. So wie ich das sehe, arbeitest du mit redundanten Variablen.

    Jede Instanz hat eine eigene Id. Lokale Variablen kannst du folglich mit id.variable referenzieren.
    Mit

    GML-Quellcode

    1. var i, ins;
    2. for(i=0;i<instance_number(objEnemy),i+=1) {
    3. ins = instance_find(objEnemy,i);
    4. ins.schaden = 100;
    5. }

    lassen sich dann alles durchgehen (ich hoffe, ich hab das ausm Kopf richtig gemacht).

    Überleg dir, ob du diesen Array wirklich brauchst. Dein Sinn für Ordnung mag dir vielleicht sagen, dass das ja schöner sei, aber den Game Maker machst du damit unnötig langsam.
  • Hmm.. jetzt habe ich leider meinen ganzen Code schon so aufgebaut =/. Ich könnte meinen Code zwar jetzt auf die "instance_number" umschreiben, aber die lokale Index-Variable ist bei mir quasi wie eine Art instance_number. Die erste Einheit erhält die Indexnummer 1, die zweite 2 etc. .
    Die Variablen werden bei mir wie folgt definiert:

    Am Anfang jedes Matches ist global.index[player1]=0.

    create:
    global.index[player1]+=1
    global.atk[player1, global.index]= 4
    global.def[player1, global.index]= 2
    global.hp[player1, global.index]=10
    index=global.index[player1]

    mouse enter:
    global.target[player1]=index

    left click:
    global.cast[player1]=index

    Ich könnte statt index also auch instance_number verwenden, aber mit einer Variablen bin ich denke ich flexibler. Aber die Schadensberechnung bereitet mir jetzt ganz schöne Schwierigkeiten.

    Gibt es keine Möglichkeit in einem Collisions-Code auf die lokalen Variablen beider Objekte zuzugreifen? x(

    Z.B.: index(self) und index(other)

    Dann könnte ich das ganz einfach so machen:
    global.hp[player2, index(other)]-=global.atk[player1, index(self)]



    Edit:

    Befindest du dich im Kollisions-event, kannst du auf Objektvariablen des kollidierten Objekts über other.variable zugreifen.
    Ich denke das sollte dein Problem in etwa beheben oder?


    Omg bin ich bescheuert.. . Meinte das zufällig naibaf77? xD
    Also geht quasi:
    global.hp[player2, index]-=global.atk[player1, other.index]

    Das wäre sehr schön o.o .

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

  • Ich habe die ganze Zeit deine erste Antwort gelesen und dachte mir: Hast du meinen Beitrag überlesen? :D
    Hatte gerade im Kopf, wie ich es erneut schreibe, damit du diesmal nicht drüberliest, da sehe ich deinen nächsten Beitrag :D

    Freut mich das es klappt,
    Grüße
    naibaf77
    True story!