Ich verwende C # / XNA und wurde einige Male angewiesen, Update-Code nicht mit Draw-Code zu mischen - und ich bin mir sicher, dass ich es nicht bin! Aber könnte jemand bitte beschreiben, was genau "Logikcode" ist?
Wie hier zu sehen: http://blogs.msdn.com/b/shawnhar/archive/2007/07/25/understanding-gametime.aspx
[...] stellen Sie sicher, dass Sie Ihre gesamte Spiellogik in die Update-Methode (nicht in Draw!) einfügen und alles mit einer schönen konstanten Geschwindigkeit läuft.
Ich frage dies, da die Geschwindigkeit meines Spiels relativ zur FPS schwankt. Langsame FPS entsprechen sich langsam bewegenden Objekten und umgekehrt. Und ja, ich füge den erwarteten position += speed * (float)gt.ElapsedGameTime.TotalSeconds;
Code ein.
Dies ist wahrscheinlich eine große Anfängerfrage, aber ich möchte nur die Definition dieser Frage absolut klarstellen.
quelle
position = speed * ...TotalSeconds
. Beachten Sie, dass es=
nicht ist+=
. Wenn es+=
so wäre, wie Sie es eingegeben haben, würde Ihre Position fast augenblicklich vom Bildschirm verschwinden.gt.ElapsedGameTime.TotalSeconds
ist die Anzahl der Sekunden, die seit dem Starten des Programms (des Spiels) vergangen sind. Wenn Sie Ihre Geschwindigkeit damit multiplizieren, ist Ihre Geschwindigkeit nach 5 Sekunden fünfmal höher (mit Ausnahme des Sonderfalls, bei dem die Geschwindigkeit auf 0 gesetzt ist). Ich bin mir nicht sicher, was Sie sonst noch haben könnten, aber ich bin fasziniert.iii
dass ich jedes Update manuell inkrementiere, weil ich es nicht in Sekunden will, ich will Schritte oder Frames. Ich kann jedoch erkennen, dass Ihr Weg ein gültiger Weg ist, um Dinge weich zu kodieren.Antworten:
Verändert es den Zustand Ihrer Spielwelt? Es ist ein Logikcode.
Zeigt es den Stand der Spielwelt an? Es rendert Code.
quelle
Ihre Trennung ist korrekt, wenn:
quelle
Draw()
kann es sein, dass im Laufe der Zeit unterschiedliche Bilder gezeichnet werden. Beispielsweise können sich Frames von animierten Sprites weiterhin ändern. Objekte können sich auch weiterhin visuell vorwärts bewegen, wenn beim Rendern von Code ein allgemeiner Trick verwendet wird und dievelocity * time since last update / period of update
sichtbare Position von Objekten vergrößert wird (während ihre tatsächliche Position unverändert bleibt).iff
was bedeutet, wenn und nur wenn?Update
was kommt sonst noch aus der Synchronisation heraus? Fehlende Player-Eingaben, nicht verarbeitete Netzwerkereignisse usw.? Das Spiel sollte von einer einzelnen Uhr gesteuert werden, mit festen "Häkchen" für die von dieser Uhr abgeleitete Spiellogik oder -physik und abgeleitetem Grafikstatus, der auch von derselben Uhr gesteuert wird.Draw()
, dass es immer das gleiche Bild zeichnet, wenn es mehrmals hintereinander aufgerufen wird. Das sollte man wenn möglich machen. Es gibt jedoch Fälle, in denen Sie nicht wissen, mit welcher Frequenz SieDraw()
angerufen werden. Zum Beispiel, wenn Sie volle Unterstützung (tatsächlich 120 FPS) für neue 120-Hz-Monitore wünschen und vsync einschalten möchten.What if I want to pause graphics?
Dann übergeben Sie 0 anstelle der tatsächlichen Deltazeit an dieDraw()
.0
. Sie können hierarchische Uhren verwenden, sodass z. B. die Benutzeroberfläche weiterhin ausgeführt und animiert wird, während die Zeicheninterpolation ebenfalls sehr einfach gestoppt wird.Der Punkt hier ist die Trennung von Modell-Dingen, die nicht das Modell sind.
Die Spielelogik ist das Modell, auf das in Bezug genommen wird
Dies sind alles unterschiedliche, verwandte Softwarearchitekturmuster. Aber in jedem Fall ist das Modell dasselbe, es ist die wahre Logik und der wahre Zustand.
Bei der Erstellung von Unternehmenssoftware wird diese manchmal als Geschäftslogik bezeichnet und in einigen Unternehmensrichtlinien kodiert. Wenn Sie zum Beispiel etwas für eine Bank codieren, um Kreditkartenrechnungen zu berechnen, ist es Teil der Geschäftslogik, dass jemand keine Zinsen zahlen muss, wenn er seine Schulden in weniger als 30 Tagen begleicht Modell. Es lebt beispielsweise nicht auf einer der Anzeigeebenen. Der Code zum Drucken einer Rechnung bearbeitet beispielsweise den Text nicht basierend auf deren Aktionen. Dieses Beispiel zeigt vielleicht, warum Sie Ihren Code auf diese Weise organisieren möchten.
Ähnliches gilt für die Spielelogik.
Stellen Sie sich vor, Ihr Spiel wurde irgendwann auf eine andere Konsole portiert. Es könnte hilfreich sein, sich etwas anderes als Ihr aktuelles Ziel vorzustellen. Wenn Sie beispielsweise mit einem Gamepad / Controller auf etwas zielen, können Sie sich vorstellen, dass Ihr Spiel auf ein Touchscreen-Tablet portiert wird. Die Spielelogik ist der Teil des Codes, der sich beim Portieren nicht ändert.
Wenn Ihr Spiel so etwas wie ein militärisches Strategiespiel wäre, stellen Sie sich vor, es würde zum komplexesten Brettspiel der Welt. Die Spiellogik besteht aus den Codeabschnitten, die den Zeilen im Regelbuch direkt entsprechen. (Nicht alle Zeilen im Regelbuch, nicht die über bewegte Teile, aber einige.)
Die Spiellogik ist das, was sich nie ändert, egal in welcher Form.
quelle