November 8, 2021
Organisation
Beginnen Sie jetzt mit dem Programmieren
▶ z.B.: /<spielname>/<spielname>.sln
▶ Jenkins und Sonar sind nun online
▶ Arbeiten Sie an einem Projekt, integrieren Sie kontinuierlich
▶ MS01: N ¨achste Woche (Spielobjekt in der Welt bewegbar, bewegliche Ansichten, Level laden/speichern, Soundausgabe)
▶ Nehmen Sie die w ¨ochentlichen Aufgaben als Chance sich zu verbessern
Ideenpr ¨asentation (Do. N ¨achste Woche)
▶ Ab 14 Uhr ct. in Zoom
▶ Ab 14 Uhr st. Technik testen
▶ Gesamte Gruppe mit Kamera
▶ max 10min (+ 5min Fragen)
▶ Bereiten Sie sich vor:
▶ Worum geht es?
▶ Zentrale Spielmechanik?
▶ Spielablauf? (gewinnen, verlieren)
▶ Warum macht es Spaß?
Architektur
Engine
▶ Eingabe
▶ Men ¨us und Popups
▶ Persistente Einstellungen
▶ Speichern/Laden
▶ Rendern und Kamera
▶ Pathfinding
▶ Kollisionserkennung
▶ Netzwerk
▶ Objektverwaltung Spielmechanik
Tools
▶ Modelle integrieren
▶ Texturen integrieren
▶ Sounds integrieren
▶ Level erstellen
▶ Debugging output Content
▶ Sound und Musik
▶ Modelle
▶ Sprites
▶ Levels
A Man Ran (WS17/18)
▶ Men ¨us und Popups
▶ Persistente Einstellungen
▶ Speichern/Laden
▶ Rendern und Kamera
▶ Pathfinding
▶ Kollisionserkennung
▶ Netzwerk
▶ Objektverwaltung Spielmechanik
▶ Texturen integrieren
▶ Sounds integrieren
▶ Level erstellen
▶ Debugging output Content
▶ Sound und Musik
▶ Modelle
▶ Sprites
▶ Levels
Architektur
Am Besten Top-Down anfangen:
▶ Zuerst Struktur aufbauen
▶ Funktionalit ¨at aufteilen
▶ Separation of Concerns
Content
Game Logic
Engine
MonoGame
MonoGame und .NET
▶ Mathematik
▶ Zufallszahlen
▶ (De-)Serialisierung in XML/Bin ¨ar
▶ Datenstrukturen (Liste, Menge, ...)
▶ Debugging
▶ Profiling
▶ Abstraktion
▶ Grafik
▶ Sound
▶ Input
▶ Content Pipeline
▶ Einfache Anzeigemethoden (BasicEffect, SpriteBatch)
▶ Datentypen
▶ Vector2, Vector3
▶ Matrix
▶ ...
MonoGame Lifecycle
Initialize() LoadContent()
BeginRun() Update(GameTime t)
BeginDraw(): bool
Draw(GameTime t)
EndDraw() EndRun()
(Un-)Load Content
Game Loop
Screen Management
Entkoppeln der Verwaltung von Spielzust ¨anden und deren Inhalt:
▶ Screens implementieren ihre jeweilige Funktionalit ¨at
▶ Hauptmen ¨u
▶ Optionsmen ¨u
▶ Spielansicht
▶ HUD
▶ Ladebildschirm
▶ ...
▶ ScreenManager verwaltet alle Screens
MainMenuScreen
- mScreenStack:List<IScreen>
+ AddScreen(screen:IScreen) + RemoveScreen(...) + Draw(...) + Update(...)
Draw()
Update()
Screen Management
MainMenuScreen
ScreenManager - mScreenStack:List<IScreen>
+ AddScreen(screen:IScreen) + RemoveScreen(...) + Draw(...) + Update(...)
AddScreen(OptionsScreen)
MainMenuScreen
- mScreenStack:List<IScreen>
+ AddScreen(screen:IScreen) + RemoveScreen(...) + Draw(...) + Update(...)
OptionScreen
Draw()
Update()
Screen Management
MainMenuScreen
ScreenManager - mScreenStack:List<IScreen>
+ AddScreen(screen:IScreen) + RemoveScreen(...) + Draw(...) + Update(...)
OptionScreen
RemoveScreen()
MainMenuScreen
- mScreenStack:List<IScreen>
+ AddScreen(screen:IScreen) + RemoveScreen(...) + Draw(...) + Update(...)
Draw()
Update()
Screen Management
GameScreen HudScreen
ScreenManager - mScreenStack:List<IScreen>
+ AddScreen(screen:IScreen) + RemoveScreen(...) + Draw(...) + Update(...)
UpdateLower?
DrawLower?
GameScreen HudScreen
- mScreenStack:List<IScreen>
+ AddScreen(screen:IScreen) + RemoveScreen(...) + Draw(...) + Update(...)
Yes
Yes
Screen Management
GameScreen HudScreen
ScreenManager - mScreenStack:List<IScreen>
+ AddScreen(screen:IScreen) + RemoveScreen(...) + Draw(...) + Update(...)
PauseMenuScreen
GameScreen HudScreen
- mScreenStack:List<IScreen>
+ AddScreen(screen:IScreen) + RemoveScreen(...) + Draw(...) + Update(...)
PauseMenuScreen UpdateLower?
DrawLower?
Screen Management
GameScreen HudScreen
ScreenManager - mScreenStack:List<IScreen>
+ AddScreen(screen:IScreen) + RemoveScreen(...) + Draw(...) + Update(...)
PauseMenuScreen
No
Yes
Screen Management
ScreenManager
- mScreenStack:List<IScreen>
+ AddScreen(screen:IScreen) + RemoveScreen(...) + Draw(...)
+ Update(...)
<<Interface>>
IScreen
+ UpdateLower: bool + DrawLower: bool + Update(...) + Draw(...)
MenuScreen
HudScreen
PauseMenuScreen
<<component>> Menu
Screen Management
Engine.ScreenManagement
GameLogic.Menu
ScreenManager- mScreenStack:List<IScreen>
+ AddScreen(screen:IScreen) + RemoveScreen(...) + Draw(...)
+ Update(...)
<<Interface>>
IScreen
+ UpdateLower: bool + DrawLower: bool + Update(...) + Draw(...)
HudScreen
PauseMenuScreen
<<component>> ScreenManagement
<<component>> Menu
IScreen
GameLogic.Menu
ScreenManager- mScreenStack:List<IScreen>
+ AddScreen(screen:IScreen) + RemoveScreen(...) + Draw(...)
+ Update(...)
<<Interface>>
IScreen
+ UpdateLower: bool + DrawLower: bool + Update(...) + Draw(...)
HudScreen
PauseMenuScreen
<<component>>
ScreenManagement
IScreen
Input Management
▶ Tastatur, Maus, Gamepad, ...
▶ MonoGame Namespace Microsoft.Xna.Framework.Input
▶ KeyboardState mKeyboardState = Keyboard.GetState();
▶ Statusinformation per Frame: Zustand der Tasten, Mausposition
▶
keineHistorie
▶ Wir brauchen
▶ Statusinformation in Abh ¨angigkeit von Zeit (z.B.:
Awurde diese Frame losgelassen)
▶
Abstraktionvon Tasten zu Aktionen
Input Management
Xna...Mouse
Xna...MouseState
Xna...Keyboard
Xna...KeyboardState
<<enumeration>>
Xna...Keys
KeyEvent
<<enumeration>> KeyEventType OnButtonDown OnButtonPressed OnButtonUp
0...*
InputState + MousePosition:Vector2
1
<<enumeration>> ActionType
Input Management
Engine.Input
Xna...MouseXna...MouseState
Xna...Keyboard
Xna...KeyboardState
InputManager
+ GetKeyMappings():Dictionary<ActionType, List<KeyEvent>>
+ SetKeyMapping(keyEvents: List<KeyEvent>, action: ActionType) + DeleteKeyMapping(...)
+ Update (...)
KeyEvent
<<enumeration>>
KeyEventType 0...*
InputState + MousePosition:Vector2
1
▶ Viele Elemente die sich sehr ¨ahnlich verhalten
▶ Panels
▶ Buttons
▶ Labels
▶ Textboxen
▶ Checkboxen
▶ Auch im Hud verwendbar
Men ¨us
MenuElement + Position:Vector2 + Size:Rectangle + Visible: bool MenuEventHandler
<<Interface>>
IKeyboardSelectable + Enabled: bool
<<Interface>>
IDrawable2D + CurrentRatio: float + Draw(...)
Pane Label Textbox Button
1
PaneElements 0..*
1 ButtonParts 0..*
Spielobjekte
Spielobjekte
Spielobjekte sind alle Dinge, die eine Repr ¨asentation in der Spielwelt haben.
▶ Charaktere, Fahrzeuge, B ¨aume, Raketen, Gras, Steine, Trigger, Lichter, Sounds, ...
▶ Spielobjekte m ¨ussen manchmal
▶ gezeichnet werden
▶ sich bewegen
▶ zerst ¨orbar sein
▶ miteinander kollidieren
▶ etc.
▶ Wie verwaltet man so viele (verschiedene) Objekte effizient?
Spielobjekte
Spielobjekte
Spielobjekte sind alle Dinge, die eine Repr ¨asentation in der Spielwelt haben.
▶ Charaktere, Fahrzeuge, B ¨aume, Raketen, Gras, Steine, Trigger, Lichter, Sounds, ...
▶ Spielobjekte m ¨ussen manchmal
▶ gezeichnet werden
▶ sich bewegen
▶ zerst ¨orbar sein
▶ miteinander kollidieren
▶ etc.
▶ Wie verwaltet man so viele (verschiedene) Objekte effizient?
▶ Zur
Laufzeit?Ein Szenengraph ist eine zentrale Datenstruktur, die der logischen und r ¨aumlichen Verwaltung der Spielobjekte dient.
▶ Antwort auf r ¨aumliche Fragen
▶ Update- und Drawaufrufe an Spielobjekte weitergeben
▶ Beispiele: Liste, Heap, Quad-/ Octree, KD-Tree, R-Tree, ...
Spielobjekte
Objektzentriert
▶ Spielobjekte sind Klassen mit
▶ Eigenschaften des Spielobjekts
▶ Verhalten des Spielobjekts
▶ Spielwelt ist eine Menge von Instanzen der Spielobjekte
Eigenschaftszentriert
▶ Jedes Spielobjekt ist nur eine ID
▶ Eigenschaften werden in Tabellen gespeichert
▶ Verhalten sind Operationen auf Tabellen
▶ Anhnlich zu Datenbanken ¨
Spielobjekte und Vererbung
Spielobjekte und Vererbung
Enemy
Was ist mit der Kamera?
Spielobjekte und Vererbung
PlayerCharacter Enemy
Spielobjekte und Vererbung
PlayerCharacter
PhysicsObject
Enemy
Was ist mit der Kamera?
Spielobjekte und Vererbung
MovableObject
PlayerCharacter
PhysicsObject
Enemy
Spielobjekte und Vererbung
MovableObject Platform
PlayerCharacter
PhysicsObject
Enemy
Was ist mit der Kamera?
Spielobjekte und Vererbung
ColldiableObject
MovableObject Platform
PlayerCharacter
PhysicsObject
Enemy
Spielobjekte und Vererbung
ColldiableObject AmbientTree
MovableObject Platform
PlayerCharacter
PhysicsObject
Enemy
Was ist mit der Kamera?
Spielobjekte und Vererbung
GameObject
ColldiableObject AmbientTree
MovableObject Platform
PlayerCharacter
PhysicsObject
Enemy
Spielobjekte und Vererbung
GameObject
ColldiableObject AmbientTree
MovableObject Platform
PlayerCharacter
PhysicsObject
Enemy
Was ist mit der Kamera?
Spielobjekte
Eine einfache Kamera
▶ Speichert z.B.:
▶ View Matrix
▶ Projection Matrix
▶ Grundlage f ¨ur Picking
▶ Definiert View Frustrum
Spielobjekte
Eine einfache Kamera
▶ Speichert z.B.:
▶ View Matrix
▶ Projection Matrix
▶ Grundlage f ¨ur Picking
▶ Definiert View Frustrum
- Teil der Spielwelt
- Nicht kollidierend
Tree Platform PlayerCharacter Mob BossMob Camera
GameObject ✓ ✓ ✓ ✓ ✓ ✓
Collidable ✓ ✓ ✓ ✓
Movable ✓ ✓ ✓ ✓
Physics ✓ ✓ ✓
EnemyBehaviour ✓ ✓
Spielobjekte und Vererbung
GameObject
ColldiableObject AmbientTree
MovableObject Platform
PlayerCharacter
PhysicsObject
Enemy
Camera
Spielobjekte und Komposition
Enemy IMovement ICollidable IEnemyBeaviour
<<interface>>
IGameObject
<<interface>>
IEnemy
NonCollidableObject
EnemyBehaviour
BossEnemyBeaviour
FlyingEnemyBehaviour ICollidable
<<interface>> IEnemyBeaviour 1
Behaviour 1 1
Spielobjekte und Komposition
Enemy IMovement ICollidable IEnemyBeaviour
<<interface>>
IGameObject
<<interface>>
IEnemy
FlyingMovement
UnitMovement
CollidableObject
NonCollidableObject
EnemyBehaviour
BossEnemyBeaviour
FlyingEnemyBehaviour
<<interface>>
IMovement
<<interface>>
ICollidable
<<interface>>
IEnemyBeaviour Movement
1 1
Physics 1 1
Behaviour 1 1
Enemy IMovement ICollidable IEnemyBeaviour
<<interface>>
IGameObject
<<interface>>
IEnemy
UnitMovement
CollidableObject
NonCollidableObject
EnemyBehaviour
BossEnemyBeaviour
<<interface>>
IMovement
<<interface>>
ICollidable
<<interface>>
IEnemyBeaviour Movement
1 1
Physics 1 1
Behaviour 1 1
Pathfinding
Offline
▶ Ber ¨ucksichtigt Welt und unbewegliche Objekte
▶ Meistens A*
▶ Viele m ¨ogliche Weltrepr ¨asentationen:
Grid, Hierarchical Grid, Waypoint Graph, Navigation Mesh,...
Online
▶ Beweglichen Objekten ausweichen
▶ Verschiedene Verfahren:
Steering, Flocking, Flow Fields, ...
+ GetPath(Location src, Location dest): Path
UnitMovement
Path AStarPathfinder
<<interface>>
IMapRepresentation
Library Falle
Die Libraryfalle
Die Libraryfalle
▶ Es existieren viele Libraries
▶ Pro:
▶ Rad nicht neu erfinden
▶ Optimierte L ¨osungen f ¨ur bekannte Probleme
▶ Aber:
▶ Problem muss verstanden sein
▶ Library muss verstanden werden
▶
Versteckte Kostenwenn Library fehlerhaft/schlecht/unpassend/...
▶ Vorher das Risiko absch ¨atzen:
▶ Wie zentral ist die Library?
▶ Wie reif ist die Library?
▶ K ¨onnen wir das einfacher selbst machen?
Part3 Lib
- Weniger m ¨oglicher Schaden:
Part1 Part2
Part3 Lib
Part4
Die Libraryfalle
Die Libraryfalle
▶ Es existieren viele Libraries
▶ Pro:
▶ Rad nicht neu erfinden
▶ Optimierte L ¨osungen f ¨ur bekannte Probleme
▶ Aber:
▶ Problem muss verstanden sein
▶ Library muss verstanden werden
▶
Versteckte Kostenwenn Library fehlerhaft/schlecht/unpassend/...
▶ Vorher das Risiko absch ¨atzen:
▶ Wie zentral ist die Library?
▶
Wie zentral ist die Library? -Viel m ¨oglicher Schaden:
Part1 Part2
Part3 Part4
Lib
- Weniger m ¨oglicher Schaden:
Part1 Part2
Part3 Lib
Part4
▶ Es existieren viele Libraries
▶ Pro:
▶ Rad nicht neu erfinden
▶ Optimierte L ¨osungen f ¨ur bekannte Probleme
▶ Aber:
▶ Problem muss verstanden sein
▶ Library muss verstanden werden
▶
Versteckte Kostenwenn Library fehlerhaft/schlecht/unpassend/...
▶ Vorher das Risiko absch ¨atzen:
▶ Wie zentral ist die Library?
▶
Part1 Part2
Part3 Part4
Lib
- Weniger m ¨oglicher Schaden:
Part1 Part2
Lib