Falsche Objekte beim Auslesen von ds_grid

  • GM 8

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

  • Falsche Objekte beim Auslesen von ds_grid

    Hallo, ich habe da ein Problem mit dem AUSLESEN eines Feldes, das mit ds_grid erstellt wurde. Zwar werden die Zeilen und Spalten richtig erkannt, aber der Inhalt der Felder, den er mir mitteilt, ist haarsträubend daneben. Aber ich finde den Fehler nicht...

    Es geht um ein Spielfeld mit 5x6 Feldern, die mit Zufalls-Blöcken à 64 Pixel gefüllt werden. Macht er auch anständig. Aber dann sollen die Felder ausgelesen werden.
    Das mache ich mit:

    Quellcode

    1. mx=round((mouse_x)/64)-1; my=round((mouse_y)/64)-1;
    2. global.pick= ds_grid_get(global.grid,mx,my);
    3. global.pickname=object_get_name(global.pick.object_index);


    Ich denke, es liegt an der letzten Zeile irgendwie, aber wenn ich das "global.pick" weglasse und nur object_get_name(object_index) schreibe, dann kann er das richtig auslesen - allerdings nur, wenn das aufrufende Objekt angesprochen ist. Ich muss aber auch die umliegenden Felder abfragen und dann klappt das nicht mehr.

    Beispiel, um das Feld rechts daneben auszulesen:

    Quellcode

    1. rechts_x=mx+1; rechts_y=my;
    2. global.feld1=ds_grid_get(global.grid,rechts_x,rechts_y);
    3. global.feld_rechts=object_get_name(global.feld1.object_index);


    ergibt den größt-möglichen Schwachsinn, z.T. Objekte, die gar nicht dem Grid sind! Da kommt alles Mögliche bei raus, nur nicht das richtige Objekt, teilweise steht da als Ergebnis sogar "undefined".

    Wer kann bitte helfen? Die Durchsicht der bisherigen Grid-Anfragen hat mir leider nicht weiterhelfen können.

    Gruß Archie
    Signatur? Ich überlege mir noch eine. Die besten sind ja schon alle vergeben... :para:

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

  • Hallo,
    das sollte doch einfach zu debuggen sein, z.B. mit system_message();...

    1. Du hast also verifiziert, dass mx und my korrekt sind? (Sieht ja auch korrekt aus.)
    2. Nach global.pick= ds_grid_get(global.grid,mx,my); könntest du erstmal prüfen, ob hier eine vernünfige Instanz-ID angekommen ist und danach ggf. auf global.pick != noone prüfen, bevor du damit arbeitest.
    3. In global.pickname=object_get_name(global,pick.object_index); gehört ein "." und kein "," zwischen global und pick. Wenn du hier nur object_index benutzt gibt es nur die Objekt-ID der Instanz zurück, von der aus du diesen Code aufgerufen hast - also absolut falsch.

    Hoffe das hilft dir weiter.
  • BadToxic schrieb:

    Hoffe das hilft dir weiter.


    Nee, das hilft mir absolut nicht weiter, denn Du hast das offenbar falsch verstanden. Ich habe weiß Gott kein Problem damit, herauszufinden, welche Objecte oder IDs angezeigt werden, sondern damit, dass Feld-Spalte und -Zeile korrekt sind, aber das angeblich dort befindliche Objekt nicht stimmt! Es muss also ein Fehler im Script sein. Und das Komma, das dort versehentlich statt einem Punkt steht, ist ein Tippfehler, sonst hätte mir der Compiler schon alles um die Ohren gehauen. Ich habe natürlich alles entfernt, was für dieses Problem nicht relevant ist.

    Weiß vielleicht jemand, wo genau der Fehler stecken könnte? Ich suche schon seit 3 Tagen ergebnislos...

    Archie
    Signatur? Ich überlege mir noch eine. Die besten sind ja schon alle vergeben... :para:
  • Danke für die Hinweise, aber auch das bringt mich alles nicht weiter. Ob es vielleicht daran liegt, dass alle Objekte ein parent haben? Aber ich will ja nicht das parent ermitteln, sondern das Objekt...

    Wie gesagt, die Koordinaten im Grid stimmen, das wird korrekt angesprungen - nur die Objekte, die da angezeigt werden, stimmen alle nicht...

    Das muss doch irgendeinen Grund haben.... *verzweifelt guck*

    Wie gesagt, hier wohl liegt der Fehler, im roten Bereich - aber warum??
    global.pickname=object_get_name(global.pick.object_index);

    Archie
    Signatur? Ich überlege mir noch eine. Die besten sind ja schon alle vergeben... :para:
  • Archie schrieb:

    Nee, das hilft mir absolut nicht weiter, denn Du hast das offenbar falsch verstanden.
    Ich glaube ja eher du hast meine Antwort nicht verstanden XD
    Und ich habe so die Vermutung, dass du den Unterschied zwischen Objekt und Instanz vielleicht nicht ganz richtig verstanden hast.

    Wenn wir dir helfen sollen, muss du uns zeigen, wie du die Instanzen in das Grid gespeichert hast.

    PS. Sorry dass ich zum Antworten manchmal so lange brauche...
    1. Dieser Code hier

      GML-Quellcode

      1. mx=round((mouse_x)/64)-1; my=round((mouse_y)/64)-1;
      ist schlecht. Wenn die Maus genau bei 0 ist, kriegst du negative Indizes. Benutze lieber floor(mouse_y/64).
    2. Wie du schon vermutest, sieht global.pick.object_index problematisch aus. Der GM ist afaik keine Programmiersprache, in der du einfach Namespaces durchlaufen kannst. Ich befürchte, dass der "." nur einmal pro Variable funktioniert. Lösungsansatz: Verabschiede dich von deinem global. Benutze lieber ein objMain oder objController, das sich um all diese Dinge kümmert. Globale Variablen sind eh unchic.
    3. Ich denke, du benutzt object_get_name nur für Debug-Zwecke, aber ich sag es trotzdem: Im normalen Spiel würde ich solche Funktionen nicht verwenden. Nimm lieber eine ds_map, die den object_index auf einen Namen mappt. Die Funktion ist schlicht schlechter Stil.