Kollision mit irgendeinem Objekt, aber herausfinden welches Objekt

  • GM 8
  • Kollision mit irgendeinem Objekt, aber herausfinden welches Objekt

    Hey,
    ich habe die Suche benutzt hier im Forum, ich habe die Hilfedatei durchstöbert, aber leider nichts passendes gefunden.
    Mein Problem ist nicht ganz einfach zu schilder, ich versuche es mal so einfach wie nur möglich:

    Mein Player läuft auf einer Map (nach oben, rechts, links, unten). Nun soll er zukünftig mit anderen Objekten interagieren können.
    Dazu müssen folgende Bedingungen erfüllt sein:
    Der Player steht vor dem Objekt und guckt in Richtung Objekt. Wie man es eben aus RPG's kennt.

    Ich habe nun eine globale Variable eingeführt, die jederzeit die Richtung des Players mit 1,2,3 und 4 wiedergibt, das funktioniert!

    Nun habe ich mir folgendes Prinzip überlegt:

    Je nach dem in welche Richtung der Player guckt, soll mit collision_point() überprüft werden, ob über, rechts, links oder unter dem Player ein Objekt ist.

    Nun mein Problem: Wenn diese Funktion "true" liefert, wie finde ich heraus, welches Objekt vor dem Spieler steht und wie kann ich in diesem kollidierten Objekt eine Variable auf 1 setzen?
    Die Methode other.variable geht ja nur im Kollision-Event, ich befinde mich ja aber im step-event.
    Und das Kollision-Event fällt für mich flach, da es im Spielverlauf vieeel zu vieeele Interaktionsobjekte geben wird.

    Ich hoffe ihr habt mein Problem verstanden :)
    Danke für die Hilfe :)
    naibaf77
    True story!
  • collision_point(x,y,obj,prec,notme) gibt nicht TRUE zurück:
    Die Funktion gibt die ID des Objektes zurück, mit dem eine Kollision statt findet, oder -1 falls nicht.
    collision_point(x,y,obj,prec,notme) This function tests whether at point (x,y) there is a collision with entities of object obj.
    [...]
    All these functions return either the id of one of the instances that collide, or they return a negative value when there is no collision.


    Und das Kollision-Event fällt für mich flach, da es im Spielverlauf vieeel zu vieeele Interaktionsobjekte geben wird.

    Erstell doch ein "Parent Object" für alle deine Interaktionsobjecte, die auf die Selbe art und weise ausgelöst werden.
    somit kannst du das :event_collision: Kollisions Event nutzen(dann funktioniert auch other.).
  • Ah okay, wäre dann eine if-abfrage überhaupt sinnvoll? wenn er -1 zurückgibt ohne kollision, wäre das dann ein false? oder ist das nur bei 0 ein false?

    Bzw wie kann ich von der ID jetzt auf das objekt schließen? kann ich per <id>.variable auf variablen von den Objekten zugreifen?

    Könnte ich das etwa so machen?

    GML-Quellcode

    1. var obj_ID = collision_point();
    2. obj_ID.variable = 1;



    grüße
    naibaf77
    True story!
  • Im grunde genommen schon, das ist wie wenn du auf Variablen von anderen Objekten zugreifst, nur eben nicht von der ersten instanz von diesem objekt sondern einer bestimten.
    Nur gibt der GM dir einen fehler aus wenn keine kollision statt findet, da dann deine ID -1 ist und es so ein Objekt nicht gibt:

    GML-Quellcode

    1. var collision_id;
    2. collision_id=collision_point(...)
    3. if (collision_id!=-1){
    4. collision_id.variable=value
    5. }


    PS:schau dir meinen vorherigen beitrag nochma an.
  • Okay, vielen Dank! Diese Kollisionen machen mich wahnsinnig :D Aber langsam verstehe ich das ganze System.

    Zum Skript:
    Das mit "-1" überprüfen gefällt mir sehr, werde ich morgen nach der Uni direkt mal testen, jetzt muss ich aber erstmal ins Bett ;)

    Zum "parent object":
    Wie genau stellst du dir das mit dem "parent object" vor?
    Wenn ich dann per other.variable auf das objekt zugreife, dann greife ich ja immer auf dasselbe zu, nicht auf das spezielle, was ich gern hätte? Oder was genau daran habe ich jetzt nicht verstanden?

    Vielen Dank schonmal, hat mir, wenns klappt, sehr weitergeholfen :)

    grüße
    naibaf77
    True story!
  • parent objekt bedeutet dass diese Objekte ein "Elternteil" haben. Alles was du mit diesen Elterteil anstellst passiert auch mit dem momentan Betroffenen Kind. Oder auch alle, je nach situation. du erstellst ein Objekt dieses nennst du beispielsweise NPC_parent_obj.
    Die Objekte mit denen du interagieren können sollst, müssen dieses Objekt als parent objekt definiert haben. dafür gibt es eine Funktion, aber du kannst es auch im objekt selber einstellen, direkt unter der Sprite auswahl.
    Das kollisions event ist dann eben mit dem NPC_parent_obj.

    >>Mit Parent objekten kenne ich mich aber nicht sonderlich gut aus, ich denke es müsste so gehen... Das muss man eben mal ausprobieren.
    das andere Funktioniert auf jeden fall.
  • Hey, danke nochmal für die Info. Das mit den "Parent Objects" habe ich jetzt noch nicht probiert, allerdings klappt es, wenn ich die Objekt-ID anspreche.
    Allerdings gibt die Funktion collision_point() bei mir nicht "-1" zurück, wenn kein Objekt kollidiert, sondern "-4".
    Ich habe meine if-Bedingung also in if(obj_id != -4) umändern müssen! Das ist aber komisch oder? Oder hat jemand dafür eine logische Erklärung?

    grüße
    naibaf77
    True story!
  • All these functions return either the id of one of the instances that collide, or they return a negative value when there is no collision.

    Da hatte ich mich selbst verlesen. Ich glaube rein theorethisch kann auch irgend etwas anderes als -4 herraus kommen.
    Ergo, Code umschreiben:

    GML-Quellcode

    1. if (objekt_id>0)
    2. {...}
  • Frag doch einfach ab, ob die Instanz existiert oder nicht. Lass den Game Maker mit den IDs da rumhantieren.

    GML-Quellcode

    1. if(instance_exists(obj_id)){
    2. //...zeugs...
    3. }

    Albert Einstein schrieb:

    Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.
  • Benutzer online 1

    1 Besucher