Fehler "Unknown variable object_index" nach "instance_destroy()"

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

  • Fehler "Unknown variable object_index" nach "instance_destroy()"

    Ich arbeite an einem "Held gegen Monster"-Spiel, bei dem in jedem Step das Heldobjekt mit folgendem Code die vorhandenen Instanzen durchzählt:

    GML-Quellcode

    1. // Sichtkontakt prüfen
    2. for (i=0; i<instance_count; i+=1)
    3. {
    4. temp=instance_id[i];
    5. if (temp.object_index==obj_monster)
    6. {
    7. // Held in Sichtweite des Monsters?
    8. if (point_distance(x,y,temp.x,temp.y)<=temp.aktionsradius)
    9. {
    10. // Sichtlinie zum Monster frei?
    11. if not (collision_line(x,y,temp.x,temp.y,par_raum,0,0))
    12. {
    13. // Held im Blickfeld des Monsters?
    14. obj_monsterblick.x=temp.x;
    15. obj_monsterblick.y=temp.y;
    16. obj_monsterblick.image_angle=temp.direction;
    17. if (collision_line(x,y,temp.x,temp.y,obj_monsterblick,1,0))
    18. {
    19. // Kontakt bestätigt
    20. global.kontakt=true;
    21. }
    22. }
    23. }
    24. }
    25. }
    Alles anzeigen
    Der Code funktioniert prima und sorgt zuverlässig dafür, dass ein Monster den Helden entdeckt, wenn der Held in Sichtweite ist, eine unbehinderte Sichtlinie besteht und das Monster in Richtung des Helden schaut. So weit, so gut.

    Monster, die vom Spieler getroffen werden, zerstören sich selbst durch "instance_destroy()". Dies wird durch ein gesondertes Skript geregelt, welches die entsprechende Monsterinstanz aufruft. Es geschieht also nicht während der Durchführung der Schleife in obigem Skript und sollte deshalb keinen Einfluss auf dieses haben. Hat es aber - als Folge der Instanzzerstörung erhalte ich die Fehlermeldung:

    ERROR in
    action number 1
    of Step Event
    for object obj_held:

    In script [Name des obigen Skripts]:
    Error in code at line 8:

    if (temp.object_index==obj_monster)

    at position 15: Unknown variable object_index

    Offenbar löst das Löschen der Instanz den Fehler aus - "temp" scheint keine korrekte ID zu sein. Ich kann den Fehler zwar durch die Option "Treat uninitialized variables as value 0"-Option vertsuchen aber da ich kein Programmierstrolch bin, kommt diese Option nicht in Frage.

    Hat jemand eine Idee, wie ich das Problem lösen und meine Coderehre retten kann?
  • Hallo ,

    ich nehme an das der Ausslöser hierfür ist die For Schleife ist.
    Es ist so das dein Count noch gar nicht weiss das es ein Objekt wenig auf deinen Spielfeld gibt.

    Gib doch mal den Count aus dann weiss du mehr.

    Gruß Denis

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von djpercy ()

  • @Das Tier:
    Die Anzahl der "="-Zeichen ändert leider nichts, ich hab es grade mal ausprobiert. Zudem ist "==" hier auch vorgeschrieben, da es sich nicht um eine Zuweisung sondern um eine Vergleichsoperation handelt.

    @Denis:
    Ist "instance_count" nicht immer auf dem neuesten Stand? Deinem Hinweis folgend habe ich mir nun mal die Anzahl der Instanzen VOR dem Löschen und direkt NACH dem Löschen anzeigen lassen - und siehe da, "instance_count" hat sich NICHT verändert!

    Deshalb habe ich den Code verändert, indem ich "instance_count" um 1 verringere:

    Quellcode

    1. for (i=0; i<instance_count-1; i+=1)
    Geholfen hat es leider nicht, die Fehlermeldung bleibt. Ich werde mir die Sache morgen nochmal anschauen.

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von markusfabian ()

  • Die Schleife von 0 bis instance_count-1 sollte okay sein.
    Aber Du solltest vielleicht überprüfen, ob bei

    Quellcode

    1. temp=instance_id[i]
    etwas sinnvolles (>= 100000) rauskommt oder vielleicht ein special object "noone"...

    Quellcode

    1. for (i=0; i<instance_count; i+=1)
    2. {
    3. temp=instance_id[i];
    4. if (temp != noone)
    5. {
    6. if (temp.object_index==obj_monster)
    7. ...

    Da beide Skripte im gleichen Step ablaufen, weiß ich nicht, wann die instance_counts und instance_ids aktualisiert werden...
  • Original von Tommy
    Da beide Skripte im gleichen Step ablaufen, weiß ich nicht, wann die instance_counts und instance_ids aktualisiert werden...

    In der Help steht auch nichts konkretes dazu, aber du könntest es mithilfe von "instance_exists(obj)" überprüfen.

    Im übrigen wäre eine Schleife mithilfe von:
    "instance_number(obj)" und "instance_find(obj,n)" schneller, da andere Objekte nicht in der Schleife mit durchgearbeitet werden müssen.
  • "Begin Step" hat geholfen

    Vielen Dank für eure Hilfe - ich war ehrlich gesagt überrascht wie schnell & kompetent hier Antworten auftauchten, das ist nicht unbedingt üblich in Foren: Hut ab!

    Was mein Problem angeht, so habe ich zunächst Tommys Idee ausprobiert aber leider auch mit der "noone"-Prüfung den Fehler erhalten. Bevor ich nun noch Agnahims Variante ausprobiere (schneller ist beim Coden ja immer besser), habe ich meinen eigenes Verständnis der Materie nocheinmal hinterfragt und dem Helden absolute Priorität eingeräumt, indem ich ihm ein "Begin Step"-Event gegönnt habe. Und das scheint tatsächlich zu funktionieren, obwohl ich nicht ganz verstehe, warum.

    Ich bin bisher immer von der Annahme ausgegangen, dass alle Instanzen in der Reihenfolge ihrer ID (also 100aaa bis 100zzz) ihr Step-Event ausführen - und da steht das "obj-Held" mit der niedrigsten ID ungeschlagen an der Spitze. Offenbar gibt es noch eine andere Art der Nummerierung/Reihenfolge, die mir bisher entgangen ist.

    Sei´s drum - ich betrachte das Problem hiermit offiziell als gelöst :top: