6

Ich komme aus einem MVC-Hintergrund (Flex und Rails) und liebe die Ideen der Code-Trennung, Wiederverwendbarkeit, Kapselung, etc. Es macht es einfach, Dinge schnell aufzubauen und Komponenten in anderen Projekten wiederzuverwenden. Es war jedoch sehr schwierig, bei der Entwicklung komplexer, zustandsgesteuerter, asynchroner, animierter Anwendungen die MVC-Prinzipien einzuhalten.Spielt Model-View-Controller mit künstlicher Intelligenz und Verhaltensbäumen gut?

ich create animated transitions between many nested views in an application bin versucht, und es hat mich darüber nachzudenken, ob ich mich war irreführend ... Können Sie Prinzipien von MVC zu Prinzipien von Artificial Intelligence (Behavior-Bäume, Hierarchical State Machines, Nested Staaten) gelten, wie Spiele? Spielen diese beiden Disziplinen gut zusammen?

Es ist sehr einfach, die Ansichten/Grafiken außerhalb von sich selbst zu halten, wenn Dinge statisch sind, wie bei einem HTML CMS System oder was auch immer. Aber wenn Sie komplexe statusgesteuerte Übergänge hinzufügen, scheint es, als müsste alles über alles andere wissen, und der MVC kommt fast in die Quere. Was denken Sie?

Aktualisierung:

Ein Beispiel. Nun, gerade arbeite ich an einer Website in Flex. Ich bin zu dem Schluss gekommen, dass ich, um jedes verschachtelte Element in der Anwendung richtig zu animieren, an sie als AI-Agenten denken muss. Jede "Ansicht" hat dann ihren eigenen Verhaltensbaum. Das heißt, es führt eine Aktion (zeigt und verbirgt sich) basierend auf dem Kontext (was die ausgewählten Daten ist, usw.). Um das zu tun, brauche ich ein ViewController-Ding, ich nenne es einen Presenter. Also habe ich eine Ansicht (die in MXML dargestellte Grafik), einen Moderator (der die Animationen und Aktionen definiert, die die Ansicht basierend auf dem Zustand und den verschachtelten Zuständen der Anwendung ausführen kann) und ein Präsentationsmodell, um die Daten der Ansicht zu präsentieren (durch den Moderator). Ich habe auch Modelle für Wertobjekte und Controller für die Handhabung von URLs und Datenbankaufrufen etc ... alle normalen statischen/html-ähnlichen MVC-Zeug.

Für eine Weile versuchte ich herauszufinden, wie man diese "Agenten" so strukturieren konnte, dass sie auf ihren umgebenden Kontext reagieren konnten (was ausgewählt wurde, usw.). Es schien, als müsste alles andere bewusst sein. Und dann las ich über eine Pfad-/Navigationstabelle/Liste für Spiele und dachte sofort, dass sie eine zentral gespeicherte Tabelle aller vorberechneten Aktionen haben, die jeder Agent ausführen kann. Das hat mich neugierig gemacht, wie sie ihren Code strukturieren.

Das gesamte 3D-Videospiel-Zeug ist ein großes Geheimnis, und vieles von dem, was ich sehe, ist mit einem grafischen UI/Editor gemacht, wie zum Beispiel der Definition von Verhaltensbäumen. Ich frage mich also, ob sie eine Art von MVC verwenden, um zu strukturieren, wie ihre Agenten auf die Umgebung reagieren und wie sie ihren Code modular und verkapselt halten.

+0

Können Sie ein sehr einfaches Beispiel geben? Die verknüpfte Frage ist auch zu lang. –

+0

Ihre Frage scheint mit der Blackboard-Architektur zu tun zu haben. –

+0

Ooh, diese Tafel Architektur sieht interessant aus! Vielen Dank! –

Antwort

2

"Können Sie gelten Prinzipien von MVC zu Prinzipien von Artificial Intelligence (Behavior-Bäume, Hierarchical State Machines, Nested Staaten), wie Spiele?"

