Ich hoffe, dass diese Streifzüge meine Frage klarstellen werden - ich würde es vollkommen verstehen, wenn sie es nicht tun. Lassen Sie mich wissen, ob dies der Fall ist, und ich werde versuchen, mich klarer zu machen.
Lernen Sie BoxPong kennen , ein sehr einfaches Spiel, das ich entwickelt habe, um mich mit der objektorientierten Spieleentwicklung vertraut zu machen. Ziehen Sie die Box, um den Ball zu kontrollieren und gelbe Gegenstände zu sammeln.
Mit BoxPong konnte ich unter anderem eine grundlegende Frage formulieren: Wie kann ich Objekte haben, die miteinander interagieren, ohne zueinander "gehören" zu müssen? Mit anderen Worten, gibt es eine Möglichkeit, dass Objekte nicht hierarchisch sind, sondern koexistieren? (Ich werde weiter unten näher darauf eingehen.)
Ich vermute, dass das Problem der Koexistenz von Objekten weit verbreitet ist, daher hoffe ich, dass es einen etablierten Weg gibt, es zu lösen. Ich möchte das Vierkantrad nicht neu erfinden, daher denke ich, dass die ideale Antwort, die ich suche, lautet: "Hier ist ein Entwurfsmuster, das üblicherweise zur Lösung Ihrer Art von Problem verwendet wird."
Insbesondere in einfachen Spielen wie BoxPong ist klar, dass es eine Handvoll Objekte gibt oder geben sollte, die auf derselben Ebene nebeneinander existieren. Es gibt eine Kiste, es gibt einen Ball, es gibt ein Sammlerstück. Alles, was ich in objektorientierten Sprachen ausdrücken kann, sind strenge HAS-A- Beziehungen. Dies geschieht über Mitgliedsvariablen. Ich kann nicht einfach anfangen ball
und es sein Ding machen lassen, ich brauche es, um dauerhaft zu einem anderen Objekt zu gehören . Ich habe es so eingerichtet, dass das Hauptspiel Objekt hat eine Box, und die Box wiederum hat einen Ball und hat einen Score - Zähler. Jedes Objekt hat auch eineupdate()
Methode, die Position, Richtung usw. berechnet, und ich gehe dort einen ähnlichen Weg: Ich rufe die Aktualisierungsmethode des Hauptspielobjekts auf, die die Aktualisierungsmethoden aller seiner untergeordneten Elemente aufruft, und sie rufen wiederum die Aktualisierungsmethoden aller ihrer untergeordneten Elemente auf . Dies ist der einzige Weg, den ich sehen kann, um ein objektorientiertes Spiel zu machen, aber ich denke, es ist nicht der ideale Weg. Schließlich würde ich den Ball nicht genau als zur Box gehörend betrachten, sondern als auf der gleichen Ebene und mit ihm interagierend. Ich nehme an, dass dies erreicht werden kann, indem alle Spielobjekte in Mitgliedsvariablen des Hauptspielobjekts umgewandelt werden, aber ich sehe keine Lösung dafür. Ich meine ... abgesehen von der offensichtlichen Unordnung, wie würde es für den Ball und die Box eine Möglichkeit geben, sich zu kennen , das heißt zu interagieren?
Es gibt auch das Problem, dass Objekte Informationen untereinander weitergeben müssen. Ich habe ziemlich viel Erfahrung mit dem Schreiben von Code für das SNES, bei dem Sie praktisch jederzeit auf praktisch den gesamten RAM zugreifen können. Angenommen, Sie machen einen benutzerdefinierten Feind für Super Mario World und möchten, dass alle Münzen von Mario entfernt werden. Speichern Sie dann einfach Null, um $ 0DBF zu adressieren, kein Problem. Es gibt keine Einschränkungen, die besagen, dass Feinde nicht auf den Status des Spielers zugreifen können. Ich glaube, ich bin von dieser Freiheit verwöhnt worden, weil ich mich bei C ++ und dergleichen oft frage, wie ich einen Wert für andere Objekte (oder sogar global) zugänglich machen kann.
Was wäre, wenn ich am Beispiel von BoxPong wollte, dass der Ball von den Rändern des Bildschirms abprallt? width
und height
sind Eigenschaften der Game
Klasse,ball
Zugang zu ihnen haben. Ich könnte diese Art von Werten weitergeben (entweder über Konstruktoren oder die Methoden, wo sie benötigt werden), aber das schreit mir nur nach schlechter Praxis.
Ich denke, mein Hauptproblem ist, dass ich Objekte brauche, um mich zu kennen, aber der einzige Weg, den ich sehen kann, ist eine strenge Hierarchie, die hässlich und unpraktisch ist.
Ich habe von "Freundschaftsklassen" in C ++ gehört und weiß irgendwie, wie sie funktionieren, aber wenn sie die Endlösung sind, warum sehe ich dann nicht, dass friend
Schlüsselwörter über jedes einzelne C ++ - Projekt verteilt werden, und wie kommt es, dass Konzept existiert nicht in jeder OOP-Sprache? (Gleiches gilt für Funktionszeiger, von denen ich erst kürzlich erfahren habe.)
Vielen Dank im Voraus für Antworten jeglicher Art - und wenn es einen Teil gibt, der für Sie keinen Sinn ergibt, lassen Sie es mich wissen.