Game Development 1 Flashcards
Aus welchen 5 Komponenten besteht eine Game Engine?
System, Window, Grafiken, Audio, Netzwerk
Wie könnte die Initialisierung eines Games aussehen?
System überprüfen (genug Speicherplatz, Input, mehrere Instanzen…)
Init Logger
Fenster erstellen und Grafikgerät einrichten
Game Subsysteme einrichten
Ressourcen laden
Gameplay starten
Was ist wichtig zu beachten beim Game Shutdown?
Game Systeme sollten in umgekehrter Reihenfolge abgebaut werden, wie sie erzeugt worden sind
Exit(0) sollte nicht einfach so verwendet werden, weil das richtige Abbauen von Game Ressourcen ein Anzeichen von clean code ist und, dass der Speicher richtig freigegeben worden ist
Wie werden Game States am besten gehandled?
Es gibt eine zentralen Game State Manager, der sich um das Handling von States kümmert. Ebenso kommt es zum Einsatz vom State Design Pattern (ConcreteStates erben vom State und erben die handle Methode) - der GameStateManager nimmt einen String bei SetState entgegen und kümmert sich dann um das richtige Setzen vom State.
Was ist ein Game Object?
Eine Entität in der Spielwelt
Was ist ein hierarchisches Game Object?
Bei einem hierarchischen Game Object erben einzelne Game Objects von der Game Object Klasse und stellen somit neue einzigartige Game Objects dar - hierbei kann es allerdings zum Problem kommen, dass eine neues Game Object (zum Beispiel Mechtank) sowohl von Character als auch Vehicle erbt, wodurch es zu einem Diamond of Death kommt
Was ist ein komponenten-basiertes Game Object?
Ein komponenten-basiertes Game Object ist ein Container für Komponenten, wobei jede Komponente ihre eigene Funktionalität enthält - somit können Game Objects sich einfach bilden, indem verschiedene Komponenten ineinander gestöpselt werden
Wie kommunizieren Komponenten miteinander? Wann sollte welche Kommunikation verwendet werden?
1) Modifizierung von Container Objekt - Transformation
2) Komponente referenzieren sich gegenseitig (tightes coupling) - Animation + Rendering
3) Nachrichten senden - Play Sound, Trigger on collision
Was sind Kontroller Dead Zones?
Zonen bei Kontrollern, die während dem Spiele keine Wirkung haben sollen - Tile-basiertes Bewegen sollte nur 4 Richtungen beim Joystick erlauben, oder kleine Bewegungswerte sollten beim Shooter ignoriert werden
Welche Game Input Methoden gibt es?
Knopf, 1-Axis-Kontroller (Lenkrad), 2-Axis-Kontroller (Joystick, Maus), Motion Kontroller (Wii Remote), Motion Tracking (Playstatino Camera)
Woraus bestehen Motion Controller, um die Bewegung zu messen?
Accelerometer - misst die Beschleunigung
Gyroscope - misst die Rotation und Orientation vom Controller
Welche Herausforderungen treten beim Motion Tracking auf?
Genaue Erkennung von Bewegung (Bewegungs-“noise” macht genaue Erkennung schwer)
Latenz (Player-Prediction hilft)
Synchronisation der Animation (Animation und Spielerbewegung sollen gleich aussehen)
Falsche Fehler (System denkt, Spieler hat Move falsch gemacht, obwohl dieser richtig war - der Spieler hat immer recht)
Welche Arten gibt es Input zu messen?
Über einen Input Manager mithilfe von Polling (konstantes Checken, ob Input betätigt worden ist - Player Controls) oder Callbacks (werden ausgeführt, wenn der Status vom Input Device sich verändert hat - User Interface)
Wie sieht eine Translations-Matrix aus?
1 0 0 t.x
0 1 0 t.y
0 0 1 t.z
0 0 0 1
Wie sieht eine Scale-Matrix aus?
s.x 0 0 0
0 s.y 0 0
0 0 s.z 0
0 0 0 1
Wie sieht eine Rotation-Matrix aus?
x-Achse
1 0 0 0
0 cos(a) -sin(a) 0
0 sin(a) cos(a) 0
0 0 0 1
y-Achse
cos(a) 0 sin(a) 0
0 1 0 0
-sin(a) 0 cos(a) 0
0 0 0 1
z-Achse
cos(a) -sin(a) 0 0
sin(a) cos(a) 0 0
0 0 1 0
0 0 0 1
Was sind Tile Maps?
Eine Map von Welt-Geometrie (2D), wo die Map in einzelne kleine Graphiken unterteilt ist (ebenso wie ein Sprite Sheet) und man sich eine Welt aus den einzelnen Teilen der Tiel Map bauen kann.
Was ist Skinning?
Skinning ist der Prozess, wo man die Geometrie einer Mesh über Weight Values an ein Skelett (and die joints) bindet - Weight Painting ist essentiell für das „richtige“ Aussehen eines korrekt geskinnten Characters
Was sind Forward Kinematics?
= Hierchische Rigging Methode, bei der Joints bewegt und rotiert werden können
Rotiert man zum Beispiel eine Schulter, dann rotiert sich der gesamte Arm mit
Was sind Inverse Kinematics?
Das Gegenteil von Forward Kinematics: Man markiert den Fuß-Joint als IK, die Bewegung dessen hat dann Einfluss auf das gesamte Bein
Fuß wird angehoben, Oberschenkel geht automatisch mit
Beim Bewegen des Fußes wird die Bewegung in der Hierarchie nach oben hin verrechnet (Rigger setzt selbst fest, (bis) welche Joints beeinflusst werden von IK)
Was ist Pixel Basierte Collisionserkennung?
Jeder einzelne Pixel wird auf eine Intersektion geprüft - ist aber sehr langsam und wird nur für Mouse Hit Tests in 2D Spielen verwendet
Welche Kollisionsformen gibt es im 2D-Bereich?
Punkt, Linie, Kreis, Axis-Aligned Bounding Box (AABB), Oriented Bounding Box (OBB), Convex Polygon, Concaves Polygon (ein internet Winkel ist größer als 180°)
Wie funktioniert die Kollisionserkennung bei Kreisen?
Wenn die Distanz zwischen den beiden Kreisen kleiner als der aufaddierte Radius beider Kreise ist, dann handelt es sich um eine Kollision.
Wie kann die Kollisionserkennung über Distanzen performancemäßig optimiert werden?
Indem man im quadrierten Bereich rechnet und sich die Wurzel spart, also wenn der Radius beider Wurzeln zusammenaddiert zum Quadrat kleiner als Distanz zwischen den Kreisen ist.
r = a.radius + b.radius;
return r * r < (a.x - b.x) ² + (a.y - b.y) ²
Was ist das Separating Axis Theorem?
Zwei convexe Objekte kollidieren NICHT, wenn es eine Achse gibt, wo die Objekte separiert sind - man muss also nur durch alle Checks durchgehen und eine Achse finden ohne Überlappung, damit man weiß, ob eine Kollision entsteht oder nicht
Checks: Man schnappt sich jeder Achse von jedem Objekte und macht eine orthogonale Linie auf diese Achse (Separating Axis) - man projiziert nun die Form des Objekts und legt diese “übereinander” - wenn es eine Separating Axis gibt, wo die Objekte nicht übereinander liegen, dann gibt es keine Kollision (funktioniert nur bei Convexen Objekten)
Wie funktioniert die Kollisionserkennung bei AABB?
if (a.max.x < b.min.x || a.min.x > b.max.x)
return false; // no collision
if (a.max.y < b.min.y || a.min.y > b.max.y)
return false; // no collision
return true;
Welche Kollisionsformen gibt es in 3D?
Ray, Plane, Cube, Cylinder, Cone, Capsule, AABB, OBB, Convex Polyhedron, Concave Polyhedron
Wie ist eine Physics Engine grundsätzlich aufgebaut? Erläutere die einzelnen Phasen.
1) Kollisionserkennung mit Broad und Narrow Phase
In der Broad Phase werden potentielle Kollisionen gesammelt - kann durch BSP Tree oder Quad Trees verschnellert werden
In der Narrow Phase wird dann eine genaue Kollisionserkennung durchgeführt und für jede Kollision wird ein Manifold erstellt (speichert alle Informationen einer Kollision)
2) Kollisionsbehandlung
Kollisionen werden behandelt und die positional correction angewendet (bei Penetrationen)
3) Berechnungen der Bewegungen
Positionen von Objekte werden an Hand der Geschwindigkeit festgelegt / berechnet
Welche Informationen enthält ein Manifold?
Collisionsnormale
Penetration
Die kollidierenden Objekte
Kontaktpunkt
Auf welchen physikalischen Grundsätzen basiert eine Game Physics Engine normalerweise?
Trägheitsgesetz (Inertia Law) - Objekt bleibt in Ruhe / in Bewegung so lange, bis externe Kräfte auf dieses einwirken
Aktionsprinzip (Action Law) - a = F / m (Beschleunigung = Kräfte / Masse)
Reaktionsprinzip (Reaction Law) - auf jede Aktion folgt eine Reaktion, wenn also ein Körper A auf Körper B Kräfte ausübt, wird Körper B in die entgegengesetzte Richtung ebenso Kräfte ausüben
Welche Eigenschaften / Attribute enthält ein Rigid Body normalerweise?
Position
Velocity
Acceleration
Shape
Mass
Was ist die simpelste Methode der Kollisionsbehandlung? Wie funktioniert diese?
Ein one-time Impuls wird ausgesendet, sodass sich beide Objekte in der nächsten Frame in die selbe Richtung bewegen basierend auf der Kollisionsnormale und der Geschwindigkeit der Objekte
Man nimmt die relative Geschwindigkeit (vb - va = vab) und multipliziert diese mit der Kollisionsnormale –>
vn = (vab * n) * n
Um nun den Impuls zu berechnen, nimmt man die Hälfte von vn und zieht diese von va und addiert die andere Hälfte zu vb
v’a = va - 1/2vn
v’b = vb + 1/2vn
Was ist Inverse Masse?
Bessere Methode zum Rechnen mit Massen in der Physik, da eine teure Division erspart wird
Mit inversen Massen können Körper mit unendlich Masse ebenso leichter definiert werden (0)
Inverse Masse = 1 / Masse
Wie wird Bewegung in Spielen programmiertechnisch umgesetzt?
Vec2f F = calculateForces();
acceleration = F / mass;
velocity += acceleration * delta;
position += velocity * delta;
Was ist Tunneling?
Kollisionserkennung wird nur zu bestimmten Zeiten ausgeführt (Steps) - schnelle Objekte können somit durch dünne Objekte durchfliegen (Tunneling) - eine mögliche Lösung ist den time step zu reduzieren oder kontrinuierliche Kollisionserkennung
Was ist das Observer Pattern?
Beim Observer Pattern können sich Objekte an andere Objekte “anhängen” (registrieren) und werden über mögliche Statusveränderungen dann benachrichtigt - das Subjekt führt eine Liste von Observern, die während der Runtime geupdated wird und wenn eine mögliche Nachricht aufgerufen wird, die observed werden soll, führt das Subjekt “Notify()” aus, wo das “onNotify()” von allen registrierten Observern ausgeführt wird
Was ist das Strategy Pattern?
Beim Strategy Pattern kann man eine austauschbare Strategy bei einem Objekt definieren, die ausgeführt wird (“execute()”) - hierbei kann beim Contextobjekt die Strategy gesetzt werden und alle Objekte die vom Strategy Interface erben, können hier eingefügt werden und deren Verhaltensweise ausgeführt werden - so kann man beispielsweise leicht switchen, ob ein Mitspieler gerade durch einen Spieler oder durch AI gesteuert werden soll
Was ist das Factory Pattern?
Die Factory dient zum Instanziieren einer Klasse, ohne die konkrete Klasse zu wissen
Beispiel:
1) Im Mainstate vom Spiel wird “create(“Enemy”)” aufgerufen
2) In der GameObjectFactory wird die AbstractFactory in einer Map gefunden (EnemyFactory) und die Methode “create()” bei diesem aufgerufen
3) Die EnemyFactory instanziiert nun einen Gegner und das GameObject wird im MainState returned
Was ist ein Event Bus?
Ein Event Bus wird meist als Singleton implementiert und dieser hat im Hintergrund eine Queue hinterlegt, die Event processed - Komponenten können Events an den Event Bus senden und alle “Subscriber” zu diesem Event werden benachrichtigt, dass dieses Event getriggered worden ist –> praktisch für lose Kommunikation