Poste die Bilder bitte ins Forum. Externe Links verschwinden.
Wir haben noch über 100G ungenutzten Speicherplatz, den möchte ich nicht damit verschwenden, dass Posts darüber geschrieben werden, dass Bilder unauffindbar - oder in dem Fall - forbidden sind.
Glocke hat geschrieben:Xin hat geschrieben:Die View erkennt ja die Eingabe (z.B. einen Mausklick) und schickt das an Control. Control schaut im Model nach, was angeklickt wurde und entscheidet, was das bedeutet, ändert das Model entsprechend und gibt dem View den Hinweis, dass es nun was anderes darstellen soll.
Also das was ich "Controller" nenne beinhaltet z.B. das prüfen, welche Taste gedrückt wurde (z.B. mit SDL-Funktionen). Mein Model gibt der View indirekt den Hinweis, was sich verändert hat, indem es dem Server irgendwann "antwortet". Damit meine ich keine direkt "Antwort" im üblichen Sinne, sondern vielmehr ein Update "das ist jetzt dort". Und dieses Update gibt der Controller dann an die View weiter. Sicherlich könnte man dieses Update direkt vom Model an die View geben.
Der Controller trifft üblicherweise die Entscheidung, wie auf ein Event zu reagieren ist. Das Event wird aber doch im View ausgelöst, schließlich klickst Du mit der Maus auf die View und die View sagt - je nach eigener Intelligenz dem Controller, dass Panzer 15 geklickt wurde. Der Controller entscheidet dann, ob dieser Panzer jetzt markiert wurde oder ob dieser Panzer jetzt angegriffen wird, weil Du vorher auf Panzer 10 geklickt und dann auf "angreifen" geklickt hast.
Jede Aktion ist quasi ein "Tool". Am Anfang ist das Tool "Markieren" aktiv. Du klickst Panzer 10, das Tool entscheidet, den Panzer zu markieren und ein Menü bereit zu stellen. Du klickst auf "Angreifen", das Menü wird ausgeblendet und Du packst Du das Tool "Attacke!" auf den Toolstack. Die View bekommt ein neues Klick, diesmal auf Panzer 15, sendet das an den Controller. Der Controller leitet das Event an das aktive Tool "Attake!" weiter. Das Tool weiß, dass Panzer 10 jetzt Panzer 15 attackieren soll und gibt dem Model den Auftrag, an Panzer 10 die Handlung "verfolgte und attackiere Panzer 15" zu übergeben.
View fordert in der Zwischenzeit mal ein Update der Karte und stellt dieses da. Dabei steht Panzer 10 jetzt anders da, weil er sich Richtung Panzer 10 ausrichtet... Im Controller hat das Tool "Attacke!" seine Aufgabe erledigt, beendet sich und entfernt sich vom Stack. Das oberste Tool ist jetzt wieder "Markieren" und Du kannst den nächsten Panzer markieren, um Befehle zu geben.
Spielen zwei Personen (also zwei Views), kommen auch Eingaben aus unterschiedlichen Bereichen. Entsprechend kann ein Controller das nicht abfragen.
Der Controller hat in der Regel überhaupt keine Verbindung zum Anwender, sondern enthält die Programmlogik. View ist die Anwenderseite, das Model die Datenhaltung. Das Model verwaltet aber nicht die Aktualisierungen für eine einzelne View. Man will Userinteraktion (View), Programmlogik (Controller) und Daten (Model) ja vollkommen voneinander trennen, damit man View oder Model austauschen kann. Eine View für Textdisplays oder Drucker. Oder man nimmt das Model mit und baut einen Leveleditor damit - für einen Leveleditor kann man vermutlich auch die View wiederverwenden, aber die Programmlogik (Attacke!) ist eine andere.
Glocke hat geschrieben:[*] Schließlich berechnet der Controller die Framerate und wartet ggf. ein paar ms, um das Programm zu bremsen.
Nicht warten... oder nur konstant und kurz. (max. 20 Millisekunden)
Frag das Model, wie die aktuelle Karte ist, zeichne sie, stell sie dar. Und das in einem Endlosloop, höchstens unterbrochen durch das Senden von "Klick" an den Controller.
Glocke hat geschrieben:Für den Controller bliebe dann schließlich nur das "Eingabe erfassn und dem Model mitteilen".
Das Model hat keine Programmlogik, sondern nur eine Schnittstelle, die Daten zu bearbeiten, Fragen zu stellen (Wo ist der Panzer mit der ID...).
Glocke hat geschrieben:
Btw habe ich mit Absicht das so gedacht, dass das Model den Controller benachrichtigt, weil:
Wenn ein Spieler das Spiel verlassen will (und wir befinden uns in einem Netzwerkspiel), dann sollten die anderen Spieler ja darüber benachrichtigt werden, die Daten des Spielers entfernt werden usw. Somit würde dieser Logout auch ein Ereignis sein, der ans Model muss. Geht das Update "User X ist raus" aber direkt an die View (die dann dessen Sprites entfernt), würde der Controller das nicht wissen. Indem er vom Model benachrichtigt wird mit "So, der ist raus. Bin fertig mit ihm." weiß er, dass der Logout "geklappt" hat (von der Absicht des Spielers wusste er ja durch die Eingabe bereits, nur nicht vom "Erfolg" dessen). Okay, schlechtes Beispiel von einem "erfolgreichen Logout" zu sprechen. Aber ich denke ihr wisst was ich meine
Wenn Du Programmlogik und zusammenpackst, dann hat der Controller wirklich nichts zu tun. Dann ist es aber auch nur ein (MC)-V-Aufbau.
Die Abmeldung sollte der Viewer machen. Er verbindet sich mit dem Netzwerkservice (dem Spiel-Controller). Spielt man nicht im Netzwerk startet er einen eigenen Spielcontroller.
Hier ist MVC vielliecht was klein gedacht. Du brauchst quasi MS-VC. View und Controller, der lokal läuft und Model und Service, der das Spiel steuert. Der Controller steuert die Verbindungen zum Service, startet lokal einen Service wenn man alleine spielt. Aber das Model schickt Meldungen. Die View darf höchstens über Controller und Service fragen, wie denn gerade so die Weltlage ist. Du hast also gewissermaßen zwei Controller-Hierarchien: Spielcontroller (Service) und Teilnehmer-Programmlogik (Controller) je Teilnehmer.
Sieh das MVC nicht sooo eng. Das Pattern löst Probleme die für MVC passen. Pass Dein Problem nicht dem Pattern an, sondern überlege Dir ein für Dein Problem passendes Pattern. Hier eben die Trennung zwischen Userinteraktion (Viewer, der die Darstellung und Eingaben annimmt), dem Viewer-Controller, der Deinen Eingaben eine Semantik verleiht (Klick, Move, Klick, klick => Aha! Panzer 10 greift 15 an), dem Service-Controller (Spieler A:Panzer 10 greift 15 an, das trage ich ins Model ein) und eben dem einen Model (Landschaft + Handlung) oder den zwei Models (Landschaft / Handlung).
Sieh MVC als Inspiration, nicht als Dogma.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.