Final Starfighter Deluxe Die Patterns - PowerPoint PPT Presentation

About This Presentation
Title:

Final Starfighter Deluxe Die Patterns

Description:

Final Starfighter Deluxe Die Patterns Ein Spielentwicklungsprojekt von Stefan Radicke && Thomas Fuchsmann sr038 && tf014 Final Starfighter Deluxe Die Patterns Ein ... – PowerPoint PPT presentation

Number of Views:101
Avg rating:3.0/5.0
Slides: 40
Provided by: DaviarS
Category:

less

Transcript and Presenter's Notes

Title: Final Starfighter Deluxe Die Patterns


1
Final Starfighter DeluxeDie Patterns
  • Ein Spielentwicklungsprojekt von
  • Stefan Radicke
  • Thomas Fuchsmann

2
Inhalt 1
1. Einführung 1.1 Grober Überblick über das
Projekt 1.2 Das Spiel Ein virtueller Ausflug
2. Game Patterns, zum Ersten (ein grober
Überblick) 2.1 Erklärung vom PollingThread 2.2
Vom PollingThread zur Session 2.3 Scrolling und
Zeichenvorgang
3. Game Patterns, zum Zweiten (Objekte im
Detail) 3.1 Karl, der Raumschiff 3.2
Feinde 3.3 Bewegungsmuster 3.4 Komm, wir
basteln uns einen Feind
3
Inhalt 2
4. Objekte erzeugen Objekte Die Schüsse 4.1 Was
unterscheidet Schüsse von den anderen Objekten?
5. Kollisionserkennung 5.1 Problematik Kleine
Fragestunde 5.2 Das Konzept Die konkreten
Kollisionsklassen (Chain Of
Responsibility, Strategy)
6. Das Level Von der Engine zum Spiel 6.1 Ein
vereinfachter Iterator 6.2 Konstruktoren und
Arrays Wunder der Technik 6.3
Zusatzinformationen
7. Der Punkt, zu dem wir nicht mehr kommen
werden, falls doch...
8. Danksagung und Ressourcen
4
1. Einführung
1.1 Grober Überblick über das Projekt - Statt
Patterns ein Projekt - Das Rad neu erfunden? -
Entwicklungszeit / Umfang - Erste Planung - Ziel
1.2 Das Spiel Ein virtueller Ausflug -
Patterns in Aktion
5
2. Game Patterns, zum Ersten
2.1 Erklärung vom PollingThread - Grundlegender
Spielablauf (Endlosschleife) - Einzelne Schritte
(berechnen, rendern, zeichnen, warten)
2.2 Vom PollingThread zur Session - Zentrale
Klasse (Mediator) - Alle Objekttypen
(Diagramm) - Listen und Manager -
Zusammenhang zwischen Session und PollingThread
2.3 Scrolling und Zeichenvorgang - Der Eindruck
von Bewegung - Darstellung in mehreren Ebenen
(Multiscrolling)
6
2.1 Erklärung vom PollingThread
Vereinfachter Spielablauf
while (true) //Aktuellen Zustand des Spiels
berechnen. berechnen() //Das Spiel rendern
und auf den Bildschirm zeichnen. zeichnen() //
Ein wenig schlafen. Thread.sleep(25)
7
2.2 Vom PollingThread zur Session
Session als zentrale Klasse Mediator
Feinde
Level
Karl
Wände
Session
Items
Schüsse
Factories
Datenbanken
8
2.2 Vom PollingThread zur Session
Listen und Manager
Die Session hält alle Feinde, Schüsse, Items und
Wände in ArrayListen. gt Alle Objekte, die in den
Listen gespeichert sind, sind am aktuellen
Spielgeschehen beteiligt.
Für alle Objekttypen sind Manager-Methoden
vorhanden, die vom PollingThread in einer
bestimmten Reihenfolge aufgerufen werden.
  • Funktionsweise der Manager
  • gt über die entsprechende ArrayList wird
    iteriert
  • gt Objekt wird bewegt
  • gt Kollision wird geprüft