Natürlich. 99,9% der KI sind rein im Modell. Der Controller sendet die Eingaben an ihn, der View ist, wie Sie ihn auf dem Bildschirm dem Benutzer darstellen.

Nun, wenn Sie die KI etwas steuern lassen möchten, können Sie die Konzepte verschachteln, und Ihr Spielmodell enthält ein Modell für eine Entität, einen Controller für die Entität, an die die KI Befehle sendet es und eine Ansicht für die Entität, die die Wahrnehmungen dieser Entität darstellt, mit der der Controller arbeiten kann. Aber das ist ein separates Problem, ob es gut spielen kann. Bei MVC geht es darum, Präsentation und Input von der Logik und dem Zustand zu trennen, und diesem Aspekt ist es egal, wie die Logik und der Zustand aussehen.

+0

danke! Du hörst dich an, als wüsstest du, was mit all dem los ist, hast du irgendwelche Ressourcen, auf die du zeigen kannst? Irgendein Quellcode ??? –

+1

Nein, Spieleentwickler verwenden MVC normalerweise nicht, daher werden Sie in der Praxis nicht viel davon finden. Aber ich würde einfach raten, die MVC-Sache nicht zu weit zu nehmen. Es wurde explizit entworfen, um Präsentation von Inhalt in GUI-Anwendungen zu trennen, anstatt ein universelles Protokoll zum Schreiben von Software zu sein. Zum Beispiel sehe ich nicht, dass dein ursprünglicher Beitrag "Agenten" erfordert, noch etwas, das komplexer ist, als einfach alles zu aktualisieren und dann ihre neue visuelle Präsentation zu lesen, wie es Spiele normalerweise tun. – Kylotan

0

Denken Sie daran: Die Dinge, die reagieren müssen, müssen sich der Dinge bewusst sein, auf die sie reagieren müssen. Wenn sie also alles wissen müssen, dann müssen sie alles wissen. Ansonsten, -wie- machen Sie sie darauf aufmerksam? In Sachen 3D-Videospiele, sagen Ego-Shooter, reagieren die Gegner auf Ton und Sicht (zB Schritte/Schüsse und Du/Leichen). Beachten Sie, dass ich eine abstrakte Basis und Teile des Entscheidungsbaums angegeben habe.

Es könnte in Ihrem speziellen Fall falsch sein, das Ganze zwischen mehreren Agenten zu trennen und es einfacher einem Hauptagenten zu überlassen, der Aufträge an separate Prozesse delegieren kann (/ begin babble): jede Sicht könnte ein Prozess sein könnte vom Hauptagenten zu einer (mehreren) Ansicht wechseln, abhängig davon, welche Daten der Hauptagent erhalten hat.

Hoffe, dass hilft ..Nehmen Sie alles mit einem Körnchen Salz :)

0

Es klingt, als müssten Sie das Observer/Event Aggregator-Muster besser nutzen. Wenn mehrere Komponenten auf beliebige Anwendungsereignisse reagieren müssen, ohne eine übermäßige Kopplung zu verursachen, würde Ihnen die Verwendung eines Ereignisaggregators helfen. Beispiel: Wenn ein Element ausgewählt ist, wird ein Anwendungsereignis veröffentlicht, relevante Controller sagen ihrer Ansicht, dass sie Animationen ausführen sollen usw. Verschiedene Komponenten sind sich anderer nicht bewusst, sie hören nur auf gemeinsame Ereignisse.

Auch der Code, der die Ansicht Dinge machen lässt (Animation je nach Modell/Controller-Status starten) - das ist Teil der View selbst, so dass Sie nicht Ihre Architektur mit einem Controller und einem Viewcontroller seltsam machen müssen . Wenn es sich um UI-spezifischen Code handelt, ist es Teil der Ansicht. Ich bin nicht mit Flex vertraut, aber in WPF/Silverlight würde so etwas in den Code-Behind gehen (obwohl Visual State Manager mehr als genug ist, um mit Zustandsanimationen umzugehen, so dass Sie alles in XAML behalten können) .