model view controller im Klassendesign



  • Hi,

    ich hatte mir mal grundlegende Gedanken gemacht, wie ich ein Spiel wie z.B.: Rush Rush Rally Racing
    http://www.youtube.com/watch?v=J-PfPyC_5es oder Traffic Trouble http://www.youtube.com/watch?v=HmYisZpEs1c umzusetzen sind. Das Spiel nutzt bewegte Objekte (hier Autos) oder Ampeln, die vom Anwender dann umgestellt werden. Im ersten Spiel steuert der Spieler ein Auto und der Computer die restlichen (wenn kein Netzwerk). Gehen wir mal vom ersten Spiel aus: Ich dachte wenn z.B. fünf Autos fahren habe ich fünf Controller-Klassen, eine für den Spieler, die restlichen für die AI. Diese Contoller-Klassen können dann von einer Controller-Klasse abgeleitet werden. Ich brauche auch fünf Model-Klassen. Für jedes Auto eine. Auch die kann ich von einer globalen Modelklassen erben lassen und fünf Viewklassen, die Autos rendern. Diese Viewklassen können dann entweder OpenGL oder DirectX nutzen und eine Klasse, die die Strecke darstellt. Aber sicher bin ich mir wegen des Klassendesigns nicht.

    Gruß



  • Bist du dir sicher nicht Vererbung und Instanziierung zu verwechseln? 😉



  • Nö,

    ich habe z.B. eine Klasse Model, eine Klasse View und eine Klasse Controller.

    Von diese Klasse Model würde ich dann z.B. ModelCar1, ModelCar2, .. , ModelCar5 ableiten. Somit kann ich dann für jedes Auto mein Model anpassen. Also z.B. Truck, Sportwagem, Limousine, Rennwagen oder SUV. Damm einen Controllerklasse und von der leite ich eine für den Anwender und eine für die AI ab. Dann noch fünf Viewklassen die ich von einer Viewklasse ableite. In die Viewklasse kann dann noch eine simple Engine eingebaut werden für die Darstellung. Aber ich weiss nicht ob das Konzept sinnvoll ist.



  • FrankTheFox schrieb:

    Nö,

    ich habe z.B. eine Klasse Model, eine Klasse View und eine Klasse Controller.

    Von diese Klasse Model würde ich dann z.B. ModelCar1, ModelCar2, .. , ModelCar5 ableiten. Somit kann ich dann für jedes Auto mein Model anpassen. Also z.B. Truck, Sportwagem, Limousine, Rennwagen oder SUV. Damm einen Controllerklasse und von der leite ich eine für den Anwender und eine für die AI ab. Dann noch fünf Viewklassen die ich von einer Viewklasse ableite. In die Viewklasse kann dann noch eine simple Engine eingebaut werden für die Darstellung. Aber ich weiss nicht ob das Konzept sinnvoll ist.

    das klingt für mich ziemlich unsinnvoll. warum passt du die member des objects nicht einfach über setter methoden an?
    wenn man bedenkt, das ein spiel schnell mehr als 5 objecte hat, wäre man mit deiner methode ziemlich schnell an grenzen, und dynamisch ist das ganze mal überhaupt nicht!
    unterscheiden sich denn deine autos in mehr als nur dem aussehen?

    mfg



  • Hi,

    Ja. In der Beschleunigung, der Kurvenverhalten bzw. Gewicht, dem Bremsverhalten. Also selbst in einem simplen 2D Spiel wird zwar nur eine Bitmap das Auto darstellen, aber das Verhalten wird doch durch mehr als einen Parameter beeinflusst.
    Ok, das mit den Set- und Get-Methoden funktioniert schon aber dach ja jeder View ein Model zuordnen muss, jedes Auto kann sich ja anders verhalten aber ich bin mir nicht swo sicher ob diese Design sinnvoll ist. Ich habe auf einigen Seiten im Internet gesehen, das viele OO-Pattern in der Spieleentwicklung genutzt werden, aber es gibt auch einige Programmierer die solche Auswüchse für völligen Blödsinn halten (zumindest im Computzerspiel).

    Gruß



  • Das was du vor hast hat nicht mehr viel mit Objektorientierung zu tun. Das wäre quasi Klassenorientiert. 😃
    Eine Klasse macht immer dann Sinn, wenn du sinnvoll mehrere Objekte dieser Klasse erstellen kannst. Und das trifft eigentlich auf sehr viele Objekte in Spielen zu - auch auf deine Autos. Aber für jedes Auto eine eigene Klasse anzulegen hört sich nach Quatsch an. Du musst trennen zwischen Attributen/Eigenschaften und Werten für diese. Beispielsweise haben zwei Autos unterschiedliche Bremswege - aber dennoch haben alle Autos die Eigenschaft Bremsweg, nur der Wert ist unterschiedlich. Genau so sieht es auch mit Gewicht, Geschwindigkeit etc. aus. Daher klare Sache: Nur eine Klasse für alle Autos. (Und beim Rest verhält es sich genau so, eine AI Klasse reicht völlig, genau so wie eine view Klasse etc.)



  • aber selbst wenn es mehr als nur ein parameter ist, der das verhalten beeinflusst, musst du dennoch nicht das ganze object umschreiben o.O
    ich verstehe noch nicht ganz, was du damit bezwecken willst (bzw verstehe schon, was du sagen willst, aber verstehe nicht, warum du es so umständlich mache möchtest.)



  • Hi,

    ja. Bei genauer Betrachtung und weil schon Freitag ist stimmt es das ich nur eine Klasse Model, eine Klasse View und eine Klasse Controller. Dann ControllerUser und ControllerAI von Controller ableiten. Jedes Auto ist dann eine Instanz der Klasse View (also fünf Instanzen) jeweils fünf Model Instanzen, wobei jeweils eine Modelinstanz mit einer Viewinstanz (weak pointer) verbunden ist. Die View dann über eine Methode Update sich dann die Daten des speziellen Model holt (strong pointer). Das ControllerAI-Objekt steuert dann jeweils vier Autos und ein Controllerobjekt steuert das Auto des Anwenders, denn wenn der Anwender eine Taste drückt wird das Model informiert über dan Tastendruck und das informiert weiderum die View.

    Gruß



  • Ähm,

    ist es sinnvoll jedes andere Auto in einen separaten Thread zu packen. Also nur der primäre Thread hat Zugriff auf mein von mir gesteuertes Auto (Model, View,..), alle anderen Auto's haben ihren eigenen Thread?
    Ich frage mich auch, da in einigen Spielen "FPS", also in bestimmten Zeitintervallen die komplette Ausgabe gerendert wie sich das auf meine Threads und die "Controller" auswirkt oder so...

    Gruß



  • FrankTheFox schrieb:

    ist es sinnvoll jedes andere Auto in einen separaten Thread zu packen. Also nur der primäre Thread hat Zugriff auf mein von mir gesteuertes Auto (Model, View,..), alle anderen Auto's haben ihren eigenen Thread?

    Eher nicht.

    FrankTheFox schrieb:

    Ich frage mich auch, da in einigen Spielen "FPS", also in bestimmten Zeitintervallen die komplette Ausgabe gerendert wie sich das auf meine Threads und die "Controller" auswirkt oder so...

    Hast du überhaupt schon eine ungefähre Vorstellung davon wie du das implementieren willst? Die Frage klingt nämlich nicht danach. Fang einfach erst mal an - und nutze nur einen Thread.


Anmelden zum Antworten