9
2.2 Vom PollingThread zur Session
enemyManager() als Beispiel
public void enemyManager() for
(iterator enemies.iterator()
iterator.hasNext()) enemy
(IEnemy)iterator.next() if
(enemy.isAlive()) enemy.move()
//Kollision wird an anderer Stelle
geprüft else
enemy.suicide()
10
2.2 Vom PollingThread zur Session
Zusammenhang zwischen Session und PollingThread
PollingThread
Session
levelManager()
wallManager()
enemyManager()
enemyShootManager()
Spielzustand berechnen
shootManager()
itemManager()
karlManager()
rendern, zeichnen
repaint()
11
2.3 Scrolling und Zeichenvorgang
Der Eindruck von Bewegung
12
2.3 Scrolling und Zeichenvorgang
Der Eindruck von Bewegung
13
2.3 Scrolling und Zeichenvorgang
Darstellung in mehreren Ebenen
14
3. Game Patterns, zum Zweiten
3.1 Karl, der Raumschiff - Wichtige Attribute -
Ergänzung zur Session Der KeyListener -
Steuerung und Bewegung - Waffen für Karl
Ballern wie gestört
3.2 Feinde - Wichtige Attribute - Analogie zu
den Grundpatterns (State, Template und Facade) -
Das Interface Jeder Feind wird gleich behandelt
(Facade)
3.3 Bewegungsmuster - Lustig, aber wahr Feinde
dekorieren Bewegungsmuster (Decorator) - Die
Hierarchie der MovePatterns und ihrer
Datenbank - Problemloser Wechsel, zu Laufzeit
(State)
3.4 Komm, wir basteln uns einen Feind
15
3.1 Karl, der Raumschiff
Attribute für die Steuerung
isMovingUp boolean isMovingDown boolean
isMovingLeft boolean isMovingRight
boolean isShooting boolean
Ergänzung zur Session Der KeyListener
gt In den Methoden keyPressed(...) und
keyReleased(...) werden die boolschen
Variablen gesetzt. gt Dadurch ist eine flüssige
Steuerung, unabhängig von Interruptzeiten,
möglich.
16
3.1 Karl, der Raumschiff
Waffen für Karl Ballern wie gestört
gt Im shootManager() wird von Karl ein Schuss
angefordert, wenn karl.isShooting auf true
steht.
gt Karl entscheidet selbstständig, ob er zum
aktuellen Zeitpunkt schießen darf.
gt Unter folgenden Voraussetzungen darf Karl
schießen - Es befinden sich nicht mehr Schüsse
im Bild, als erlaubt. - Die vorgegebene
Verzögerungszeit ist abgelaufen. Die nötigen
Variablen sind in der allgemeinen abstrakten
Klasse Shoot statisch festgelegt.
gt Die Verzögerungszeit wird ignoriert, wenn der
Spieler die Feuern-Taste schnell
hintereinander mehrmals betätigt.
17
3.2 Feinde
Wichtige Attribute
isAlive boolean hp int points int -
enemyImage Image - suicideImage Image -
lineArray Line2D movePattern
IMovePattern isHitByShoot boolean
Analogie zu den Grundpatterns
gt State Bewegung und Schussverhalten gt
Template Algorithmen und deren Reihenfolge in
abstrakten Superklassen.
Subklassen bestimmen nur die Attributwerte. gt
Facade Allgemeines Interface für alle Feinde
18
3.2 Feinde
Jeder Feind wird gleich behandelt Das
Feindkonzept
Facade
ltlt IEnemy gtgt
Session
Subsystem
AnimatedEnemy
Enemy
GroundCannon1
Weitere Klassen Datenbanken, Karl, Level, etc.
Fighter5
ltlt IMovePattern gtgt
19
3.3 Bewegungsmuster
Feinde dekorieren Bewegungsmuster Decorator
State
ltlt IMovePattern gtgt
Session
MovePattern
ltlt IEnemy gtgt move() void
PointMovePattern
SimpleMovePattern
PointListData
gt Das Interface IEnemy sieht eine Methode
setMovePattern(...) vor, mit der es
möglich ist, die Movepatterns zur Laufzeit
auszutauschen.
20
3.4 Komm, wir basteln uns einen Feind!
public class FieserFeind extends Enemy

