Verwendung von parents

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

    • Verwendung von parents

      Da mir aufgefallen ist, dass die wenigsten Leute parents in ihren Spielen verwenden, habe ich mich entschlossen, dieses kleine Tutorial zu schreiben, das die Verwendung von parents beschreibt. Es soll kein Text in der Art "so muss es gemacht werden" sein, sondern eher als kleine Hilfe wie es gehen könnte, gedacht sein.

      Was sind Parents?
      Ein parent-objet ist ein sehr hilfreiches Mittel in der objektorientierten Programmierung. Ein parent arbeitet so, dass alle seine Eigenschaften an ein/mehrere child-object(e) übergeben werden. Eine solche Verkettung ist in beliebiger Menge und Variation möglich, was erstaunlich einfache Programmierung möglich macht.

      Warum sollte man Parents verwenden?
      Parents bieten sich aus verschiedenen Gründen an. Einer der wichtigsten Gründe ist, das man einen Code der für mehrere objecte verwendet wird, nur einmal vorhanden ist. Dies vereinfacht es, den Code zu ändern, wenn Fehler vorhanden sein sollten. zuguterletzt spart dies Speicherplatz. Zwar sehr wenig, aber immerhin...

      Ich versteh nur Bahnhof...
      Beginnen wir also mit einem konkreten Beispiel. Als erstes erstellst du ein neues Spiel im Game Maker. Füge drei neue objecte hinzu und gib ihnen den die Namen "obj_ParentBall", "obj_BallRed" und "obj_BallGreen".
      Als nächstes füge dem parent-object "obj_ParentBall" einen draw-event hinzu, in das folgender Code kopiert wird:

      GML-Quellcode

      1. draw_set_color(color); // Farbe des Balls
      2. draw_circle(x,y,15,false); // Der Ball an sich

      Nun wenden wir und den beiden anderen objecten mit den Namen "obj_BallRed" und "obj_BallGreen" zu. Stelle für beide objecte das parent-object ein. Das geht sehr einfach, indem man in den "object properties" im Fensterchen Parent das entsprechende object auswählt.
      Erstelle in beiden objecten einen create-event und füge in das object "obj_BallRed" folgenden Code ein:

      GML-Quellcode

      1. color=c_red; // Farbe des Balls

      und in das object "obj_BallGreen" diesen code:

      GML-Quellcode

      1. color=c_green; // Farbe des Balls

      Nun erstelle einen Raum, verteile von den objecten "obj_BallRed" und "obj_BallGreen" einige im Raum und starte das Spiel. Man kann deutlich sehen, dass man nur mit einem create-event unterschiedliche Eigenschaften für objecte erzeugen kann.
      Als nächstes erstelle ein weiters object, das den Namen "obj_ParentControl" erhällt. Erstelle einen press-anykey-event und füge folgenden Code ein:

      GML-Quellcode

      1. speed=2;
      2. direction=random(360);

      Öffne nun das object "obj_ParentBall" und stelle hier als Parent "obj_ParentControl" ein. Starte das Spiel nocheinmal und drücke eine beliebige taste. Es bewegen sich beide Sorten von Bällen in zufällige Richtungen, obwohl man nur einen key-press event erstellt hat. Man könnte den event auch im object "obj_ParentBall" erstellen, aber ich wollte das beispiel der doppelten verkettung zeigen. Diese doppelte Verkettung wäre z.b. sinnvoll, wenn man noch weitere parents hätte, die ähnlich agieren, aber unterschiedlich aussehen sollen.

      Im Anhang ist nochmal das komplette Beispiel (für Game Maker 6.1) falls etwas nicht klappen sollte. Ich hoffe, das ich die Funktionsweise und den Vorteil von Parents einigermassen nahe bringen konnte. In professionellen Spielen ist es gang und gebe Parents zu verwenden, da das Arbeiten sonst einfach zu viel zu umständlich und zu unübersichtlich wäre.
      Dateien
      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
    • schön gemacht, allerdings habe ich dazu noch eine frage.

      ich habe zb. 3 objecte, einer davon ist der parrent der anderen. jeder braucht zb. 3 variablen (bei allen beiden gleich) und 2 die sich bei allen unterscheiden.
      also dachte ich mir follgendes:
      ich geben dem parrent object die 3 variablen die bei beiden gleich sind (im create event zugewiesen) und jedem der child objekte im create event 2 andere.
      was muss ich aber feststellen?
      wen parent und child objecte je ein gleiches event besitzen (zumindest ist es bei create, step, und draw so) kommt es zu konflikten. leider weiß ich jetzt nicht genau was überschrieben wurde bzw. ob überhaubt was ausgeführt wurde, da nix mehr ging.

      jemand ne ahnung woran das liegt, bzw. wie man das umgehen kan?
      :) Nobody is perfect (-:

      "Dummköpfe sind Denkerköpfen weit überlegen. Zahlenmäßig." Ernst Ferstl
    • Gutes Tutorial, obwohl ich schon alles wusste :D *prahl*

      @Nobody-86:
      Ein Child-Objekt übernimmt nur Events, die es selbst nicht hat, d.h. es führt in deinem Fall nur das eigene Create-Event aus.

      Dragoon
      int (*x(*x(int))[5])(int*);
      Confused? Yes, it's C!
    • Ein Child-Objekt übernimmt nur Events, die es selbst nicht hat, d.h. es führt in deinem Fall nur das eigene Create-Event aus.
      danke. kan man das irgentwie umgehen? bei mir sind es nächmlich nicht nur 2 oder 3 sondern ca. 20 variablen und ellenlange codes (in step- und draw-event) die ich sonst immer mehrmals schreiben müsste.
      :) Nobody is perfect (-:

      "Dummköpfe sind Denkerköpfen weit überlegen. Zahlenmäßig." Ernst Ferstl
    • Ein Hinweis sei noch zu geben:
      Vom Parent-Object werden keine Eigenschaften übernommen, die ihr in den Optionen des Objects einstellt. Wenn ihr euch über einen Parent z.B: sparen wollt jedem Object die depth -100 zuzuweisen, dann reicht es nicht, dies im Parent anzugeben - ihr könnt es stattdessen ins Create-Event des Parents schreiben.

      Eine andere große Stärke bieten bewusst inaktive Parents. Z.B. weisen wir allen spielbaren Objects den Parent objPlayer zu, obwohl dieses selber nie im Spiel benutzt wird. Wir könnten jetzt, wie WIN in ihrem Tutorial es gemacht hat, dem objPlayer sämtlichen Code einspeisen, den alle spielbaren Objects gemeinsam haben - aber schon ohne dieses Platzsparen haben wir einen genialen Vorteil:

      GML-Quellcode

      1. if position_meeting(x,y,objPlayer) then objPlayer.health -= 1;

      anstatt

      GML-Quellcode

      1. if position_meeting(x,y,objSoldier) then objPlayer.health -= 1;
      2. if position_meeting(x,y,objTank) then objPlayer.health -= 1;
      3. // ...

      oder auch bei normalen Collisionevents.
      Der Trick ist einfach, dass bei with statements oder Funktionen, die eine Object id brauchen (wie position_meeting) auch alle Kinder des Parents beachtet werden. Und diese Möglichkeit ist wohl viel mächtiger als bloßes Platzsparen beim Coden.
    • habe heute noch einen einschub gefunden.
      @ MewX:
      genau so wie du es gesagt hast verwende ich meinen parents am meisten, aber mir ist heute, wie gesagt noch was aufgefallen was ein negativer effekt ist.
      wen man nämlich

      GML-Quellcode

      1. collision_rectangle(x1,y1,x2,y2,obj_parent,false,true) then {
      2. //... code
      3. }
      dan mach es keinen unterschied ob man den "notme" parameter true oder false setzt. wen dem eigene objekt obj_parent als parent gesetzt worden ist.
      :) Nobody is perfect (-:

      "Dummköpfe sind Denkerköpfen weit überlegen. Zahlenmäßig." Ernst Ferstl