gleiche Objekte als einzelne Einheiten identifizieren

  • GM 7

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

  • gleiche Objekte als einzelne Einheiten identifizieren

    Hallo erst mal Leuts,wie gehts so.War schon recht lange nicht mehr auf dieser Seite.Doch nun proge ich wieder mal an ein Game.Sry kann no nich sagen wie das Spiel heißt, aber es wird eine Art Raumschiff_Space_Shooter mit Rollenspiel Akzente.Ich habe schon einen kleinen Teil fertig doch nun möchte ich eine Lock on Waffe progen und natürlich die da zu benötigten Gegner xD.Doch ich habe gar keine Ahnung wie ich mehrere Gegner des gleichen Objekts einzeln identifizieren soll so das er nur zum Beispiel das am nächst liegende obj_gegner an lockt.Oder das sie alle eine eigene Var Leben haben.Ich habe schon auf google gesucht,doch zu faul auf englisch zu suchen.Ich vertraue nun doch nur dieses Forum.Somit schreie ich um hilfe.Und bedanke mich scho jetzt recht herzlich.Ich werde auch noch Bilder auf das Forum stezen aber erst wenn ich das mit den Gegner geklärt hab xD.

    (P.S.bin nicht so gut mit GML proge sonst nur mit Pascal(//klammer in na klammer xD ist eigenlich fast gleich),dafür kenne ich mich nicht mit id s aus )
  • Hi Inventor,

    du kannst im Create Event von deinem Gegner-Objekt eine Leben-Variable definieren:

    GML-Quellcode

    1. leben = 100;

    Und die ID des am nähesten gelegen Objekts kannst du mit diesem Code herausfinden:

    GML-Quellcode

    1. instance_nearest(obj_gegner);
    Beispiel Abfrage:

    GML-Quellcode

    1. with (instance_nearest(obj_gegner)) {
    2. // anlocken . . .
    3. };


    MfG,
    -fabse64
    fabse64 -> haiyyu
  • Danke erst mal für deine Hilfe fabse64, mit instance_nearest wollte ich es am anfang auch erst machen aber in meinem Spiel sind zu viel Faktoren,z.B.Will ich nicht nur das er einfach das am nächst liegenste Obj hollt ich habe dabei programiert das er in einer Entfernug von sagen wir mal 200 Pixel nur an locken kann.Hier das Beispiel beide codes befinden sich im Step von obj_gegner,und wenn obj_ship na genug an obj_gegner ist wird dies durch ein Indikator obj angezeigt.

    GML-Quellcode

    1. if point_distance(x,y,obj_ship.x,obj_ship.y) < global.linkdistance then
    2. linkind=1
    3. else
    4. linkind=0

    GML-Quellcode

    1. if linkind = 1 then
    2. instance_create(obj_monster.x,obj_monster.y,obj_lockind)


    Das geht auch so lange ich ein obj_gegner habe,bei mehreren geht es nur beim ersten obj_gener.
  • Das besprochene Problem habe ich gelöst,war so einfach,hab was kleines falsch gemacht :P .Trotzdem würde ich mich darauf freuen wenn jemand mir das mit den ID s erklären würde.

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

  • Alles im GM läuft über Ids. Für jeden Typ wird einzeln gezählt und es wird immer bei 0 angefangen. Einzeln gezählt werden z.B.:
    • Sprites
    • Scripts
    • Objects
    • Rooms
    • Sounds
    • Particle Systems
    • DS Lists
    • DS Grids
    • (...)

    Mit "einzeln gezählt" ist gemeint, dass es sowohl ein Object mit der Id 0 als auch einen Sprite mit der Id 0 geben kann.

    Wenn du z.B. ein neues Object erstellst, kriegst dieses ja immer einen vordefenierten Namen. Ironischerweise ist die Nummer dahinter auch gleich die tatsächliche Id des Objects.
    Das kannst du bei object0 z.B. so feststellen:

    GML-Quellcode

    1. with (0) instance_destroy();

    Wie erwartet werden nun alle Instanzen von object0 gelöscht. Die "Namen" der Objects in deinem GML-Code dienen nur als Verlinkung auf die eigentliche Id (deshalb gibt es auch gerne Probleme, wenn du zwei Spiele per "Merge" zusammenführst).


    Jetzt sollte klar sein, wie du Objects auseinander halten kannst. Viele Funktionen oder auch "with" können mit einer Object-Id als Argument ausgeführt werden und gelten dann entsprechend für alle Instanzen dieses Objects.
    Alternativ nehmen diese Funktionen (bzw. "with") aber auch Instance-Ids als Parameter.
    Die erste Instanz, die in einem Spiel erstellt wird, trägt auch nicht die Nummer 0 sondern mit 100000irgendwas (auf diese Weise gibt es keine Verwechslungen mit Objects). Diese Id kriegst du mit der lokalen Variable "id" (oder auch "self", wenn mich nicht alles täuscht) raus (im Gegensatz zu "object_index", welche die Object-Id wiedergibt.

    Das Schlüsselwort "other" innerhalb eines Kollisions-Events oder with-Statements gibt die Id der anderen Instanz wieder. Z.B:
    Kollision:

    GML-Quellcode

    1. speed = 0; // eigene Instanz wird gestoppt
    2. other.speed = 0; // andere Instanz wird gestoppt

    with-Statement:

    GML-Quellcode

    1. with (objPlayer) speed = other.speed; // Der speed von objPlayer wird auf den speed der Instanz gesetzt, von der aus with aufgerufen wird

    Wenn du übrigens mit with (other) arbeitest, gibt das Schlüsselwort other innerhalb des Statements entsprechend die andere Id wieder.


    Ich hoffe, das klärt deine Verständnisfragen.
    Eine Anmerkung noch: Der GM füllt keine Lücken. Wenn du also Object 12 löschst und ein neues erstellst, wird dies nicht die Id 12 kriegen, sondern die des Objects mit der höchsten Id plus 1.
  • Hmmm, man kann auch anstelle von "place_meeting" für Kollisionen "instance_place" nehmen, das gibt auch die ID zurück.
    Ansonsten kann man die ID noch mit den ganzen "collision_xxx" abfragen.
    Hier gibt es collision_line, collision_circle, collision_rectangle und ich glaube auch collision_ellipse aber da hilft die Hilfe.

    Wenn ich mich nicht irre geben ausserdem auch alle Befehle die mit "instance_" (s.o. "instance_place") die ID zurück.
    So far, Schattenphoenix~
    _____________________________________________________________________________
    "Who needs a stairway to heaven...
    If there is an elevator to hell... ?
    "
    - Vergessen
    "Auch ein perfektes Chaos ist etwas vollkommenes."
    - Jean Genet
  • um z.B. jede instanz eines Objektes ansprechen zu können kannst du folgendes Benutzen:

    GML-Quellcode

    1. for(i=0; i<instance_number(obj); i+=1) {
    2. ins = instance_find(obj, i);
    3. }


    damit würdest du alle instanzen des obj in der for schleife ansprechen können, nacheinander. Dann kann man z.B. bedingungen schreiben wie ob jede einzelne Instanz nah genug ist etc.
  • Oder du kannst alternativ auch

    GML-Quellcode

    1. with(obj)
    2. {
    3. if(point_distance(x1,y1,x2,y2)<maxdis)
    4. {do this and that;}
    5. }
    So far, Schattenphoenix~
    _____________________________________________________________________________
    "Who needs a stairway to heaven...
    If there is an elevator to hell... ?
    "
    - Vergessen
    "Auch ein perfektes Chaos ist etwas vollkommenes."
    - Jean Genet
  • Danke für die Hilfe, nur checke ich das nicht mit den Id's.Nach dem lesen euerer Tipps,komme ich mir net schlauer vor,was ich grundsätzlich wissen will ist nicht wie ich alle Instanzen eines Objekts ansprechen kann, sonder wie ich sie unterscheiden kann,z.B.wenn ich jetzt 5 Gegner des gleichen Typs (also gleiches obj_gegner) auf dem Feld hab,möchte ich das sie,vom obj_ship einzeln und nicht als ein und das selbe Objekt behandelt werden.Z.B. für zu progen das nur einer angelockt werden kann.
    Vielleicht helfen mir eure Tipps ja doch weiter hat nämlich schon was mit meinem Problem(en) zu tun :D :D .
    Ich setz mich mal dahinter und wenn ich es geraft hab sag ich euch das ,und wenn net geh ich euch weiter auf die Nerven xD.Mach nur Spass.Nee trotzdem Danke für die Mühe.Ihr seit die Größten.

    *Update*
    Also das mit den ID ist ganz gut hilft mir auch viel weiter aber ich habe immer noch das Problem das ich jedes Objekt lokale Var geben muss da sie sonst für jedes Objekt gelten,ist auch klar alles andere wäre dumm,aber ich wollte jetzt mal wissen ob man die lokalen Var von einer Instanz eines Objekts mit einem anderen Objekt aufrufen kann.Z.B. wenn die instanz mit der Id so und so seine lokale Variabel(also nicht global) hat die so und so heißt, unter sagen wir mal 0 ist mach dies und das .Das ist mein eigendliches Problem,wie kann ich Instanzen auseinander halten trotzdem aber ihre Var für andere Objekte benutzen.

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

  • Natürlich geht das. Du nimmst einfach die ID der Instanz. Beispielsweise:

    GML-Quellcode

    1. if (other) > 0
    2. {
    3. other.leben -= 1;
    4. //oder auch so:
    5. with (other)
    6. {
    7. leben -= 1;
    8. }
    9. }


    entweder du schreibst vor deine variable die id, oder du setzt mit dem with statement den code sozusagen in die andere instanz...
    PULSE

    Zweispieler [||||||||||]
    Einspieler [||||||||||]

    [Die Entgrater ist auf Eis gelegt]
  • Trompadon schrieb:

    Natürlich geht das. Du nimmst einfach die ID der Instanz. Beispielsweise:

    GML-Quellcode

    1. if (other) > 0
    2. {
    3. other.leben -= 1;
    4. //oder auch so:
    5. with (other)
    6. {
    7. leben -= 1;
    8. }
    9. }


    entweder du schreibst vor deine variable die id, oder du setzt mit dem with statement den code sozusagen in die andere instanz...
    Ausserdem kannst du anstelle von der ID auch eine Funktion benutzen, die die ID zurück gibt. Dazu bieten sich alle "collision_" Funktionen und alle Funtkionen mit "instance_" an.

    Viel erfolg ;)

    EDIT:

    Hier die Funktionen die ich spontan in der deutschen Hilfe auf gm-d finden konnte.

    !!!Achtung groß!!!

    Spoiler anzeigen
    instance_count* Anzahl der Instanzen, welche momentan im Raum sind.
    instance_id[0..n-1]* Die id der bestimmten Instanz. Wobei n die Nummer der Instanz ist. Beachte, dass die Position einer Instanz im Array sich bei jedem Schritt verändert, benutze deswegen nicht die Werte vorheriger Schritte.
    --------------------------
    instance_find(obj,n) Gibt die id der (n+1)ten Instanz des Objektes obj an. obj kann ein Objekt oder das Schlüsselwort "all" sein. Wenn es nicht existiert, wird das besondere Objekt "noone" zurückgegeben. Beachte, dass sich die Zuordnung wieder bei jedem Schritt verändert, deswegen benutze nicht die Werte vorheriger Schritte.
    instance_exists(obj) Gibt an, ob eine Instanz des Objektes obj existiert. obj kann ein Objekt, eine Instanz-ID oder das Schlüsselwort "all" sein.
    instance_number(obj) Gibt die Anzahl der Instanzen von Objekt obj an. obj kann ein Objekt oder das Schlüsselwort "all" sein.
    instance_position(x,y,obj) Gibt die ID der Instanz des Objektes obj an Position (x,y) an. Falls mehrere Instanzen an dieser Stelle sind, wird nur die erste gemeldet. obj kann ein Objekt oder das Schlüsselwort "all" sein. Wenn es nicht existiert, wird das spezielle Objekt "noone" zurückgegeben.
    instance_nearest(x,y,obj) Gibt die ID der Instanz von Objekt obj zurück, welche am nächsten am Punkt (x,y) ist. obj kann ein Objekt oder das Schlüsselwort "all" sein.
    instance_furthest(x,y,obj)Gibt die ID der Instanz von Objekt obj zurück, welche am weitesten vom Punkt (x,y) entfernt ist. obj kann ein Objekt oder das Schlüsselwort "all" sein.
    instance_place(x,y,obj) Gibt die ID der Instanz von Objekt obj an, welche getroffen wird, wenn die aktuelle Instanz an der Position (x.,y) gesetzt wird. obj kann ein Objekt oder das Schlüsselwort "all" sein. Wenn es nicht existiert, wird das besondere Objekt "noone" zurückgegeben.
    instance_create(x,y,obj) Erschafft eine Instanz des Objektes obj an der angegebenen Position (x,y). Die Funktion liefert die ID der neuen Instanz zurück.
    instance_copy(performevent) Erschafft eine Kopie der momentanen Instanz. Das Argument gibt an, ob das "creation event" ausgeführt wird für die Kopie. Die Funktion liefert die ID der neuen Kopie der Instanz.
    ------------------------
    collision_point(x,y,obj,prec,notme) Diese Funktion prüft, ob an Punkt (x,y) eine Kollision mit Instanzen des Objektes obj vorliegt.
    collision_rectangle(x1,y1,x2,y2,obj,prec,notme) Diese Funktion prüft, ob eine Kollision zwischen dem (gefüllten) Rechteck mit den angegebenen gegenüberliegenden Ecken und Instanzen des Objektes obj vorliegt. Beispielsweise kannst du sie verwenden, um zu prüfen, ob ein Gebiet frei von Hindernissen ist.
    collision_circle(xc,yc,radius,obj,prec,notme)Diese Funktion prüft, ob eine Kollision zwischen dem (gefüllten) Kreis mit Kreismittelpunkt an Position (xc,yc) mit gegebenem Radius und Instanzen des Objektes obj vorliegt. Beispielsweise kannst du damit überprüfen, ob ein Objekt dicht an einer bestimmten Stelle liegt.
    collision_ellipse(x1,y1,x2,y2,obj,prec,notme) Diese Funktion prüft, ob eine Kollision zwischen der (gefüllten) Ellipse mit den angegebenen gegenüberliegenden Ecken und Instanzen des Objektes obj besteht.
    collision_line(x1,y1,x2,y2,obj,prec,notme) Diese Funktion prüft, ob eine Kollision zwischen dem Liniensegment von (x1,y1) zu (x2,y2) und Instanzen des Objektes obj vorliegt. Dies ist eine mächtige Funktion. Du kannst sie beispielsweise benutzen, um zu prüfen, ob eine Instanz eine andere Instanz "sehen" kann, indem Du prüfst, ob das Liniensegment zwischen den beiden eine Wand schneidet.
    -------------------------

    Auch interessant ist dieses Code Beispiel aus der Hilfe:

    Lass mich ein Beispiel geben. Angenommen jede Einheit in deinem Spiel hat ein bestimmte Stärke (power) und du willst die stärkste ermitteln - verwende folgenden Programmcode:

    {
    maxid = -1;
    maxpower = 0;
    for (i=0; i<instance_count; i+=1)
    {
    iii = instance_id;
    if (iii.object_index == unit)
    {
    if (iii.power > maxpower)
    {maxid = iii; maxpower = iii.power;}
    }
    }
    }

    Nach der Schleife enthält maxid die id der Instanz mit der höchsten "power" (Stärke). (Vernichte keine Instanzen während eines solchen Schleifendurchlaufs, weil sie automatisch aus dem Array genommen werden und als Folge wirst du Instanzen überspringen).
    So far, Schattenphoenix~
    _____________________________________________________________________________
    "Who needs a stairway to heaven...
    If there is an elevator to hell... ?
    "
    - Vergessen
    "Auch ein perfektes Chaos ist etwas vollkommenes."
    - Jean Genet

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