public FieserFeind(Session session)
super(session)
public int getHeight() return 60
public int getWidth() return 80
public int getHP() return 100
public int getPoints() return 10999
public Image getEnemyImage() return
session.graphicData.getFieserFeindImage()
public Image getSuicideImage() return
session.graphicData.getExplosion1Image()
public void playSuicideSound()
session.soundData.playExplosion1()
IMovePattern movePattern new
SimpleMovePattern(...) public
IMovePattern getMovePattern() return
movePattern
21
4. Objekte erzeugen Objekte Die Schüsse
4.1 Was unterscheidet Schüsse von den anderen
Objekten? - Die Hierarchie aller Schüsse -
Karls Schüsse und feindliche Schüsse im
Vergleich - Factories Unterbindung von new
22
4.1 Was unterscheidet Schüsse von
anderen Objekten?
gt Schüsse werden zu unvorhersehbaren Zeiten in
beliebiger Anzahl erzeugt.
gt Worin unterscheiden sich Karls Schüsse von
feindlichen Schüssen? - Art der Erzeugung -
Karls Schüsse haben Trefferpunkte - feindliche
Schüsse vernichten Karl sofort - feindliche
Schüsse fliegen auf einen konkreten Zielpunkt zu
gt Weiteres Problem Schüsse dürfen nicht zur
Laufzeit initialisiert werden.
Lösung Factories, die alle Schüsse beim Laden
der Engine in ausreichender Anzahl
erzeugen.
23
4.1 Was unterscheidet Schüsse von
anderen Objekten?
Die Hierarchie aller Schüsse
ltlt IShoot gtgt
Session
EnemyShootFactory
Shoot
KarlShootFactory
n
KarlShoot
EnemyShoot
Fireball1
RedLaser1
Karl
24
4.1 Was unterscheidet Schüsse von
anderen Objekten?
Factories Unterbindung von new
EnemyShootFactory als Beispiel
EnemyShootFactory - redLaser1Array EnemyShoot
... //weitere Schusstypen-Arrays
getEnemyShoot(shootNameString) EnemyShoot
Enemy createShoot() void
25
5. Kollisionserkennung
5.1 Problematik Kleine Fragestunde -
Anforderungen an die Kollision - ???
5.2 Das Konzept Die konkreten Kollisionsklassen
(Chain Of Responsibility, Strategy) -
Prinzipielle Zusammenarbeit der Klassen -
Unterscheidung von Objekttypen - Performance,
was ist das? (Grobüberprüfung, Reihenfolge)
26
5. Kollisionserkennung
5.1 Anforderungen an die Kollisionserkennung
gt Möglichst pixelgenaue Prüfung
gt Zuverlässigkeit
gt Einfache Handhabung Flexibilität
gt Performance Welche Prüfung ist wirklich nötig?
Welche Lösung erfüllt diese Anforderungen?
Unsere Lösung Vektoren zur Kollisionsprüfung
27
5.2 Die konkreten Kollisionsklassen
Prinzipielle Zusammenarbeit der Klassen
ltlt ICollision gtgt check(objObject) boolean
Session
AbstractCollision session Session
KarlCollision
Collision check(objObject) boolean
KarlShootCollision
EnemyShootCollision
ItemCollision
28
5.2 Die konkreten Kollisionsklassen
Unterscheidung von Objekttypen in der Klasse
Collision
public boolean check(Object obj) if (obj
instanceof Karl) return
karlCollision.check(obj) if (obj
instanceof KarlShoot) return
karlShootCollision.check(obj) if (obj
instanceof EnemyShoot) return
enemyShootCollision.check(obj) if
(obj instanceof Item) return
itemCollision.check(obj) return
false
29
5.2 Die konkreten Kollisionsklassen
Kollisionserkennung im Detail KarlCollision
Schritt 1 gt Grobe Überprüfung, um Performance
zu sparen Bounding-Box
Kollision kann ausgeschlossen werden. gt Abbruch
der Überprüfung
30
5.2 Die konkreten Kollisionsklassen
Kollisionserkennung im Detail KarlCollision
Schritt 2 gt Grobe Überprüfung, um Performance zu
sparen Bounding-Box
Kollision ist möglich. gt Überprüfung auf
Vektorebene
31
5.2 Die konkreten Kollisionsklassen
Kollisionserkennung im Detail KarlCollision
Schritt 3 gt Genaue Überprüfung Vektoren
Vektoren überschneiden sich nicht. gt keine
Kollision
32
5.2 Die konkreten Kollisionsklassen
Kollisionserkennung im Detail KarlCollision
Schritt 4 gt Genaue Überprüfung Vektoren
Vektoren überschneiden sich. gt Kollision .. Karl
ist tot!
33
6. Das Level Von der Engine zum Spiel
6.1 Ein vereinfachter Iterator - Hierarchie der
Level - Skriptprinzip (Iterator)
6.2 Konstruktoren und Arrays Wunder der
Technik - Woraus besteht ein Objekt? gt
Teilung schwergewichtiger Ressourcen
6.3 Zusatzinformationen - Hintergrundbild,
Scrolling, Musik, besondere Ereignisse
34
6.1 Ein vereinfachter Iterator
Hierarchie der Level
ltlt ILevel gtgt hasNextStep() boolean
nextStep() void putWallsIntoList() void
putEnemiesIntoList() void
Der levelManager() in der Session iteriert mit
den Methoden hasNextStep() und nextStep() über
die Arrays der konkreten Level.
gt Das Level wird wie ein Skript abgearbeitet.
Level nextStep() void putWallsIntoList()
void putEnemiesIntoList() void
Level1_1 - enemyArray IEnemy -
wallArray IWall hasNextStep()
boolean
35
6.2 Konstruktoren und Arrays
Erzeugung der Feinde und Wände
gt Alle im Level vorkommenden Objekte werden beim
Laden des Levels im Konstruktor
initialisiert und in Arrays gespeichert.
Dadurch gibt es praktisch kein new zur Laufzeit.
gt Vor beginn des Levels sind bereits alle Feinde
komplett einsatzbereit zusammengebaut
(inklusive aller denkbaren Verhaltensmuster).
gt Eine so riesige Menge von Objekten im Speicher
zu halten, ist kein Problem, da alle
schwergewichtigen Resourcen (Bilder, Sounds,
...) über Datenbanken geteilt werden.
Somit besteht ein konkreter Feind nur aus ein
paar Zahlenwerten und benötigt kaum
Speicherplatz.
gt Zur Laufzeit des Spiels werden lediglich
Referenzen kopiert bzw. verschoben (Level gt
Session) und nur in Sonderfällen neu erzeugt.
36
6.2 Konstruktoren und Arrays
Erzeugung der Feinde und Wände II Codebeispiel
public class Level1_1 extends Level //...
private IEnemy enemyArray new
IEnemy5000 //... IEnemy e101
//... public Level1_2(Session session)
//... e101 new IEnemy
new Fighter5(session)
e1010.setPosition(500, 0)
e1010.setMovePattern(new PointMovePattern(
e1010, session.pointListData
.getDropIn(true, 100, 5)))
e1010.setShoot( EnemyShoot.ROUNDFIRE
BALL1, session.shootBehaviorData.
shootRepeatedlyToKarl(80, 6)) //...
enemyArray101 e101 //...
37
6.3 Zusatzinformationen
Hintergrundbild, Scrolling, Musik, besondere
Ereignisse
gt Informationen über Scrolling-Verhalten -
weit entferntes Hintergrundbild - näheres
Hintergrundbild - Wände Alle drei
Schichten können sowohl einzeln, als auch in
Abhängigkeit zueinander bewegt werden.
gt Es können zu beliebigen Zeitpunkten
Musikstücke oder Geräusche abgespielt oder
gestoppt werden.
gt Zur Laufzeit kann jedes Objekt beliebig
manipuliert werden.
gt Das Level kann zu jedem beliebigen Zeitpunkt
angehalten werden stopLevel()
boolean Beliebige Bedingungen, z.B.
Endgegner im Bild, sind möglich.
gt Beim Start eines Levels kann eine Animation
abgespielt werden.
38
7. Der Punkt, zu dem wir nicht mehr kommen
werden, falls doch
- Schussverhalten - Datenbanken für Sound und
Grafik - Vererbungshierarchien im Detail -
Animationen gt Zwischensequenzen - Auch
Feinde haben das Recht recycelt zu werden! -
Viele bunte Items - Karls magisches
Schutzschild - Zusammenspiel und Abhängigkeiten
zwischen Objekten gt Wände und Feinde -
Intelligente Feinde - Animierte Feinde - Die
Pausefunktion versteckte Problematik - Ein
Ladebildschirm - Geschichten eines Entwicklers
gt Nette Bugs! (Freude am Iterator)
39
8. Danksagung und Ressourcen
Großen Dank an... ... Tobias Herborth für seine
Nachhilfe in Sachen Animation, Threads und
Softwaredesign. ... Rebecca Trippe für ihre
tollen Charakterdesigns und Spielgrafiken. ...
Nicolas Schmid für nützliche Tipps und seine
ausgiebigste Misshandlung unserer
Engine. ... Herrn Walter Kriha für sein Talent,
uns massiv zu motivieren. ... alle Studenten,
die uns durch ihre Design Patterns Präsentation
in vielerlei Hinsicht die Augen geöffnet
haben. ... nicht zuletzt alle Testspieler,
Kritiker und Versuchkaninchen (Die Flosse
bleibt!)
Ressourcen - GOF-Book (Die Pattern-Bibel) -
http//java.sun.com - Spieleentwicklung in
Java http//fivedots.coe.psu.ac.th/ad/jg/ind
ex.html - Java2D, OReilly-Verlag
Write a Comment
User Comments (0)
About PowerShow.com