lange Zeit Leser zum ersten Mal Poster. Bitte sei sanft.
Ich erschaffe eifrig Spiele in VB.net. Als Hobby-Programmierer gebe ich meine Spiele kostenlos weiter. Da ich ohne formelles Training ein Hobbys bin, versuche ich, mich über die richtigen Programmierprinzipien zu informieren und folge ihnen bei der Programmierung wie OOP. Es gibt jedoch einige Dinge, die ich offensichtlich als Autodidakten vermisst habe und die ich vielleicht wissen würde, wenn ich formell erzogen würde.
Sobald ein solches Problem wirklich mein Fluch ist, wie "verschiedene" Klassen (von nun an als Objekte bezeichnet) voneinander "wissen" OHNE programmspezifische Interaktion (bleib hier bei mir ... bitte ...)
Okay, stell dir vor, du hast ein Weltraumspiel und die folgenden Objekte
Nun verfügt jedes dieser Objekte über private, X, Y und Z private Member und Eigenschaften, die alle aus clsSpaceEntity geerbt sind. Jetzt wäre eine Möglichkeit, die Kollision zwischen ihnen zu programmieren, die folgende Logik in der Hauptspielschleife zu kodieren:
für jedes Schiff in einer Liste von Schiffen
überprüfen Sie jeden clsMissile in einer Liste, um zu sehen, ob es mit ihm kollidiert, und wenn ja, reduzieren Sie Gesundheit
überprüfe jedes clsAsteroid in einer Liste, um zu sehen, ob es damit kollidiert und wenn ja, reduziere Gesundheit
überprüfe jede clsSpaceJunka-Liste, um zu sehen, ob sie damit kollidiert und falls ja, reduziere die Gesundheit
... und so weiter und so weiter für jedes Objekt
nächstes
ect ect ...
Nun könnte das okay werden, wenn Sie über das einfache Beispiel oben sprechen, aber einige meiner Spiele haben Zehner oder sogar HUNDERTE von Objekten, die auf diese grundlegende Weise interagieren.
Nun meine Frage an die erfahrenen Programmierer da draußen.
Gibt es in OOP eine Möglichkeit, Folgendes zu tun ...
für jede Sache, die von clsSpaceEntity
erbt
Prüfe gegen jedes andere Objekt, das diesen Typ erbt (außer sich selbst) und wenn sie kollidieren, reduziere die Gesundheit
nächstes
?
Diese Art von Fähigkeit für eine Art von Objekten / Klasse oder was auch immer, sich einer anderen bewusst zu sein und wie sie gleich / verschieden sind und interagieren, würde mir Tonnen und Tonnen und TONNEN an Kodierung ersparen.
Jede Hilfe / Hilfe oder Rückmeldung hierzu wäre sehr willkommen. Danke für deine Zeit, Entschuldigung für das lange Lesen.
Anstatt eine separate List(Of T)
für jedes abgeleitete Objekt zu haben, sollten Sie eine einzige List(Of SpaceEntity)
erstellen, die alle Ihre Entitäten enthält.
Sie können dann eine verschachtelte For Each
-Schleife erstellen, die jedes Entitätenpaar durchläuft und eine Kollisionsprüfung durchführt. (nach einem If x <> y
check)
Sie können Ihr Design weiter verbessern, indem Sie SpaceEntity
a MustOverride
function angeben, um Kollisionen mit anderen Objekten zu behandeln, ohne Ihre Kollisionsschleife mit separater Logik für jede Entität zu belasten.
Sie sollten wahrscheinlich das Besuchermuster verwenden, um Entitäten zu erlauben, auf Kollisionen mit anderen Arten von Entitäten unterschiedlich zu reagieren.
Beachten Sie, dass jede Kollision an beide Objekte gesendet wird, die separat kollidierten; Sie müssen das in Ihrer Logik handhaben.
Wenn ich Logik schreibe, die sich mit einem einzelnen Schiff oder einer Einzelrakete, einem Asteroiden usw. befasst, dann sollte diese Logik eindeutig in die jeweilige Klasse gehören.
Wenn ich Logik schreibe, die sich mit mehreren Objekten oder noch schlimmer mit mehreren Objekten unterschiedlichen Typs befasst, würde ich diese Logik tendenziell in eine Klasse stellen, die ein Konzept auf höherer Ebene repräsentiert.
Sie haben beispielsweise eine Universe-Klasse, die eine Sammlung von SpaceEntity-Objekten enthält. Und es gibt eine Universe.FindCollisions (), die eine Sammlung von Collision-Objekten zurückgibt.
%Vor%Eine andere Möglichkeit, dies anzugehen, könnte darin bestehen, eine CollisionCalculator-Klasse zu haben, die eine Sammlung von SpaceEntity-Elementen in ihrem Konstruktor akzeptiert und an der diese spezifische Logik lebt.
%Vor%