ObjectParent folgt einem Pfad | ObjectChild soll sich Lokal bewegen, leider geht es nicht

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

  • ObjectParent folgt einem Pfad | ObjectChild soll sich Lokal bewegen, leider geht es nicht

    Hallo Zusammen,

    Ich habe eine folgenden Konstellation:

    ObjectParent:
    Event "Create":
    1.Action Set a path for the instance.

    ObjectChild:
    Event "Step":
    1.Action Call the inherited event
    2.Action set direction and speed of motion (random360)
    3. Action Set moving in a direction (randomalldirections)

    Nun zu meinem Problem:
    Das ObjectParent übergibt artig den Pfad an das ObjectChild,
    leider wird beim Step-Event Action 2 und 3 ignoriert, nun finde ich keine Lösung wie ich es am besten bewerkstelligen kann das der Pfad weiter abgelaufen werden kann und trotzdem "lokal" das ObjectChild eine random bewegungen erhält, wisst ihr vielleicht eine Lösung?
    Vielleicht versuche ich hier auch unmögliche Dinge dann freue ich mich auf einen alternativen Lösungsvorschlag.

    Diese Grafik zeigt wie ich es mir vorstelle.

  • könntest ja folgendes probieren, hab es selber nicht getestet:

    im parent.create definierst du zusätlich t=0:

    und im child.step

    Quellcode

    1. if t=0
    2. {
    3. for ( i = 0; i < path_get_number(path); i++)
    4. {
    5. xx = path_get_point_x(path, i) + random_range(-20,20);
    6. yy= path_get_point_y(path, i) + random_range(-20,20);
    7. path_change_point(path, i, xx, yy, random_range(5,10);
    8. }
    9. t++;
    10. }
    Alles anzeigen


    Der Code geht einmal durch alle Punkte von deinem Path und ändert die Koordinaten um +-20 und setzt die geschwindigkeit auf einen zufälligen wert zwischen 5 und 10.

    Hoffe mal es klappt oder du kannst wenigstens die Idee dahinter verwenden.
  • Wenn du das create Event erstellst wird das nicht vom Parent übernommen.
    Edit: schon jemand vor mir gewesen :D
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe
  • Hallo Midrael,

    vielen dank für deine Anregung und den Code. Leider bekomme ich einen Fatalerror dieser ist:

    FATAL ERROR in
    action number 1
    of Step Event0
    for objectchild:

    Push :: Execution Error - Variable Get 100000.path(100002, -2147483648)
    at gml_Object_child_StepNormalEvent_1 (line 3) - for ( i = 0; i < path_get_number(path); i++)

    Da ich erst in dem Anfängen von Gamemaker bin sagt mir das alles nicht so viel.
    dieser Bereich scheint aber nicht ganz korrekt zu sein:
    for ( i = 0; i < path_get_number(path); i++)

    dazu Frage ich mich warum die Pfadnummer benötigt wird?
    Wie bekomme ich denn deinen Code zum laufen?


    @Husi012,
    das Create Event beim Parent funkitioniert aber die "Lokale" Bewegung im Child nicht.
  • Zu anfangs sind die Errors von gm echt verwirrend. Ich nenne den immer Get-Error. Du benutzt eine Variable, die der nicht kennt.
    In diesem Fall "path"
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe
  • Push :: Execution Error - Variable Get 100000.path(100002, -2147483648)


    Variable Get ist ein Fehler den du bekommst, wenn GameMaker eine Variable nicht findet.
    In diesem Fall findet GameMaker die Variable Path nicht. Mit der Variable Path meinte ich den Namen mit dem du deinen Path definiert hast. Im Create dürftest du das ja gemacht haben. Tausche einfach Path in meinem Code gegen den Path-Namen in deinem Code aus.

    Quellcode

    1. for ( i = 0; i < path_get_number(path); i++)


    Ein Path besteht ja aus verschiedenen einzelnen Punkten, die abgefahren werden. mit der Funktion path_get_number(path) bekommst du die Anzahl der Punkte des Pfades. Das (path) steht hier wieder für den namen deines pfades, du musst ihn also austauschen.

    Wenn du die Namen der Variablen ausgetauscht hast, müsste der Code laufen.
  • Bei mir klappts:

    hier mein Code:
    Objekt Pathfinder_Parent:
    Create:

    Quellcode

    1. path=path0
    2. t=0;
    3. speed=5;
    4. path_start(path, speed, path_action_restart, 0);​


    Objekt Pathfinder:
    Step:

    Quellcode

    1. if t=0
    2. {
    3. for ( i = 0; i < path_get_number(path); i++)
    4. {
    5. xx = path_get_point_x(path, i) + random_range(-20,20);
    6. yy= path_get_point_y(path, i) + random_range(-20,20);
    7. path_change_point(path, i, xx, yy, 100);
    8. }
    9. t++;
    10. }​
  • Nach einiger Verzweiflung habe es so halb zum laufen bekommen in dem ich bei dem Step Event nicht den Code "if t=0 " eingebe... dann zittert ObjectChild irgendwann total freaky aus dem Bildschirm.

    Ich versteh auch nicht ganz das es bei dir läuft da t=0 immer nur funktioniert wenn das Object in der Create Phase ist, d.h. im Step kann der Code doch nicht mehr ausgeführt werden da t nicht mehr 0 ist ?!?
  • Nach einiger Verzweiflung habe es so halb zum laufen bekommen in dem ich bei dem Step Event nicht den Code "if t=0 " eingebe... dann zittert ObjectChild irgendwann total freaky aus dem Bildschirm.


    ja, wenn du das tust, werden ja permanent die koordinaten des pfades verändert, und das jede sekunde mehrfach (halt jeden step einmal). das dann nichts mehr funktioniert ist klar. guck dir nochmal meinen code an und versuche ihn zeile für zeile nachzuvollziehen. falls iwas unklar sein sollte, frag einfach.

    Ich versteh auch nicht ganz das es bei dir läuft da t=0 immer nur funktioniert wenn das Object in der Create Phase ist, d.h. im Step kann der Code doch nicht mehr ausgeführt werden da t nicht mehr 0 ist ?!?


    ja, der Code wird nur einmal ausgeführt. Und er verändert nur ein einziges mal alle koordinaten um einen zufälligen wert. wahrscheinlich möchtest du das objekt nach jedem durchlauf einen neuen, leicht veränderten pfad erhält.
    hab jetzt den code angepasst. er ändert nach jedem durchlauf die koordinaten.

    Objekt Pathfinder_Parent:
    Create:

    Quellcode

    1. path=path0
    2. geschw=5;
    3. abweichung=20;
    4. path_start(path, geschw, path_action_stop, 0);
    5. for ( i = 0; i < path_get_number(path); i++) //speichert die ursprünglichen werte des pathes
    6. {
    7. x_original[i] = path_get_point_x(path, i)
    8. y_original[i]= path_get_point_y(path, i)
    9. }

    Objekt Pathfinder:
    Step:

    Quellcode

    1. if path_position == 1
    2. {
    3. for ( i = 0; i < path_get_number(path); i++)
    4. {
    5. xx = x_original[i] + random_range(-abweichung,abweichung);
    6. yy = y_original[i] + random_range(-abweichung,abweichung);
    7. path_change_point(path, i, xx, yy, 100);
    8. }
    9. path_start(path, geschw, path_action_stop, 0)
    10. }
  • Deiner erster Satz ist genau das was ich möchte, ich will permanent die Koordinaten ändern und das mehrfach pro Sekunde. Das was du mir bis jetzt gezeigt hast ist eine Koordinatenänderung für jeden Durchlauf oder einmal beim Erstellen des Objektes. (Was ich nebenbei auch ganz interessant finde :) )

    Ich versuch nochmal die Frage verständlicher zu stellen:

    1. Ich habe ein Grundobject dieses folgt einem Pfad.

    2. Nun erstelle ich ein Childobjekt was die Pfadbewegung des Grundobjektes übernehmen soll
    3. "zusätzlich!" soll in jedem Step eine lokale Bewegung per Zufall in alle Himmelsrichtungen erstellt werden.

    Damit meine ich das die "Hauptbewegung" immer dem Pfad folgt aber in einem Radius von 20 Pixel das Object aus der Pfadverfolgung "ausbricht" und das passiert am besten mehrfach in der Sekunde oder wenn man es einstellen kann per Zufall.
  • 3. "zusätzlich!" soll in jedem Step eine lokale Bewegung per Zufall in alle Himmelsrichtungen erstellt werden.


    aber das würde dazu führen, das dein objekt fast unkontrolliert herrum ruckeln würde, da es jeden step in eine andere richtung gehen würde.
    für welchen zewck brauchst du denn so einen path? dann kann ich vlt besser nachvollziehen was genau du versuchst zu programmieren.
  • Ja aber wie du schon sagst "fast" unkontrolliert, da das Elternobjekt ja einem Pfad folgt.
    Das benötige ich weil ich testen möchte ob Haustiere aktiv auf diese Bewegungen reagieren und wenn ja wie man das weiter ausbauen kann und wenn nein was verbessert werden müsste damit diese reagieren. Gleich vorweg, nur auf eine Pfadbewegung reagieren Tiere eher nicht daher möchte ich etwas zufälliges einbauen.
  • Ein Haustier was dem Spieler folgt?

    Würde ich so machen:

    1. Es folgt dem Pfad des Spielers leicht versetzt hinter ihm. Ohne Ruckeln / Random bewegungen

    2. Sobald der Spieler stehen bleibt, bleibt das Haustier auch stehen. Ein Timer läuft an.

    3. Solange der Spieler steht - und nach einer gewissen Zeit - wird das Haustier gelangweilt und läuft "Random" 2- 4 Felder hinter dem Spieler hin und her. Erkundet quasi die Umgebung.

    4. Läuft der Spieler wieder los, läuft das Haustier dann wieder hinter her. Das kann es meiner Meinung nach auch direkt auf dem selben (leicht versetztem Pfad) tun ohne dann sich hin und her zu bewegen.

    So kenne ich persönlich das zb. Aus World of Warcraft. Auch in einem RPG Maker Spiel mein ich das schonmal so gesehen zu haben.

    Aber Technische Umsetzung... bin ich grad überfragt ;) Sitze noch in Arbeit vor Handy.
  • Was? Interessanter Gedanke! Passt nu überhaupt nicht in dieses Thema.

    Als Beispiel meine ich eine Katze (aus Fleisch und Blut und nicht digital) die sich mit einem Tablet beschäftigen kann.

    Daher war angedacht das sich ein Objekt auf einem bestimmten Pfad bewegt mit gelegentlichen Ausbrüchen der Pfadbewegung. Wow hätte nie gedacht das so viele Missverständnisse bei einer so einer einfachen/rein technischen Frage enstehen können.

    Leider scheint mir hier keiner helfen zu können, schade. Trotzdem danke für die versuchte Unterstützung.
  • Du kannst wenn du dem Object einen Pfad zuweist nicht mehr so einfach die koordinaten ändern sondern musst wenn; dann die Koordinaten des Pfads ändern mit path_add_point() oder path_change_point()

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
  • Hallii hallo..also ich hab das ganze Thema jetzt überflogen und es schien mir so als ob die einfachste sache hier vergessen wurde.
    Im Prinzip willst du ja nur einen Path haben dden du jeder Zeit ändern willst. Also das Ziel..gehe ich mal von aus.

    Ich würde es wie bei der RTS variante machen. Du erstellst einen Path im Ordner Path ohne irgend welche Punkte hinzu zufügen..(nur erstellen) und nennst ihn zb motion_path.

    Dann muss jeden Instance diesen weg nutzen und für sich selber manipulieren. ( wie jede Einheit in einem RTS Game)
    Dazu must du nur im Create-Event deiner Haustiere einen eigenen Pfad erstelle. zb

    GML-Quellcode

    1. way=path_duplicate(motion_path)


    Nun kannst du tausenden von Haustieren an xy schicken und kannst den Instance internen Path "way" nutzen...
    Zb

    GML-Quellcode

    1. mp_grid_path(mp_grid,way,x,y,xgoal,ygoal,1)


    Da du ja flexibel das haustier hinter her schicken willst must du nun einfach zufällige Ziel xy Koordinaten um den Haustierhalter machen (Player)

    Das ist imprinzip genau das selbe wie bei RTS games..dieses kurze example.

    Du must nur eine Methode aussuchen wie das Haustier laufen soll...
    Also auf einem Grid oder Frei. hat vor und nach teile.
    Meine Signatur hat kein Visum für das GM Forum erhalten.
  • @Aku_Ryou
    Moin moin, du scheinst das Problem verstanden zu haben "jubel"
    Okay, daher hatte ich gedacht das ich dieses Problem "lösen" könnte in dem ich einem leeren "Elternobjekt" den Pfad zuweise, und das "Kindobjekt" die Pfadbewegung erben lasse aber zusätzlich eine lokale Bewegung machen lasse, leider werden immer einer der Bewegungen überschrieben :( .
    Es scheint als würde das nicht gehen ohne direkt die vererbte Pfadbewegung zu "zerstören".
    Oder hast du vielleicht eine Möglichkeit die vererbte Pfadbewegung nicht anzutasten und trotzdem dem Childobjekt eine Bewegung zu geben?


    @x-sascha
    Moin moin,
    nicht ganz das was ich suche.
    Ich möchte in deinen Worten, eine Einheit auf einem festen Pfad laufen lasse aber! nicht so schnurstracks sondern mit gelegentlichen "ausbrüchen" in verschiedenen Richtungen. Falls ich dich falsch verstanden habe dann kannst du mir gerne falls es das gibt ein Link zu dem Tutorial oder Codeschnipsel geben wo ich sehe kann das es das ist was ich suche (deine zwei Schnipsel geben nur wieder wie man Automatische Pfade erstellt und darauf Objecte laufen lässt, auch interessant aber nicht das was ich brauche ^^).
  • Ok also dein Problem hab ich zwar verstanden. Evtl kannst du ja mal schnell ne PNG hochladen wo man mal ein Beispeilpfad des Tierhalters sieht und wie du dir zb einen Weg des Haustieres vorstellen würdest.
    Ich denke so eine Bildliche vorstellung kann da ganz hilfreich sein.
    :)
    Meine Signatur hat kein Visum für das GM Forum erhalten.
  • -_- in meinem ersten post zeig ich ein bild mit dem was ich will..... ich will kein tier und kein tierhalter.... es ist nicht umsonst im bereich technische fragen.

    wenn du html kannst kann ich dir meinen wunsch vielleicht so erklären:
    <div class=elternobject style=folge Pfad>
    <div class=childobject style=bewege dich chaotisch im bereich des elternobjects>
    <div>
    <div>

    wie du siehst sind es zwei objekte (Gamemakerbezeichnung) die ineinnander verschachtelt sind/ sein sollen und nicht zwei verschiedene "Einheiten" wie dein tier und tierhalter.

    Ich finde die Frage selbst ist klar zu verstehen, es scheint aber wohl keine lösung zu geben zumindest laut aussage von Aku_Ryou....