Vererbung funktioniert nicht richtig

  • Vererbung funktioniert nicht richtig

    Irgendwie scheint die Vererbung nicht so wie erwartet zu funktionieren.

    Ich habe ein Objekt oPlayer, welches ein Sprite und ein paar Membervariablen hat. Name und playerScore. Jetzt habe ich zwei weitere Objekte oPlayer1 und oPlayer2 erstellt und als Parent oPlayer angegeben.

    Weder das Sprite noch die Membervariablen sind jetzt zu sehen:

    Information about object: oPlayer1

    Sprite: <no sprite>
    Solid: false
    Visible: true
    Depth: 0
    Persistent: false
    Parent: oPlayer
    Mask: <same as sprite>
    Parent sieht so aus:

    Information about object: oPlayer

    Sprite: sprPlayerWhite
    Solid: false
    Visible: true
    Depth: 0
    Persistent: false
    Parent: <no parent>
    Mask: <same as sprite>

    Create Event:
    execute code:

    name = '';
    playerScore = 0;
    Warum ist das so? Funktioniert hier die Vererbung anders wie üblich?
    On teh internet u pwn noobs - but in real life noobs own you.
  • Wieso sollten in den Objektinformationen vererbte Events angezeigt werden? Alle Informationen, die oPlayer1 anzeigt (sprite, solid, visible, depth, persistent, parent, mask), werden auch nicht vererbt. Vererbt wird hingegen das Create Event, falls du deinem oPlayer1 nicht ein eigenes schreibst, das das von oPlayer ersetzt. Die Variablen name und playerscore werden schon angelegt, aber nicht in der Objektinformation angezeigt. Starte das Spiel einfach mal im Debug Modus und lass dir die Variablen beider Objekte anzeigen. Außerdem ist der Vorteil der Vererbung ja auch, dass andere Objekte oPlayer1 als oPlayer identifizieren können, d.h. du brauchst bei oEnemy nur eine KollisionsEvent mit oPlayer festzulegen, dann wird das auch bei Kollision mit oPlayer1 ausgelöst. Anscheinend hast du noch nicht ganz verstanden, wie Vererbung (im GM) funktioniert.

    Ausschnitt aus der Hilfe:
    Spoiler anzeigen
    Parents

    Oft sollen Objekte sich gleich verhalten und nur ein paar winzige Unterschiede besitzen. Beispielsweise soll sich ein Monster nach oben und unten bewegen und ein anderes nach links und rechts. Ansonsten Verhalten sie sich völlig gleich. In diesem Fall sollen alle Aktionen, bis auf 1 oder 2, gleich sein. Nun können wir wieder ein Objekt als Parent des anderen eintragen. Aber in diesem Fall bestimmen wir auch Ereignisse für die Kinder-Objekte. Diese Ereignisse "überschreiben" die Eltern-Ereignisse. Das bedeutet, das immer wenn ein Kind-Objekt ein Event besitzt, diese anstelle des Events des Eltern-Objektes ausgeführt wird. Wenn du auch das Eltern-Ereignis ausführen möchtest kannst du den "inherited" Event mit der entsprechenden Aktion benutzen.

    Es ist in solchen Fällen üblich, zuerst ein Basisobjekt zu erschaffen. Dieses Objekt enthält die Eigenschaften aber wird nie im Spiel benutzt. Alle aktuellen Objekte, haben dieses Basisobjekt als "parent-object". "Parent-objects" könnten selbst wiederum "parent-objects" haben und so weiter (Schleifen sind nicht erlaubt). Auf diese Weise kannst du eine Hierarchie aufbauen. Es ist höchst nützlich, dein Spiel strukturiert zu halten und ich kann dir nur wärmstens empfehlen, dir diesen Mechanismus zu eigen zu machen.

    Da gibt es noch eine zweite Möglichkeit "parent-objects" zu gebrauchen. Sie beinhaltet auch das Kollissionsverhalten für andere Objekte. Lass es mich an einem Beispiel erläutern. Angenommen, du hast 4 verschiedene Bodenobjekte. Wenn ein Ball den Boden berührt, soll er seine Bewegungsrichtung ändern. Dieses muss im "collision-event" vom Ball (Kollision Ball mit Boden) festgelegt werden. Weil da aber vier verschiedene Bodenobjekte sind, müsstest du vier verschiedene "collision-events" für ball festlegen. Wenn du jetzt aber ein Bodenobjekt zum "parent-object" der anderen Bodenobjekte machst, brauchst du nur einmal ein "collision-event" mit diesem "parent-object" machen - die anderen "erben" es ja. Diese anderen Kollisionen lösen ja das gleiche Ereignis aus. Hier sparst du eine Menge an Kopierarbeit.

    Wie aufgezeigt, wann immer du ein Objekt benutzt, beziehst du immer dessen Nachkommen mit ein. Das geschieht, wenn du in einer "action" festlegst, dass Anweisung für Instanzen eines bestimmten Objektes gelten. Es passiert auch, wenn du das with()-Statement im GML-Code (Script,GML-Segment) verwendest (siehe unten). Und es greift, wenn du Funktionen wie instance_position aufrufst. Schliesslich arbeitet dieses Prinzip auch, wenn du auf Variablen in anderen Objekten verweist. Um beim obigen Beispiel zu bleiben: Wenn du ball1.speed auf 10 setzt, gilt das auch für ball2, ball3 und ball4.
    Einige meiner Spiele:
  • Benutzer online 1

    1 Besucher