Im ersten Beitrag dieser Serie haben wir diskutiert, warum objektorientierte Programmierung (OOP) für die Entwicklung von Spielen hilfreich ist, und wir haben gelernt, Objekte, ihren Status und ihr Verhalten zu identifizieren. In diesem Artikel betrachten wir das spezifische OOP-Prinzip von Zusammenhalt und wie es für Spiele gilt.
Hinweis: Obwohl dieses Tutorial mit Java geschrieben wurde, sollten Sie in der Lage sein, in fast jeder Spieleentwicklungsumgebung dieselben Techniken und Konzepte anzuwenden.
Kohäsion ist das Prinzip, eine Sache gut zu sein oder zu tun. Kohäsion bedeutet also, Code zusammenzufassen, der zu einer einzelnen Aufgabe beiträgt.
Ein großartiges nicht-programmierendes Beispiel dieses Prinzips wurde in einem der ersten Spielartikel mit Artikeln über die Covert Action Rule behandelt:
Versuchen Sie nicht, zu viele Spiele in einem Paket zu machen. Einzeln könnten diese Spiele gute Spiele sein. Zusammen kämpften sie miteinander.
Die gleiche Regel gilt für die objektorientierte Programmierung. Jedes Objekt sollte nur eine Verantwortung haben. Jedes Verhalten dieses Objekts sollte nur eine Aufgabe ausführen. Mehr als das und es wird viel schwieriger, Änderungen am Code vorzunehmen.
Code, der nach Funktionalität organisiert ist und nur eine Aufgabe erfüllt, soll angegeben werden hoher Zusammenhalt. Code mit hoher Kohäsion ist wiederverwendbar, einfach und leicht verständlich. Es erstellt auch Objekte, die klein und fokussiert sind.
Code, der willkürlich organisiert ist und mehrere Aufgaben hat, soll es haben niedriger Zusammenhalt. Ein solcher Code ist schwer zu verstehen, zu verwalten und wiederzuverwenden, und er ist oft komplex. Es werden auch Objekte erstellt, die groß und unscharf sind.
Eine hohe Kohäsion ist im Allgemeinen gut, während eine niedrige Kohäsion im Allgemeinen schlecht ist. Achten Sie beim Schreiben von Code stets darauf, stark zusammenhängenden Code zu schreiben.
Wie können wir das also auf die objektorientierte Programmierung anwenden? Nun, für Anfänger hilft das Organisieren von Code in Objekten, den Zusammenhalt des Spiels im Allgemeinen zu erhöhen. Jedes einzelne Objekt sollte jedoch auch eine hohe Kohäsion aufweisen. Lassen Sie uns auf unsere drei Beispiele zurückgreifen, um zu sehen, wie dies funktioniert.
Erinnern Sie sich an den letzten Artikel, dass wir das Schiffsobjekt als Verhalten beim Drehen, Bewegen und Abschießen definiert haben.
Wenn wir ein einziges Stück Code schreiben würden, das alle drei Verhaltensweisen auf einmal ausführte, würde das ziemlich chaotisch werden. Stattdessen sollten wir jedes Verhalten in so genannte Funktionen unterteilen. Mithilfe von Funktionen können Funktionen getrennt und ähnlicher Code zusammen gruppiert werden, wodurch ein sehr zusammenhängender Code erstellt wird.
Bei der Programmierung wird ein Objekt durch Erstellen einer Klasse definiert. In Java wird eine Klasse wie folgt codiert:
/ ** * Die Schiffsklasse * / public-Klasse Schiff / ** * -Funktion - Führt das Verhalten (Aufgabe) beim Drehen des Schiffs * / public void rotate () // Code aus, der das Schiff dreht / ** * -Funktion - führt das Verhalten (Aufgabe) des Verschiebens des Schiffes * / public void move () // Code, der das Schiff bewegt / ** * Funktion - führt das Verhalten (Aufgabe) des Abfeuerns der Schiffswaffe * / public void fire ( ) // Code, mit dem das Schiff eine Kugel abfeuern lässt
Wie Sie sehen, erhält jedes Verhalten eine eigene Funktion, und der Code ist nur in dieser Skelettstruktur gut organisiert.
Machen Sie sich noch nicht zu viele Gedanken über die genaue Syntax. Wir werden das ausführlicher besprechen, wenn wir in der Serie weiter vorankommen.Erinnern Sie sich für Tetris, dass das Verhalten eines Tetrominos abfällt, sich (seitwärts) bewegt und rotiert. Die grundlegende Klassenstruktur sieht wie folgt aus:
/ ** * Die Tetromino-Klasse * / public Klasse Tetromino / ** * Funktion - Aktualisieren der Position eines Tetrominos * / public void fall () // Code, der die Position des Tetromino aktualisiert / ** * Funktion - Tetromino verschieben * / public void move () // Code, der den Tetromino seitwärts verschiebt / ** * Funktion - Tetromino drehen * / public void rotate () // Code, der den Tetromino um 90 Grad dreht
Wieder sind die Verhaltensweisen in ihre eigenen Funktionen unterteilt. Für die fallen
Beachten Sie jedoch, dass die Aufgabe darin besteht, die Position des Tetrominos zu aktualisieren. Dies liegt daran, dass der Tetromino immer fällt, und wir können die Aufgabe nicht einfach "den Tetromino fallen lassen" machen..
Stattdessen bewegt sich ein fallender Tetromino nur um eine bestimmte Anzahl von Zeilen auf dem Bildschirm nach unten - daher müssen wir die Position des Tetromino aktualisieren, um diese fallende Geschwindigkeit wiederzugeben.
Für das Geisterobjekt mit dem Verhalten, sich zu bewegen und den Status zu ändern, müssen wir ein wenig mehr Arbeit tun, damit es sehr zusammenhängend wird.
/ ** * Die Ghost-Klasse * / public class Ghost / ** * Funktion - verschiebt den Ghost * / public void move () // Code, der den Geist in die aktuelle Richtung bewegt / ** * Funktion - Geist ändern direction * / public void changeDirection () // Code, der die Richtung des Ghosts ändert / ** * Funktion - Ghost-Geschwindigkeit ändern * / public void changeSpeed () // Code, der die Geschwindigkeit des Ghosts ändert / ** * Funktion - Ghost-Farbe ändern * / public void changeColor () // Code, der die Farbe des Ghosts ändert / ** * Funktion - Ghost-Status ändern * / public void changeState () // Code, der den Status des Ghosts ändert // Diese Funktion ebenfalls ruft die drei Funktionen changeDirection, changeSpeed und changeColor auf
Dem Ghost-Status wurden drei zusätzliche Funktionen hinzugefügt: die Richtung ändern
, Farbe ändern
, und changeSpeed
. Diese waren nicht in unserer ursprünglichen Verhaltensliste, weil sie kein Verhalten sind. Stattdessen handelt es sich bei diesen Funktionen um sogenannte Helferfunktionen, die dazu beitragen, eine hohe Kohäsion aufrechtzuerhalten.
Das Verhalten des Zustandswechsels (was passiert, wenn Pac-Man ein Pellet isst), erfordert drei verschiedene Aufgaben: Drehen Sie tiefblau, kehren Sie die Richtung um und bewegen Sie sich langsamer. Um die Kohäsion aufrechtzuerhalten, möchten wir nicht, dass eine Funktion alle drei Aufgaben ausführt. Wir unterteilen sie in drei Unteraufgaben, die die Funktion zur Ausführung ihrer einzigen Hauptaufgabe aufruft.
Die Verwendung des Wortes und Wenn wir beschreiben, was ein Verhalten / eine Funktion normalerweise bedeutet, sollten wir mehr als eine Funktion erstellen.
Kohäsion ist das Prinzip der Gruppierung von ähnlichem Code und stellt sicher, dass jede Funktion nur eine einzige Aufgabe ausführt. Kohäsion hilft dabei, Code zu erstellen, der wartbar und wiederverwendbar ist.
Im nächsten Quick Tip werden wir das Prinzip der Kopplung und ihre Beziehung zum Zusammenhalt diskutieren. Folgen Sie uns auf Twitter, Facebook oder Google+, um über die neuesten Beiträge auf dem Laufenden zu bleiben.