ROBERT NYSTROM GAME PROGRAMMING PATTERNS III.8 Thema: Sequencing Patterns Seminar: Softwaretechnologie II (Teil 2) Dozent: Prof. Dr. Manfred Thaller Referent:

Slides:



Advertisements
Ähnliche Präsentationen
der Universität Oldenburg
Advertisements

Objektorientierte Programmierung
der Universität Oldenburg
Klassen - Verkettete Liste -
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
Rekursion Was ist Rekursion? Was sind rekursive Methoden?
Ultris V10 Bewegen, Drehen und Kollisionserkennung.
Prof. Dr.-Ing. habil. B. Steinbach - Informatik / Softwaretechnologie und Programmierungstechnik - Institut für Informatik Verteilte Software - Java -
Verteilte Software - Java - Prozedurale Programmierung 1
Java: Dynamische Datentypen
Listen Richard Göbel.
FH-Hof Verwaltung von Zeichenketten Richard Göbel.
Algorithmen und Datenstrukturen
Algorithmen und Datenstrukturen
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (07 - Skiplisten) Prof. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (05 – Elementare Datenstrukturen) Prof. Th. Ottmann.
Informatik II, SS 2008 Algorithmen und Datenstrukturen Vorlesung 6 Prof. Dr. Thomas Ottmann Algorithmen & Datenstrukturen, Institut für Informatik Fakultät.
Softwaretechnologie II (Teil 1): Simulation und 3D Programmierung
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik I Vorlesung Listen-
PRJ 2007/1 Stefan Dissmann Motivation Problem: gleiche Datenstrukturen werden für verschiedene Objekte gebraucht: z.B. Listen von Studierenden, Kunden,
Zusammenfassung Vorwoche
Abstrakter Datentyp in C++ I - Klasse -
1DVG3 - Paint Paint ein Zeichenprogramm. DVG3 - Paint 2 Paint – ein Zeichenprogramm.
DVG Interfaces. DVG mehrfache Vererbung 4 Mehrfache Vererbung ist die Ableitung einer Klassen von mehreren anderen Klassen. –farbigerPunkt.
DVG Klassen und Objekte
Bubbelsort und Quicksort Vortrag von Rolf Heitzenröder
3D Programmierung Version 12 - Highscores. Die vom Spieler erzielte Punktzahl wird mit 5 vorgegebenen Punktzahlen verglichen und, falls nötig, in die.
Seite 1 Interface - Konzept Ein Interface führt einen neuen Datentyp ein: interface Frau {... } Das Interface enthält Deklarationen ( keine Definitionen.
Telecooperation/RBG Technische Universität Darmstadt Copyrighted material; for TUD student use only Grundlagen der Informatik I Thema 14: Schrittweise.
Wir haben gesehen Das Gerüst ist bei JavaKara fix vorgegeben
Einführung in die Programmierung
Einführung in die Programmiersprache C 3.Tag Institut für Mathematische Optimierung - Technische Universität Braunschweig.
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
Game Development mit LUA Integration und Kommunikation von LUA mit C++ Referat von Paul van Hemmen Seminar: Reusable Content in 3D und Simulationssystemen.
Einführung in die Programmierung Wintersemester 2012/13 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Informatik 1 Letzte Übung.
Abteilung für Telekooperation Übung Softwareentwicklung 1 für Wirtschaftsinformatik Dr. Wieland Schwinger
2.4 Rekursion Klassifikation und Beispiele
Unterprogramme in JAVA
Aufruf einer Methode eines Objektes vom Typ „Bruch“
Purga - Scriptengine Ein Einblick.
Unity 4.x Cookbook Softwaretechnologie II (Teil 2) - Maximilian Berndt.
Java-Kurs - 8. Übung Besprechung der Hausaufgabe.
Polymorphie (Vielgestaltigkeit). Wenn eine Methode, wie z.B. print für verschiedene Programmteile steht (und z.B. einmal Objekte verschiedener Klassen.
C++ SFINAE inkl. std::enable_if
Softwaretechnologie für Fortgeschrittene Teil Thaller Stunde III: Bildverarbeitung III Köln 8. Januar 2015.
Random & Probability Universität zu Köln Institut für Medienkultur und Theater AM3: Visuelle Programmierung II WS 2013/2014 Dozent: Prof. Manfred Thaller.
1 // Heap als ADT // JW: V1.0 // Vorlage gemaess EED-Quelltext // #include #include // für double pow (double d, int i) #include // fuer INT_MIN.
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/ Übungsaufgabe vom Logische Ausdrücke 1.true & false | true 2.(10>2)
Diskrete Mathe Diskrete Mathematik I Listen Vorlesung 4.
GAME PROGRAMMING PATTERNS – FLYWEIGHT & OBSERVER Robert Nystrom Softwaretechnologie II Teil 2 Anike Schulz.
Game Loop & Update Method Robert Nystrom – Game Programming Patterns Universität zu Köln Historisch-Kulturwissenschaftliche Informationsverarbeitung SS.
Controller Werkstatt updaten Werkstatt ws = werkstattarray.get(werkstattId); ws.setName(name); ws.setAnsprechpartner(ansprechpartner); ws.setTelefonnummer(telefonnummer);
Java Programme nur ein bisschen objektorientiert.
Tutorium Software-Engineering SS14 Florian Manghofer.
Dr. Wolfram Amme, Virtuelle Vererbung, Informatik II, FSU Jena, SS Auflösung von Konflikten bei Mehrfachvererbung Umbenennung mehrdeutiger Methoden.
1.Event Queue.
JAVA lernen: Methoden.
Aufgaben zu Rückgabewerten
Cäsar-Verschlüsselung
Grundkurs Informatik mit Java
Cäsar-Verschlüsselung
 Präsentation transkript:

ROBERT NYSTROM GAME PROGRAMMING PATTERNS III.8 Thema: Sequencing Patterns Seminar: Softwaretechnologie II (Teil 2) Dozent: Prof. Dr. Manfred Thaller Referent: Alexander Abboud Universität zu Köln - Sommersemester 2015

Sequencing Patterns Jede Welt braucht eine Zeit  „Spieluhr“ muss für virtuelle Welten erfunden + eingebaut werden Double Buffer Game Loop Update Method

Sequencing Patterns Jede Welt braucht eine Zeit  „Spieluhr“ muss für virtuelle Welten erfunden + eingebaut werden Double Buffer Problem: Welt soll simultan nicht sequenziell erscheinen Lösung hierfür: Momentaufnahmen Game Loop Update Method

Double Buffering Beispiel: Flackern von Grafikinhalten Bild wird aus dem Framebuffer gelesen

Tearing / Flickering

Lösung: Double Buffering Vergleich mit verschiedenen Bühnen eines Theaterstücks  2 Framebuffer von einem wird gelesen, Bild auf ihm immer vollständig auf den anderen wird geschrieben anschließend: Tausch der beiden

Wann und Wie? Wann? Grafikinfos werden schrittweise verändert  Veränderungen sollen aber erst nach Abschluss zu sehen sein Tearing ist vorhanden (untere Bildteile fehlen). Das Bild flackert. Wie? Bufferklasse mit a) nächstem Buffer auf den geschrieben wird b) aktuellem Buffer von dem gelesen wird c) Tauschfunktion

