Abfrage von Parents

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

  • Abfrage von Parents

    Mahlzeit,

    warum um Himmels Willen funktioniert die folgende Codefolge nicht? In einem Script wird ein Kampf berechnet, die getöteten Einheiten und die eigenen Verluste sollen gezählt werden und ich versuche es mit dem Code hier:

    GML-Quellcode

    1. if ( object_get_parent(Enemy) == ObjParent0 ) then
    2. {
    3. global.StatDeaths = global.StatDeaths + HitEnemy
    4. script_execute(ScrMessagesChange,"DEBUG: Deaths + " + HitEnemy)
    5. }
    6. if ( object_get_parent(Enemy) == ObjParent1 ) then
    7. {
    8. global.StatKills = global.StatKills + HitEnemy
    9. script_execute(ScrMessagesChange,"DEBUG: Kills + " + HitEnemy)
    10. }


    Ich habe zwei Objekte mit dem Parents ObjParent0 und ObjParent1 aufeiner gehetzt, zum Test habe ich in die eigens gebaute Meldungsanzeige Debugtexte eingefügt.

    Ergebniss: Keine Veränderungen der Variablen und keine Debugmessages.
    Fazit: Die Abfragen scheinen nicht zu stimmen.

    Weiß jemand weiter?

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

  • Porbier mal folgendes:

    GML-Quellcode

    1. ParentObject = object_get_parent(Enemy);
    2. if(ParentObject.object_index == ObjParent0) then
    3. {
    4. //bla bla yadda yadda ....
    5. }
    6. else
    7. if(ParentObject.object_index == ObjParent1) then
    8. {
    9. //another bla bla yadda yadda ....
    10. }


    wenns mehrere abfragen dieser art geben wird kannst du auch ein Switch statement statt den ifs benutzen.
    ...
  • Danke Shoba. Also, wenn ich im Debug-Modus nachschaue, dann bekomme ich bei

    GML-Quellcode

    1. object_get_parent(Enemy)


    24 heraus und bei

    GML-Quellcode

    1. object_get_parent(Enemy).object_index


    bekomme ich 0 heraus.
    Wenn ich deine Version ganz übernehme klappt es auch nicht.
  • Ist ja blöde... Das ist ja etwas, was ich nun überhaupt nicht verstehen kann. Ich habe es ersteinmal so gelöst indem ich die Parents als argument0 bei der Scriptausführung übermittle. Es muss aber über diese Abfragen funktionieren. Das verstehe ich echt ganz und garnicht.

    EDIT: Nach einigen Tests muss es an der Abfrage liegen. Ich will nur die Namen der Parents abfragen, keine Nummern, nur die Instanznamen, aber aus irgend einem Grunde will es nicht gehen.

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

  • Aber

    GML-Quellcode

    1. if ( object_get_parent(Enemy) == ObjParent0 ) then

    ist korrekt.
    object_get_parent gibt die id des Parents vom Objekt Enemy wieder, und ObjParent0 enthält die id. Wenn das Parent ObjParent0 ist müsste es gehen, in der Abfrage ist der Fehler jedenfalls nicht syntaktisch, könnte vielleicht am Objekt Enemy liegen. Gibst du den Parent direkt im Objekt an oder nachträglich?
    Achja, alle Instanzen eines Objektes haben dasselbe Parent, weil du, wie es oben scheint, am selben Objekt unterschiedliche Parents zu ermitteln versuchst.
    "Die Erde ist ein Irrenhaus. Dabei könnte das bis heute erreichte Wissen der Menschheit aus ihr ein Paradies machen. Dafür müsste die weltweite Gesellschaft allerdings zur Vernunft kommen."
    - Joseph Weizenbaum
  • Einheit1 (ObjParent0) nähert sich Einheit2 (ObjParent1), Einheit1 hat eine größere Reichweite als Einheit2. Einheit2 kommt in die Reichweite von Einheit1 und wird angegriffen. Die Angreifende Einheit1 führt Script ScrBattle aus, Einheit2 wird erkannt und zu Enemy gesetzt. Durch diverse Abfragen verliert dann Einheit2 einige Soldaten und das funktioniert auch. Lediglich die Parent abfrage nicht, was sehr sehr merkwürdig ist.
  • Okay, ich versteh jetzt nicht ganz wie du das meinst. Einheit1 hat als Parent ein Objekt namens ObjParent0, Einheit2 ObjParent1. In beiden Fällen müssen das Instanzen sein, sprich sie müssen genau so im Editor unter Objects zu finden sein. Wenn ObjParent0 z.b. ein Object des Typs ObjParent währe müßtest du überprüfen ob es ObjParent ist, nicht ObjParent0.
    ...
  • also ich hab mir den code nochmal genau angesehen. ich bin nicht ganz sicher, da ich den ganzen rest nicht kenne, aber ich glaube es wird immer das parent des ersten enemys, den du im raum platziert hast ausgegeben. und zwar weil "Enemy" zwar ein object ist, du aber eigendlich andere einzelne instancen davon abfragen willst.
    je nachdem, wo das skript ausgeführt wird, versuch es doch mal mit "self" bzw, geh den instancen-index durch.
    Battle Command - WeltraumEchtzeitStrategie | Meine GM Spiele auf Box.net
    GCM/FA/O d-(--)@>---xpu s-:- !a C++$@ U- P L+ E W++ N o K-- w++ O? M V PS PE-- Y PGP t 5 X R+++ tv+ b DI D G e+ h? r-- x
  • Es gibt kein Enemy, Enemy ist lokal und wird wie folgt bestimmt:

    Im Draw-Event wird ein Script ausgeführt. Codeschnippsel dafür:

    GML-Quellcode

    1. if ( distance_to_object(instance_nearest(x,y,argument0)) < Distance ) then
    2. {
    3. PosX = x
    4. PosY = y
    5. if ( not (sound_isplaying(BattleSound)) ) then
    6. {
    7. sound_play(BattleSound)
    8. }
    9. if ( Fighting != true ) then
    10. {
    11. Fighting = true
    12. Enemy = instance_nearest(x,y,argument0)
    13. alarm[0] = AttackSpeed
    14. }
    15. }
    Alles anzeigen


    Dann zeige ich euch, zwar ungerne, folgendes Script, welchen beim Alarm 0 aktiviert wird:

    GML-Quellcode

    1. if ( Fighting = true ) then
    2. {
    3. HitEnemy = (Attack * 10 * Size / 1000 / Enemy.Defence div 1)
    4. Enemy.Size = Enemy.Size - HitEnemy
    5. ParentObject = object_get_parent(Enemy);
    6. if ( argument0 == ObjParent0 ) then
    7. {
    8. global.StatDeaths = global.StatDeaths + HitEnemy
    9. }
    10. if ( argument0 == ObjParent1 ) then
    11. {
    12. global.StatKills = global.StatKills + HitEnemy
    13. }
    14. if ( Size < 1 ) then
    15. {
    16. instance_destroy()
    17. Enemy.Fighting = false
    18. Fighting = false
    19. sound_play(SndSwordEnd)
    20. }
    21. if ( Enemy.Size < 1 ) then
    22. {
    23. Enemy.Fighting = false
    24. Fighting = false
    25. }
    26. }
    Alles anzeigen


    Findet denn jetzt jemand den Fehler? Also, entweder bin ich blind oder ich habe mal wieder Programmier-Dummheit im Kopf und es fallen mal wieder kleine und große Fehler die eigentlich nie passieren dürften...
  • object_get_parent(Enemy); gibt den Parent des Objektes Enemy zurück. Enemy wird aber eine Instanz-ID zugewiesen, das passt ja nicht zusammen.

    Versuch es mal so

    GML-Quellcode

    1. object_get_parent(Enemy.object_index)
    "Die Erde ist ein Irrenhaus. Dabei könnte das bis heute erreichte Wissen der Menschheit aus ihr ein Paradies machen. Dafür müsste die weltweite Gesellschaft allerdings zur Vernunft kommen."
    - Joseph Weizenbaum