Universität Osnabrück Fachbereich Mathematik / Informatik. Prof. Dr. rer. nat. Oliver Vornberger Nico Marniok, B. Sc. Erik Wittkorn, B. Sc.

Ähnliche Dokumente
Universität Osnabrück Fachbereich Mathematik / Informatik. 9. Übung. Prof. Dr. rer. nat. Oliver Vornberger Nico Marniok, B. Sc. Erik Wittkorn, B. Sc.

Einführung in die Programmierung 1

Vorkurs Informatik WiSe 17/18

TU Kaiserslautern. Übungsblatt 2: Software-Entwicklung 1 (WS 2017/18) Hinweise zu Einreichaufgaben. Hinweise zu den Übungen

Graphische Benutzungsoberflächen mit Java. Einführung in NetBeans

Programmieren in Haskell Debugging

Universität Osnabrück Fachbereich Mathematik / Informatik. 4. Vorlesung ( )

Übungen zur Android Entwicklung

2 Teil 2: Nassi-Schneiderman

Drei-Schichten-Architektur. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 16: 3-Schichten-Architektur 1 Fachkonzept - GUI

Repetitorium Informatik (Java)

Begleitendes Praktikum zur Vorlesung Künstliche Intelligenz

Einführung in die Programmierung I. 1.0 EBNF 2.0 Einfache Java Programme. Thomas R. Gross. Department Informatik ETH Zürich

Programmieren in Java -Eingangstest-

Institut für Programmierung und Reaktive Systeme. Java 6. Markus Reschke

C# - Einführung in die Programmiersprache Methoden. Leibniz Universität IT Services

Themen der Übung. Methoden und Wrapperklassen. Vorteile von Methoden. Methoden. Grundlagen

Applets I. Grundlagen der g Applet-Programmierung

