Implementierung des Beobachtermusters


7

Um mir das grundlegende Programmieren von Spielen beizubringen, werde ich einen Klon von Pong programmieren. Ich werde das Observer-Entwurfsmuster mit einer Schnittstelle zwischen der Eingabe und der Spiel-Engine verwenden. Ich bin mir jedoch nicht sicher, was die Schnittstelle tun soll. Eine Idee, die ich hatte, war, dass die Eingabeschnittstelle der Spiel-Engine mitteilte, dass (z. B.) auf den Bildschirm geklickt wurde, und dass die Spiel-Engine dann entscheiden konnte, was mit diesen Informationen geschehen soll (z. B. eine Kugel abschießen). Eine andere Idee, die ich hatte, war, dass die Eingabeschnittstelle nach dem Klicken mit der Maus die Spiel-Engine anweist, eine Kugel abzuschießen.

Welche Methode wäre für mich besser?


+1 Sie hätten sich keinen besseren Startplatz aussuchen können
John McDonald

2
Kugeln in Pong klingt interessant.
MichaelHouse

1
In Zukunft schlage ich vor, Ihren Tags Implementierungssprachen hinzuzufügen, da die Architektur möglicherweise betroffen ist und das angegebene Beispiel auf Ihre Bedürfnisse zugeschnitten werden kann. Wenn Sie kommentieren, wie erfahren ein Programmierer in dieser Sprache ist, können die Antwortenden auf der richtigen Ebene mit Ihnen sprechen .
Patrick Hughes

Antworten:


7

Die erste Methode ist eine Implementierung des Beobachtermusters, die zweite nicht. Das beobachtete Objekt (Ihre Eingabeschnittstelle) sollte nicht wissen müssen, was das beobachtende Objekt (Ihre Spiel-Engine) mit der Benachrichtigung macht, sondern nur, dass es benachrichtigt werden möchte.

Ich bin mir jedoch nicht sicher, warum Sie sich hier für das Beobachtermuster entschieden haben. Wenn Sie nicht mehrere Beobachter haben, scheint dies eine Komplikation zu sein, die vermieden werden kann. Wenn das Klicken immer das Gleiche bewirkt, muss die Spiel-Engine von der Benutzeroberfläche angewiesen werden, das eine zu tun. Wenn Sie die Dinge so einfach wie möglich halten, fällt es Ihnen leichter. Dies bedeutet nicht, dass Sie niemals Entwurfsmuster verwenden, aber im Allgemeinen nähern Sie sich ihrer Anwendung in die entgegengesetzte Richtung wie Sie. IE: Beginnen Sie mit dem Problem und wählen Sie das Entwurfsmuster aus, um es zu lösen, anstatt mit dem Entwurfsmuster zu beginnen und herauszufinden, wie Sie Ihr Problem damit lösen können.


2
Die Verwendung neuer Ideen wie Beobachter bei einfachen Projekten ist ein guter Weg, um Muster zu lernen. Da Lernen hier das gewünschte Ergebnis ist und nicht nur ein Pong-Spiel zum Laufen bringt, wäre es meiner Meinung nach schön, die Antwort aufzufüllen, um beide zu behandeln.
Patrick Hughes

Wie er sagte, wollte er grundlegende Spielprogrammierung lernen, nicht Designmuster. Ich denke, es ist einfacher, sich nur auf diesen Aspekt zu konzentrieren. Wenn Sie versuchen, zu viel auf einmal zu lernen, lernen Sie am Ende sehr wenig. Insbesondere in diesem Fall, in dem das Muster möglicherweise nicht wirklich nützlich ist, ist das Lernen, wann ein Entwurfsmuster NICHT verwendet werden soll, genauso wertvoll wie das Gegenteil.
Chewy Gumball

Ich habe diesen Einwand mit einem Kommentar zur Hauptfrage für ihn vorausgesagt, um einige Informationen zum aktuellen Fachwissen in anderen Bereichen aufzunehmen, um Verwirrung bei zukünftigen Fragen zu vermeiden. Aufgrund seines Wortlauts und seines Anscheines, dass ich
Patrick Hughes

2

Wenn Sie sich an das Observer-Muster halten möchten, muss dies die erste Idee sein. Das stärkste Argument, das ich mir vorstellen kann, ist, dass die Eingabeschnittstelle eine generische Komponente ist, die Sie wahrscheinlich auch in anderen Spielen wiederverwenden möchten. Es ist also sinnvoll, es frei von spielspezifischen Informationen zu halten, da Sie es sonst nicht in einem anderen Kontext verwenden könnten. Denken Sie im Allgemeinen sorgfältig über die Verantwortlichkeiten Ihrer Klassen nach und versuchen Sie, sie fokussiert und auf den Kontext der Klasse beschränkt zu halten.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.