class Framebuffer { public: Framebuffer() { clear(); } void clear() // der gesamte Buffer (jeder Pixel) wird auf weiß gesetzt { for (int i = 0; i < WIDTH * HEIGHT; i++) { pixels_[i] = WHITE; } void draw(int x, int y) // die in draw() aufgerufenen Pixel werden schwarz { pixels_[(WIDTH * y) + x] = BLACK; } const char* getPixels() { return pixels_; } private: static const int WIDTH = 160; static const int HEIGHT = 120; char pixels_[WIDTH * HEIGHT]; }; class Scene { public: void draw() { buffer_.clear(); buffer_.draw(1, 1); buffer_.draw(4, 1); buffer_.draw(1, 3); buffer_.draw(2, 4); buffer_.draw(3, 4); buffer_.draw(4, 3); } Framebuffer& getBuffer() { return buffer_; } private: Framebuffer buffer_; };

class Scene { public: // an dieser Stelle sind nun 2 Buffer: keine direkte Referenzierung, sondern 2 Pointer Scene() : current_(&buffers_[0]), // aus diesem Buffer wird immer gelesen next_(&buffers_[1]) // in diesen wird immer geschrieben {} void draw() { next_->clear(); next_->draw(1, 1); //... next_->draw(4, 3); swap(); // Aufruf am Ende des Zeichnens der swap-Funktion } Framebuffer& getBuffer() { return *current_; } private: void swap() { // Pointer werden einfach ausgetauscht Framebuffer* temp = current_; current_ = next_; next_ = temp; } Framebuffer buffers_[2]; Framebuffer* current_; Framebuffer* next_; };

Nicht nur für Grafiken: Beispiel 2 Spiel, bei dem sich Spieler gegenseitig schlagen, wenn sie selbst geschlagen wurden sie werden in eine Reihenfolge gestellt  immer der Nachfolgende wird geschlagen jeder Spieler erhält einen „slapped_“ Status das Ergebnis einer Runde soll dem User direkt sichtbar sein class Actor { public: Actor() : slapped_(false) {} // initial: nicht geschlagen virtual ~Actor() {} virtual void update() = 0; // bei jedem Frame, wird ein update aufgerufen void reset() { slapped_ = false; } void slap() { slapped_ = true; } // wenn ein anderer Spieler geschlagen wird bool wasSlapped() { return slapped_; } // wenn der Spieler selbst geschlagen wurde private: bool slapped_; };

class Stage { public: void add(Actor* actor, int index) { actors_[index] = actor; } void update() { for (int i = 0; i < NUM_ACTORS; i++) { actors_[i]->update(); actors_[i]->reset(); } private: static const int NUM_ACTORS = 3; Actor* actors_[NUM_ACTORS]; }; class Comedian : public Actor { public: void face(Actor* actor) { facing_ = actor; } virtual void update() { if (wasSlapped()) facing_->slap(); } private: Actor* facing_; }; die Spieler werden auf Stage verteilt mit der 1x pro Frame aufgerufenen update()- Methode werden die Spieler nacheinander geupdated sorgt dafür, dass ein geschlagener Spieler seinen Gegenüber („facing“) schlägt

Beispiel 2 Durch verschiedenes Positionieren der Spieler, kommen allerdings unterschiedliche Ergebnisse heraus: harry->slap(); stage.update(); Stage updates actor 0 (Harry) Harry was slapped, so he slaps Baldy Stage updates actor 1 (Baldy) Baldy was slapped, so he slaps Chump Stage updates actor 2 (Chump) Chump was slapped, so he slaps Harry Stage update ends harry->slap(); stage.update(); Stage updates actor 0 (Chump) Chump was not slapped, so he does nothing Stage updates actor 1 (Baldy) Baldy was not slapped, so he does nothing Stage updates actor 2 (Harry) Harry was slapped, so he slaps Baldy Stage update ends

Double Buffered Objects auch hier kann Double Buffering helfen jeder Spieler kriegt 2 slapped_ states: currentSlapped_  hieraus wird gelesen nextSlapped_  hier wird hineingeschrieben mit update() werden erste alle Statusse geupdated anschließend mit swap() getauscht

Besonderheiten swap()-Methode Performance und Komplexität vorheriger Inhalt wichtig?

Vielen Dank für die Aufmerksamkeit!