/** Main-Methode erzeugt einen neuen Editor zum Testen */ public static void main(string[] args) { new Editor();

Methoden und Wrapperklassen

Eine JAVA Einführung ... Quellcode:... COMA Übung 3. T.Bosse. A.Griewank. Vorschau JAVA Programme Sprachen Kate

Methoden. Gerd Bohlender. Einstieg in die Informatik mit Java, Vorlesung vom

Einstieg in die Informatik mit Java

ProgWerkstatt 7. Dezember 2006 Tipps & Tricks. GUI Programmierung

V by WBR1/BFH-TI 2011 by MOU2/BFH-TI

Einstieg in die Informatik mit Java

Windows Presentation Foundation (WPF) -Grundlagen -Steuerelemente. Dr. Beatrice Amrhein

Vorlesung Programmieren

Informatik II Übung, Woche 10

Informatik II Prüfungsvorbereitungskurs

Einstieg in die Informatik mit Java

Vorkurs Informatik WiSe 15/16

GUI-Entwicklung 2: Windows Presentation Foundation

Institut für Programmierung und Reaktive Systeme 5. Dezember Programmieren I. 5. Übungsblatt

Klassen und Objekte. Klassen sind Vorlagen für Objekte. Objekte haben. Attribute. Konstruktoren. Methoden. Merkblatt

Programmierstarthilfe SS 2008 Fakultät für Ingenieurwissenschaften und Informatik 8. Blatt Für den 16. und

Einstieg in die Informatik mit Java

WPF Steuerelemente. Dr. Beatrice Amrhein

Interface. So werden Interfaces gemacht

Applets Belebung von Webseiten. Dipl.-Ing. Wolfgang Beer

Programmieren lernen mit Groovy Graphische Oberflächen GUIs (Graphical User Interfaces)

(6) Verknüpfen der GUI mit dem Spiel

Informatik B von Adrian Neumann

Intensivübung zu Algorithmen und Datenstrukturen

Grundlagen der Objektorientierten Programmierung - IO-Tools

R-Fehlermeldungsleitfaden

Übungsstunde 10. Einführung in die Programmierung

Ausdrucksbäume in verschiedenen Darstellungen

Aufgabenblatt 1: - Präsenzübung für die Übungen Do Mi Ausgabe Mi

Einführung in die Programmierung I. 2.0 Einfache Java Programme. Thomas R. Gross. Department Informatik ETH Zürich

Vorlesung Programmieren

Jetzt sollt ihr von der Vorlage der Grundversion 1.0 ein eigenes Textadventure erstellen.

Einstieg in die Informatik mit Java

1 Organisatorisches. 2 Compilezeit- und Laufzeitfehler. 3 Exceptions. 4 Try-Catch-Finally

(3) Button-Klick & Texteingabe

Übungen zu Programmieren - Code-Formatierung -

Prof. Dr. Oliver Haase Karl Martin Kern Achim Bitzer. Programmiertechnik GUI-Programmierung mit Swing

Einstieg in die Informatik mit Java

Algorithmen zur Datenanalyse in C++

7.0 Arbeiten mit Objekten und Klassen

Handbuch für die Erweiterbarkeit

Universität Osnabrück Fachbereich Mathematik / Informatik. 8. Vorlesung ( )

Übung 1: Installation + Test von Eclipse. Übung 2: Hello World

Wie kann man es verhindern das Rad immer wieder erneut erfinden zu müssen?

1 Software Engineering 1

Javakurs für Anfänger

Programmieren in Java

ÜBUNGS-BLOCK 1 LÖSUNGEN

Multimedia im Netz Wintersemester 2012/13

Java: Eine kurze Einführung an Beispielen

Praktische Übung. Die Lernplattformen ILIAS ist mit Stud.IP verbunden, sodass Sie Lernmodule dieser Plattform

Autor: Michael Spahn Version: 1.0 1/10 Vertraulichkeit: öffentlich Status: Final Metaways Infosystems GmbH

Einfache Liste: Ein Stapel (Stack) Ansatz. Schaubild. Vorlesung 1. Handout S. 2. Die einfachste Form einer Liste ist ein Stapel (stack).

Einstieg in die Informatik mit Java

Praktikum zu Einführung in die Informatik für LogWings und WiMas Wintersemester 2013/14

Informatik II Übung 2

Institut fu r Informatik

Eclipse Tutorial.doc

Objektorientierte Programmierung OOP Objektorientierte Programmierung (OOP) mit Java

Exceptions. CoMa-Übung VII TU Berlin. CoMa-Übung VII (TU Berlin) Exceptions / 1

Folienpaket 7 Themenschwerpunkte: Methoden in OOP /2016 Dr. Daniel Haase - Vorkurse Informatik V3/V4

Praktikum zu XML: Übung 11

Einführung in das Programmieren

Kapitel 1: Informationsverarbeitung durch Programme

GATE General Architecture for Text Engineering. Alexander Hein & Erik Dießler (VL Text Analytics )

Primitive Datentypen

Einstieg in die Informatik mit Java

DOM Document Object Model

Einführung in die Programmierung für NF MI. Übung 07

Distributed Computing Group

Last update: :39 hilfe:grundlagen

Tag 3 Repetitorium Informatik (Java)

Medienproduktion Sommersemester Dipl.-Inform. Alexander Schulze Prof. Dr. Ing. Klaus Rebensburg

Ausnahmebehandlung. Ausnahmen werfen (auslösen) Eigene Ausnahmen definieren. Ausnahmen abfangen. Ausnahmen definieren

Praktikum zur Veranstaltung XML-Technologie: Übung 09

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12 1. Kapitel 11. Listen. Listen

public class SternchenRechteckGefuellt {

Praktikum zu Einführung in die Informatik für LogWiIngs und WiMas Wintersemester 2017/18. Vorbereitende Aufgaben

Transkript:

Universität Osnabrück Fachbereich Mathematik / Informatik Prof. Dr. rer. nat. Oliver Vornberger Nico Marniok, B. Sc. Erik Wittkorn, B. Sc. 1

Organisatorisches 1 Vorlesung + 1 Übung, 6 ECTS, zählt als Praktikum! Vorlesung: Montags, 12:00 14:00, regelmäßige Teilnahme erwünscht! Gehalten von Nico Marniok Übung: Dienstags, 12:00 14:00, regelmäßige Teilnahme erwünscht! Gehalten von Erik Wittkorn Erste Übung am 09.04.2013! Testate alle 2 Wochen in 2er Teams Ausgabe Übungsaufgaben: Alle 2 Wochen dienstags, ab 09.04.2013 (1. Übung) Abgabe Lösungen: Alle 2 Wochen freitags, ab 19.04.2013, 23:59 Vorstellung einer Lösung alle 2 Wochen dienstags in der Übung ab 23.04.2013 Größeres Projekt am Ende der Vorlesungszeit über 2 Wochen in 2er Teams Zwischenpräsentation nach einer Woche vor Erik und Nico Endpräsentation nach zwei Wochen vor Herrn Vornberger Tipp: Bereitet die Endpräsentation sehr gut vor und haltet die zur Verfügung stehende Zeit unbedingt ein! 2

Organisatorisches Voraussetzungen Informatik A Computergrafik Wird erst in der zweiten Hälfte relevant Empfohlen: Informatik B, Grundwissen Lineare Algebra (Matrizen- und Vektorrechnung im R 4 ) Literatur Game Coding Complete, Fourth Edition Mike McShaffry and David "Rez" Graham Course Technology, 2012 Software NetBeans http://www.netbeans.org/ eclipse http://www.eclipse.org LWJGL http://www.lwjgl.org/ Luaj http://luaj.org/luaj/readme.html jbullet http://jbullet.advel.cz/ 3

Game-Engines / 3D-Engines A game engine is a system designed for the creation and development of video games. Wikipedia, Game engine, 23.03.2013 4

Beispiel: Gamebryo / Creation Engine Fallout New Vegas (Bethesda Softwors / Obsidian) The Elder Scrolls V: Skyrim (Bethesda Softworks) 5

Beispiel: CryEngine 1 / 2 / 3 Crysis 3 (Crytek) Crysis (Crytek) 6

Beispiel: Blender 7

Blick auf eine Engine: Endnutzer Der Benutzer stellt an interaktive Programme mit Grafikausgabe sehr hohe Erwartungen, z.b. Die Ausgabe soll in Echtzeit und mit einer stabilen Bildwiederholrate geschehen Das Programm soll stabil gegenüber chaotischen oder sehr schnellen Eingaben sein Reihenfolge der Eingaben muss beachtet werden Es sollen keine Eingaben verloren gehen Die Ausgabe soll den Eingaben entsprechen 8

Blick auf eine Engine: Endnutzer Warum sind diese Erwartungen sehr hoch? Eine Vielzahl von Systemen müssen kooperativ arbeiten Input lesen Grafik- / Soundausgabe Spielwelt simulieren Physik berechnen Daten laden Berechnungen während der Ausführung dürfen nicht ewig dauern Anmerkung: Ewig = Zeitspanne > 50ms 9

Anforderungen vom Entwickler Engine soll übersichtlich sein Komponenten sollen möglichst voneinander getrennt sein Stichwort: Arbeiten im Team Leicht zu erweitern Engine soll für viele Projekte wiederverwendbar sein Plattformübergreifende Entwicklung Kompilieren nach kleinen Änderungen soll nicht ewig dauern Anmerkung: Ewig = Zeitspanne > 30sec 10

Implementation eines Spielelements Was soll passieren? (Kurze Beschreibung des Features) Wann soll es passieren? (Unmittelbarer Auslöser) Was sind die Voraussetzungen? (Mittelbare Auslöser) Was sind die sicheren Folgen? Was sind die möglichen Folgen? 11

Beispiel: Minecraft Was Block wird angegraben Wann Spieler benutzt Werkzeug (oder leere Hände) Voraussetzungen Spieler blickt auf Block Block ist abbaubar Direkte Folgen Sound abspielen Animation abspielen Schaden des Blocks neu berechnen und setzen Mögliche Folgen Schadenstextur des Blocks aktualisieren Block zerstören 12

Beispiel: Minecraft Genauer: Block zerstören bedeutet Block aus Grafiksystem entfernen Block aus Spielelogik entfernen Block aus Physiksystem entfernen Evtl. Überreste generieren Spielelemente, mit ähnlichen Folgen TNT zünden Block per Skript entfernen (Adventuremodus / Mods) 13

Beispiel: Minecraft Merke Spielelemente neigen zu wenigen direkten Folgen vielen möglichen Folgen Verschiedene Spielelemente haben gleiche Folgen Resultierende direkte Implementation Umfangreiche Methode, die alle Spielelemente durchgeht und Ursachen / Voraussetzungen prüft Viele bedingte Ausdrücke Doppelter Code oder viele kleine Methoden mit Folgenclustern 14

Beispiel: Minecraft Direkte Implementation private void update() { Block b = player.getaimedblock(); if(mouse.isbuttondown(0) && b!= null) { Item item = player.getitem(); float progress = item.getanimationprogress(hit_id); if(progress == 0.0) { GraphicsSystem.startAnimation(item, HIT_ID); SoundSystem.startSound(item, HIT_ID); } int damage = item.getdamage(); int deltadamage = 1; switch(item.getid()) { case PICKAXE_DIAMOND_ID: deltadamage = 20; break; case PICKAXE_WOOD_ID: deltadamage = 2; break; //... } damage += deltadamage; if(damage > 100) { Scene.remove(b); Scene.create(b.getRemainingsForTool(item)); } else { b.setdamage(damage); GraphicsSystem.setTexture(item, ResourceSystem.getDamageTexture(damage)); } } } 15

Beispiel: Minecraft Vorteile der Methode update() Man sieht auf einen Blick, was alles passiert Nachteile Wird extrem lang Übersicht beginnt schnell zu leiden Viele Entwickler arbeiten an derselben Datei Referenziert viele andere Systeme (Grafik, Sound, Ressourcen, ) Dadurch muss die Datei selbst neu kompiliert werden, wenn sich ein einziges dieser Systeme ändert oder erweitert wird Alle Aktionen werden auf einmal durchgeführt Dadurch kann es passieren, dass das Spiel kurz stockt Mehr Nachteile werden schnell ersichtlich, wenn man das ganze Spiel auf diese Weise programmiert 16

Besser: Eventgesteuerte Engine Aktionen des Spielers erzeugen Events Beispiel: StartHittingEvent Spielwelt erzeugt Events Beispiel: WeatherChangedEvent KI erzeugt Events Beispiel: CreeperExplodedEvent Kurz: Alles erzeugt Events 17

Events Komponenten der Engine können auf verschiedenste Events hören Beispiel: Grafiksystem hört auf BlockDamageChangedEvent BlockDestroyedEvent WeatherChangedEvent ExplosionEvent Trennung von Ursache und Folge Wichtig ist nur, dass etwas passiert ist; nicht wie 18

Beispiel: BlockDestroyedEvent public void init() { EventManager.registerListener(this, BlockDestroyedEvent.ID); //... } @Override public void trigger(eventdata data) { switch(data.getid()) { case BlockDestroyedEvent.ID: BlockDestroyedEvent evt = (BlockDestroyedEvent)data; this.removeblock(evt.getblockid()); break; //... } } 19

Eventgesteuerte Engine Neue Spielelemente hinzufügen Was soll passieren? (Kurze Beschreibung des Features) Wann soll es passieren? (Unmittelbarer Auslöser) Was sind die Voraussetzungen? (Mittelbare Auslöser) Welche Events werden geworfen? Neue Komponenten hinzufügen Wie wird die Komponente beeinflusst (Auf welche Events hört sie?) Mehr dazu: nächste Woche 20

Wichtige Grundlagen: XML XML = extensible Markup Language Geschichtlicher Überblick Siehe Wikipedia Mit XML lässt sich alles Mögliche beschreiben Lässt sich sehr gut parsen und ist gut lesbar für den Menschen Eignet sich besonders gut, um Levels, GUIs, Actors usw. zu beschreiben 21

XML Aufbau: Markup vs. Content Inhalt als Klartext (Strings) Zwei Grundtypen Markup Strings, die mit < beginnen und mit > enden Strings, die mit & beginnen und mit ; enden (unwichtig) Content: alles, was kein Markup ist Beispiel <RectShape> <Position x= 4 y= 3 /> <Size width= 2 height= 7 /> <Color>Yellow</Color> </RectShape> 22

XML Aufbau: Tags Tags Texteinheit, die mit < beginnt und mit > endet, ist ein Tag Man unterscheidet 3 Typen Beispiel Start-tag: Inhalt beginnt und endet mit einem Buchstaben End-tag: Inhalt beginnt mit einem Slash / Empty-element-tag: Inhalt beginnt mit einem Buchstaben und endet mit einem Slash / <RectShape> <Position x= 4 y= 3 /> <Size width= 2 height= 7 /> <Color>Yellow</Color> </RectShape> 23

XML Aufbau: Attribute Attribute Ein Konstrukt der Form name= value innerhalb eines Tags name darf nur anständige Zeichen enthalten value darf beliebige Zeichen außer doppelte Anführungszeichen enthalten Beispiel Maskieren mittels Backslash (\ ) funktioniert nicht! <RectShape> <Position x= 4 y= 3 /> <Size width= 2 height= 7 /> <Color>Yellow</Color> </RectShape> 24

XML Aufbau: Elemente Elemente, 2 verschiedene Typen Texteinheit, beginnend mit Start-tag und dazu passendem End-tag Die Texteinheit zwischen den beiden korrespondierenden Tags ist der Content des Elements Kann wieder Elemente enthalten, die dann Kindelemente des Elements genannt werden (Baumstruktur) Ein einzelnes Empty-element-tag Beispiel <RectShape> <Position x= 4 y= 3 /> <Size width= 2 height= 7 /> <Color>Yellow</Color> </RectShape> 25

XML als Baum <RectShape> <Position x= 4 y= 3 /> <Size width= 2 height= 7 /> <Color>Yellow</Color> </RectShape> RectShape Position Size Color x= 4 y= 3 width= 2 height= 7 #text: Yellow 26

XML in Java Wir werden DOM benutzen XML wird komplett eingelesen und in einen Baum überführt Einfaches Traversieren des Baums (Java 1.7): Node node = root.getfirstchild(); while(node!= null) { switch(node.getnodename()) { case "CubeShape": this.initcube(node); break; } node = node.getnextsibling(); } 27

XML, Beispiel GUI <Gui name="overlay"> <Button text="new Game" x="608" y="-64" width="64" height="64" action="events.newgameevent" /> <Label text="pre-alpha" x="16" y="-16" width="256" height="32" /> <Button text="res:textures/quit.png" x="-8" y="-8" width="48" height="48" action="events.quitevent" /> <Button text="res:textures/save.png" x="256" y="256" width="32" height="32" action="events.saveevent" /> </Gui> 28

Wichtige Grundlagen: Logging Szenario: KI-Programmierer braucht Ausgaben, um einen Fehler zu finden Actor badguy = this.getactor("badguy"); Route route = badguy.findroute(this.player); if(route!= null) { for(vector3f waypoint : route.getwaypoints()) { System.out.print(waypoint + " -> "); } System.out.println("\n" + route.getwaypoints().size()); } else { System.err.println("No way!"); // Bill and Ted: Yes way!! } 29

Ausgabe des Codes 17 stop Vector3f[1.0, 0.0, 2.0] -> Vector3f[0.7, 0.0, 2.3] -> Vector3f[1.3, 0.0, 1.4] -> Vector3f[0.7, 0.0, 1.6] -> Vector3f[0.5, 0.0, 1.5] -> 5 done Vector3f[1.0, 1.0, 1.0] Actor created: 178 No way! ***************************************************** ******Vector3f[0.2, 0.0, 0.3] -> Vector3f[0.7, 0.0, 0.1] -> 2 30

Probleme Verschiedene Programmierer erzeugen unterschiedliche Debuggingausgaben Niemand wird vor jede seiner Ausgaben schreiben, dass er / sie dafür verantwortlich ist oder wo das zugehörige println im Programm zu finden ist Projekt nach System.out.println durchsuchen Found 127 matches of System.out.println in 41 files Besser automatische Angabe der Datei und Zeile einer Ausgabe Filtern der Ausgabe 31

Ansatz Logger Programm umschreiben und dabei statt System.out die Klasse Logger benutzen Actor badguy = this.getactor("badguy"); Route route = badguy.findroute(this.player); if(route!= null) { String out = ""; for(vector3f waypoint : route.getwaypoints()) { out += waypoint + " -> "; } Logger.INSTANCE.info(out); Logger.INSTANCE.info(route.getWayPoints().size()); } else { Logger.INSTANCE.warning("No way!"); // Bill and Ted: Yes way!! } 32

Ausgabe des Codes [INFO] VertexBuffer.java, 23: 17 [ERROR] GameLogic.java, 123: stop [INFO] AiHandler.java, 37: Vector3f[1.0, 0.0, 2.0] -> Vector3f[0.7, 0.0, 2.3] -> Vector3f[1.3, 0.0, 1.4] -> Vector3f[0.7, 0.0, 1.6] -> Vector3f[0.5, 0.0, 1.5] -> [INFO] AiHandler.java, 38: 5 [INFO] MeshLoader.java, 100: done [INFO] GameLogic.java, 55: Vector3f[1.0, 1.0, 1.0] [INFO] GameLogic.java, 21: Actor created: 178 [WARNING] AiHandler.java, 40: No way! [INFO] GameLogic.java, 67: ****************************** [INFO] AiHandler.java, 37: Vector3f[0.2, 0.0, 0.3] -> Vector3f[0.7, 0.0, 0.1] -> [INFO] AiHandler.java, 38: 2 33

Ausgabe des Codes Nach eingestelltem Filter [INFO] AiHandler.java, 37: Vector3f[1.0, 0.0, 2.0] -> Vector3f[0.7, 0.0, 2.3] -> Vector3f[1.3, 0.0, 1.4] -> Vector3f[0.7, 0.0, 1.6] -> Vector3f[0.5, 0.0, 1.5] -> [INFO] AiHandler.java, 38: 5 [WARNING] AiHandler.java, 40: No way! [INFO] AiHandler.java, 37: Vector3f[0.2, 0.0, 0.3] -> Vector3f[0.7, 0.0, 0.1] -> [INFO] AiHandler.java, 38: 2 34

Nächste Woche: Übersicht Aufbau einer Engine GameApp GameLogic GameView Detailliert: GameApp Detailliert: EventManager 35