Parent im code ändern?

  • Win

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

  • Richtig, aber

    GML-Quellcode

    1. object_set_parent(ind,obj)
    geht. ind ist das Objekt, das du verändern willst, und obj das Objekt, das du als Parent benutzen willst. Steht übrigens in der Dokumentation, im Kapitel GML -> Objects.

    Edit: Oh. Kann das sein, dass die Funktion in Studio nicht mehr unterstützt wird?
    Das würde vom objekt-orientierten Standpunkt mehr Sinn ergeben, aber ist halt ne doofe Umgewöhnung, wenn man das aus den alten Versionen so gewohnt ist.
    Ein Workaround also, falls das nicht mehr geht:
    Pack die Verhaltensweisen, die du dem Objekt zuweisen willst, in verschiedene Skripte; gib dem Objekt eine Zustandsvariable, die aussagt "ich bin jetzt Objekttyp XYZ" und führ über ein switch-Statement an den nötigen Stellen die richtigen Skripte aus. Nur bei Kollisionsevents könnte das evtl. eklig werden.
  • Danke sehr irrenhaus habe fälschlicherweise in der "hilfe" unter Parent gesucht! :thumbsup:

    Edit = Scheint in Studio nicht mehr zu funktioniren? warum auch immer? Gibts noch ne andere möglichkeit ;(
    Wenn Frodo ein Hobbit ist,sind 8 Frodos dann ein Hobbyte? ?(

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

  • Edit: Oh. Kann das sein, dass die Funktion in Studio nicht mehr unterstützt wird?
    Das würde vom objekt-orientierten Standpunkt mehr Sinn ergeben, aber ist halt ne doofe Umgewöhnung, wenn man das aus den alten Versionen so gewohnt ist.
    Ein Workaround also, falls das nicht mehr geht:
    Pack die Verhaltensweisen, die du dem Objekt zuweisen willst, in verschiedene Skripte; gib dem Objekt eine Zustandsvariable, die aussagt "ich bin jetzt Objekttyp XYZ" und führ über ein switch-Statement an den nötigen Stellen die richtigen Skripte aus. Nur bei Kollisionsevents könnte das evtl. eklig werden.

    Habe sowas noch nie gemacht könnte des mir jemmand genauer erklären währe echt nett?

    Trotzdem schonmal danke an irrenhaus :thumbup:
    Wenn Frodo ein Hobbit ist,sind 8 Frodos dann ein Hobbyte? ?(
  • Die wesentliche Idee ist, dass du dir ein paar aussagekräftige globale Konstanten definierst (das ist eine in GM Studio eingebaute Funktion; die ist auch über ein Tastenkürzel erreichbar, an das ich mich grad nicht mehr erinner) und dann das Verhalten deines Objektes abhängig von diesen Konstanten änderst.
    Ein Beispiel in C:

    Quellcode

    1. // Hier werden die Konstanten definiert
    2. // (im GM ist das über ein Menü im Editor zu erreichen)
    3. typedef enum {
    4. BEHAVIOUR_DONT_MOVE=0,
    5. BEHAVIOUR_MOVE_LEFT=1,
    6. BEHAVIOUR_MOVE_RIGHT=2,
    7. BEHAVIOUR_MOVE_UP=3,
    8. BEHAVIOUR_MOVE_DOWN=4
    9. } MoveFlag_type;
    10. // Hier wird das aktuell gültige Verhalten bestimmt
    11. // (Im GM musst du logischerweise den Datentyp, den ich hier MoveFlag_type genannt habe,
    12. // nicht mit angeben)
    13. MoveFlag_type current_moveflag = BEHAVIOUR_DONT_MOVE;
    14. [noch ganz viel mehr code]
    15. // Und das ist das Step-Event, das prüft, welches Verhalten grade gilt.
    16. void Step_Event(){
    17. switch (current_moveflag){
    18. case BEHAVIOUR_MOVE_LEFT:
    19. [code zum nach links bewegen];
    20. break;
    21. case BEHAVIOUR_MOVE_RIGHT:
    22. [code zum nach rechts bewegen];
    23. break;
    24. [etc. etc.]
    25. }
    26. [noch mehr code, dem die move-flag egal ist]
    27. }
    Alles anzeigen


    In deinem Fall sind es halt "Objekttyp-Flags", wenn man sie so nennen will. Das einzig wichtige an der Sache ist, dass du ihnen auch Namen gibst, mit denen was anzufangen ist, und nicht einfach nur Zahlen reinschreibst, bei denen du beim späteren nochmal-draufgucken raten musst, was sie bedeuten.
    Was Kollisionsevents angeht, musst du dem Objekt, mit dem dein veränderbares Objekt kollidiert, Bescheid geben, was es tun soll. Die Idee dahinter ist ähnlich, nur dass du dabei abschätzen musst, in welchem der beiden Objekte dieses switch-Statement mehr Sinn macht und dann im Zweifelsfall mit dem Keyword other arbeiten musst. Es ist an sich genau das selbe Prinzip, nur mit einer anderen Umsetzung.
  • ich habe es jetzt nicht ganz verstanden aber ich habe glaube ich habe raus gelesen das funktioniert nur bei collisons events? wenn ja dann nützt mir das leider nichts !

    Weil ich es so haben muss=

    object1 folgt object2 nur wenn dieser den parent "enemy" hat.
    Und dass Problem währe dann das der parent eben in-game geändert werden muss!

    Aber trotzdem danke das dus versucht hast! :thumbsup:
    Wenn Frodo ein Hobbit ist,sind 8 Frodos dann ein Hobbyte? ?(
  • Da hast du was falsch rausgelesen. ^^
    Das funktioniert schon überall, es ist nur je nach Situation mal mehr, mal weniger schwierig. In deinem Fall ist es sogar sehr einfach, weil du deinem object1 jederzeit sagen kannst "hey, hier, ich bin jetzt dein Gegner". Da müsstest du sogar nicht mal groß mit Parents und Zustandsflags arbeiten; wenn das wirklich die einzige Unterscheidung ist, kannst du's auch einfach so machen:

    :event_create: (object2)

    GML-Quellcode

    1. hostile=false;
    2. // Diese Variable gibt an, ob ich ein Gegner von object1 bin


    :event_step: (object2)

    GML-Quellcode

    1. // viel viel code
    2. //irgendwann mal:
    3. hostile=true;
    4. if instance_exists(object1){
    5. ds_list_add(object1.follow_targets,id); // id, das bin ich
    6. // Damit bin ich jetzt auf der "Abschussliste" von object1
    7. }


    :event_create: (object1)

    GML-Quellcode

    1. follow_targets = ds_list_create();
    2. // hier speichere ich alle objekte, denen ich grad folgen kann
    3. // (das ist die Liste aus object2s Step-Event)


    :event_step: (object1)

    GML-Quellcode

    1. for(var i=0; i<ds_list_size(follow_targets); i++){
    2. var t = ds_list_find_value(follow_targets, i);
    3. // wir gehen die liste komplett durch und gucken uns jedes objekt darin einmal an
    4. // (gespeichert in der Variable t)
    5. if instance_exists(t){ // exisitert dieser gegner überhaupt noch?
    6. if (t.hostile){ // und ist er überhaupt ein gegner?
    7. // code zum verfolgen
    8. }
    9. }
    10. else
    11. continue; // überspring dieses objekt, es existiert ja nicht mehr
    12. }
    13. // Liste aufräumen, um unbenötigte object2s loszuwerden:
    14. for(var i = ds_list_size(follow_targets)-1; i>0; i--){
    15. var t = ds_list_find_value(follow_targets, i);
    16. // Wie in der ersten Schleife, nur gehen wir diesmal die Liste
    17. // vom Ende bis zum Anfang durch
    18. // (wenn man nämlich ein Element löscht, wird die Größe der Liste kleiner
    19. // - wenn man aufwärts zählt, landet man dann plötzlich hinter dem Ende der Liste)
    20. if not instance_exists(t){ // objekt ist tot, weg damit
    21. ds_list_delete(follow_targets,i);
    22. }
    23. else if not (t.hostile){ // objekt ist kein gegner mehr, weg damit
    24. ds_list_delete(follow_targets,i);
    25. }
    26. }
    Alles anzeigen


    Ich hab leider grade keinen GM zur Hand, deswegen kann ich meine Lösung leider nicht testen, sondern hab sie jetzt halt einfach aus dem Stegreif hingeklatscht - mag also sein, dass das nicht auf Anhieb im GM läuft, aber ist zumindest rübergekommen, was ich da mache? ^^
  • aber ist zumindest rübergekommen, was ich da mache? ^^

    einiger massen leider habe ich noch nie mit listen gearbeitet des wegen verstehe ich es noch nicht ganz!

    komischerweise funktioniert der "code zum folgen" nicht filt erkennst du ja was ich falsch gemacht habe es so gemacht! ich habe echt keine ahnung warum es nicht funktioniert aber das object1 spackt total rum!

    GML-Quellcode

    1. for(var i=0; i<ds_list_size(follow_targets); i++){
    2. var t = ds_list_find_value(follow_targets, i);
    3. if instance_exists(t){
    4. if (t.hostile)
    5. {
    6. mp_potential_step(t.x,t.y,5,false)
    7. }}
    8. else
    9. continue;
    10. }
    11. for(var i = ds_list_size(follow_targets)-1; i>0; i--){
    12. var t = ds_list_find_value(follow_targets, i);
    13. if !instance_exists(t){
    14. ds_list_delete(follow_targets,i);
    15. }
    16. else if not (t.hostile){
    17. ds_list_delete(follow_targets,i);
    18. }
    19. }
    Alles anzeigen


    Danke trotzdem!
    Wenn Frodo ein Hobbit ist,sind 8 Frodos dann ein Hobbyte? ?(
  • Ich denke das liegt daran, dass wenn du mehrer Instanzen hast, dass das Objekt1 versucht alle Instanzen auf einmal zu folgen. Um das for-Segment verlasen zu können, schreib nach dem mp_dinges ein "break;".
    Damit sagst du der Schleife, dass du raus willst und nicht weitere durchklauben möchtest. Laut deinem Code müsste dies in der Zeile 8 erfolgen.
    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Ergo: Je mehr Käse, desto weniger Käse.