MMProg: Praktikum: WiSe 2017/18: Ball03: Unterschied zwischen den Versionen
Kowa (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
Kowa (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
||
| Zeile 37: | Zeile 37: | ||
Dabei handelt es sich um eine App, die im Sinne des zweiten Teils des Tutoriums erstellt wurde. | Dabei handelt es sich um eine App, die im Sinne des zweiten Teils des Tutoriums erstellt wurde. | ||
Sehen Sie sich zunächst diese App an und analysieren Sie, wie diese funktioniert. | Sehen Sie sich zunächst diese App an und analysieren Sie, wie diese funktioniert. | ||
Beachten Sie insbesondere | Beachten Sie insbesondere Folgendes: | ||
* Es wird ein Ball-Modell erzeugt, mit Attributen „Radius“, „Position“, „Geschwindigkeit“ und „Beschleunigung“. | * Es wird ein Ball-Modell erzeugt, mit Attributen „Radius“, „Position“, „Geschwindigkeit“ und „Beschleunigung“. | ||
| Zeile 44: | Zeile 44: | ||
* Bei einer Kollission mit dem Bühnenrand ändert er seine Bewegungsrichtung. | * Bei einer Kollission mit dem Bühnenrand ändert er seine Bewegungsrichtung. | ||
Die gesamte beschriebene Spiellogik ist in einer Datei enthalten: <code> | Die gesamte beschriebene Spiellogik ist in einer Datei enthalten: <code>game00.js</code>. So eine Datei bezeichne ich als '''Moloch'''. | ||
Das Prinzip „Implementiere keinen Moloch“ nennt man fachsprachlich „[[Modularisierung]]“. | Das Prinzip „Implementiere keinen Moloch“ nennt man fachsprachlich „[[Modularisierung]]“. | ||
Beachten Sie, dass das Programm gar nicht so molochartig | Beachten Sie bitte auch, dass einige Attribute und Funktionen gegenüber dem zweiten Teil des Praktikums umbenannt wurden. | ||
Eigentlich ist das Programm gar nicht so molochartig, wie es zunächst scheint. Es kommen schon einige | |||
Module zum Einsatz: | Module zum Einsatz: | ||
| Zeile 54: | Zeile 56: | ||
* <code>pixi.js</code>: Eine sehr mächtige 2D-Grafik-Bibliothek, die sehr modular aufgebaut ist. | * <code>pixi.js</code>: Eine sehr mächtige 2D-Grafik-Bibliothek, die sehr modular aufgebaut ist. | ||
* <code>GameLoopPixi</code>: Eine Game-Loop-Klasse, die Ihnen im Rahmen des Praktikums zur Verfügung gestellt wird. Diese Modul benutzt seinerseits das Hilfsmodul <code>EventDispatcher</code>. | * <code>GameLoopPixi</code>: Eine Game-Loop-Klasse, die Ihnen im Rahmen des Praktikums zur Verfügung gestellt wird. Diese Modul benutzt seinerseits das Hilfsmodul <code>EventDispatcher</code>. | ||
* <code>app0.js</code>: Das Hauptmodul. Es stellt mit Hilfe der zuvor genannten Module die Spielumgebung zur Verfügung: Eine PIXI-Bühne, eine Gameloop sowie eine CSS-Datei. Sobald die Umgebung erstellt und initialisiert wurde, startet diese Modul das eigentliche Spielmodul <code> | * <code>app0.js</code>: Das Hauptmodul. Es stellt mit Hilfe der zuvor genannten Module die Spielumgebung zur Verfügung: Eine PIXI-Bühne, eine Gameloop sowie eine CSS-Datei. Sobald die Umgebung erstellt und initialisiert wurde, startet diese Modul das eigentliche Spielmodul <code>game00.js</code>. | ||
* <code>app0.js</code>: Das immer noch molochartige Spielmodul, das im Rahmen des Praktikums in diverse Einzelmodule aufgeteilt werden wird. | * <code>app0.js</code>: Das immer noch molochartige Spielmodul, das im Rahmen des Praktikums in diverse Einzelmodule aufgeteilt werden wird. | ||
| Zeile 71: | Zeile 73: | ||
* <code>collision</code>: Ein Module, das eine Kollissionsfunktion bereit stellt. Diese Kollissionsfunktion ist für die Kollissionserkennung und -behandlung von (beweglichen) Kreisobjekten mit (unbeweglichen) Rändern der Bühne zuständig. | * <code>collision</code>: Ein Module, das eine Kollissionsfunktion bereit stellt. Diese Kollissionsfunktion ist für die Kollissionserkennung und -behandlung von (beweglichen) Kreisobjekten mit (unbeweglichen) Rändern der Bühne zuständig. | ||
Im Ordner <code>js/app/game01<code> finden Sie für jedes dieser drei Module eine Datei. Im Ordner <code>js<code> finden Sie außerdem das Hauptmodul | Im Ordner <code>js/app/game01</code> finden Sie für jedes dieser drei Module eine Datei. Im Ordner <code>js</code> finden Sie außerdem das Hauptmodul | ||
<code>app01.js<code>. Der notwendige Code, um die Spielumgebung bereitzustellen ist darin bereits denthalten. Ihre Aufgabe | <code>app01.js</code>. Der notwendige Code, um die Spielumgebung bereitzustellen ist darin bereits denthalten. Ihre Aufgabe | ||
ist es, die Funktionen und Klassen, die in den anderen | ist es, die Funktionen und Klassen, die in den anderen Dateien enthalten sind, zu implementieren. Welche Elemente die entsprechenden Module enthalten sollen, können Sie dem nebenstehenden Diagramm entnehmen. | ||
[[Datei:WK Ball03 ClassModel01.png|gerahmt|rechts|Klassendiagramm 1 mit Funktionen, Attributen und Methoden]] | |||
Gehen Sie folgendermaßen vor: | |||
* Kopieren Sie den Inhalt der Datei <code>game00.js</code> in die Datei <code>game01/game.js</code>, '''ohne die darin enthaltenen Import-Befehle zu überschreiben.''' (Wenn Sie jetzt <code>index01.html</code> im Browser öffnen, sollte der Ball über die Bühne flitzen – zumindest, wenn Sie nicht vergessen haben, <code>grunt watch</code> zu aktivieren :-) ) | |||
* Lagern Sie den Code der Kollissionserkennung und -behandlung aus der Funktion <code>modelUpdates</code> in die Funktion <code>collision</code> in der Datei <code>model/collision.js</code> aus. (''Achtung'': Der Code zur Berechnung der neuen Position und neuen Geschwindigkeit des Balls darf nicht in diese Datei ausgelagert werden.) Beachten Sie, dass die Funktion <code>collision</code> die Inputparameter <code>p_immovable</code> und <code>p_movable</code> besitzt. Die im kopierten Code enthaltenen Variablennamen <code>v_ball</code> und <code>v_stage</code> müssen entsprechend umbenannt werden. | |||
* Rufen Sie in der Funktion <code>modelUpdates</code> die neu erstellte (und von <code>game.js</code> auch schon importierte) Funktion <code>collision</code> geeignet auf. Bei einem Test der Web-Anwendung sollte sich der Ball wieder wie gewohnt über die Bühne bewegen. | |||
==Quellen== | ==Quellen== | ||
Version vom 16. November 2017, 10:40 Uhr
Dieser Artikel erfüllt die GlossarWiki-Qualitätsanforderungen nur teilweise:
| Korrektheit: 3 (zu größeren Teilen überprüft) |
Umfang: 4 (unwichtige Fakten fehlen) |
Quellenangaben: 3 (wichtige Quellen vorhanden) |
Quellenarten: 5 (ausgezeichnet) |
Konformität: 3 (gut) |
Inhalt | Game Loop 01 | Ball 02 | Ball 03 | Ball 03b | Pong 01
Musterlösung: SVN-Repository
Ziel
Ziel dieser Praktikumsaufgabe ist es, Lösungen des zweiten Teils des Tutoriums zu modularisieren. Die Modularisierung hat mehrere Vorteile:
- Das Prinzip „Don't repeat yourself“ (DRY) wird unterstützt. Um dies zu erreichen, muss sichergestellt werden, dass viele Module in diversen Projekten wiederverwendet werden können.[1][2]
- Mehrere Programmierer können gleichzeitig an einem Projekt arbeiten. Hier muss sichergestellt sein, dass möglichst saubere Schnittstellen definiert werden, damit ein Programmierer nicht ständig an die Änderungen eines anderen Programmierers anpassen muss. (Die Definition von Schnittstellen ist eine der Kernaufgaben von Informatikern. Dabei handelt es sich um einen kreativen Prozess. Der Programmierer hingegen braucht „lediglich“ die Spezifikation umzusetzen. Das ist i. Allg. deutliche weniger kreativ.)
- Jede Änderung an einem vorhandenen Code kann Fehler zur Fogle haben. Daher ist es von Vorteil, wenn ausgetestete, wiederverwendbare Module bestehen. Bei der Fehlersuche befindet sich der Code i. Allg. nicht in einem dieser Module, sondern im neu erstellten Code. Das vereinfacht die Fehlersuche deutlich.
Aufgaben
Laden Sie das leere Projekt WK_Ball03_empty auf Ihren Rechner.
Installieren Sie aber nicht die Node.js-Module, das machen Sie später. Sie finden das leere Projekt im
Repository-Pfad https://glossar.hs-augsburg.de/beispiel/tutorium/es6 im Unterordner empty.
Erstellen Sie ein neues Projekt praktikum03 und kopieren Sie die Ordner src und web (samt Inhalt)
sowie alle Dateien, die Sie im Wurzelverzeichnis des Projektes WK_Ball03_Empty
finden, mittels Crtl-/Apfel-C Crtl-/Apfel-V in Ihr eigenes Projekt. (Die Frage, ob WebStorm seinen eigenen File Watcher zum
Übersetzen von ES6-Code in ES5-Code verwenden soll, beantworten Sie bitte mit „No“. Das erledigt Webpack für Sie.)
Nun können Sie in Ihrem eigenen Projekt die benötigten Node.js-Module installieren: npm i.
Sie können Ihr Projekt zur Übung auch im Subversion-Repository speichern. Das ist aber nicht so wichtig.
In Ihrem Projekt finden Sie wiederum mehrere Web-Anwendungen: index01.html verwendet die gepackte Version von app01.js,
die ihrerseits das Spiel game01/game.js einbindet. Et cetera.
Schreiben Sie Ihre Lösungen der Aufgabe $i$ in die Ordner game$i$.js.
Versuchen Sie möglichst viele Module der jeweils vorangegangenen Aufgabe wiederzuverwenden.
Aufgabe 0: Analyse von game0.js
Es gibt in WK_Ball03_empty eine app0 mit zugehörigem Modul game0.
Dabei handelt es sich um eine App, die im Sinne des zweiten Teils des Tutoriums erstellt wurde.
Sehen Sie sich zunächst diese App an und analysieren Sie, wie diese funktioniert.
Beachten Sie insbesondere Folgendes:
- Es wird ein Ball-Modell erzeugt, mit Attributen „Radius“, „Position“, „Geschwindigkeit“ und „Beschleunigung“.
- Dieser Ball wird durch einen einfarbigen Kreis mit Rand visualisiert.
- Der Ball bewegt sich gemäß seinen Initialparametern schräg über die Bühne, wobei seine Geschwindigkeit stetig zunimmt.
- Bei einer Kollission mit dem Bühnenrand ändert er seine Bewegungsrichtung.
Die gesamte beschriebene Spiellogik ist in einer Datei enthalten: game00.js. So eine Datei bezeichne ich als Moloch.
Das Prinzip „Implementiere keinen Moloch“ nennt man fachsprachlich „Modularisierung“.
Beachten Sie bitte auch, dass einige Attribute und Funktionen gegenüber dem zweiten Teil des Praktikums umbenannt wurden.
Eigentlich ist das Programm gar nicht so molochartig, wie es zunächst scheint. Es kommen schon einige Module zum Einsatz:
index.html: Eine HTML-Seite zum Starten der eigentlichen Web-Anwendung, sobald sie vom Browser geladen wird.app.scss: Eine SCSS-Datei, die das Layout der HTML-Datei festlegt (insbesondere die Hintergrundfarbe).pixi.js: Eine sehr mächtige 2D-Grafik-Bibliothek, die sehr modular aufgebaut ist.GameLoopPixi: Eine Game-Loop-Klasse, die Ihnen im Rahmen des Praktikums zur Verfügung gestellt wird. Diese Modul benutzt seinerseits das HilfsmodulEventDispatcher.app0.js: Das Hauptmodul. Es stellt mit Hilfe der zuvor genannten Module die Spielumgebung zur Verfügung: Eine PIXI-Bühne, eine Gameloop sowie eine CSS-Datei. Sobald die Umgebung erstellt und initialisiert wurde, startet diese Modul das eigentliche Spielmodulgame00.js.app0.js: Das immer noch molochartige Spielmodul, das im Rahmen des Praktikums in diverse Einzelmodule aufgeteilt werden wird.
Aufgabe 1: Modularisierung des Modells

Ein gutes Modul ist nur für eine Aufgabe zuständig. Bislang ist das Game-Modul in dieser Hinsicht noch ziemlich schlecht.
Im ersten Schritt werden die Modell-Komponenten „Bühne“, „Ball“ und „Kollissionserkennung und -behandlang“ in eigene Module ausgelagert. Rechts sehen Sie das zugehörige Klassendiagramm, bestehend aus insgesamt fünf Modulen:
main: Zuständig für die Initialisierung der Spielumgebung und das anschließende Starten des Spiels.game: Zuständig für das Erzeugen der Spielelemente, den Benutzerinterkationen und der Spiellogik. Die einzelnen Teilaufgaben werden schrittweise an Hilfsmodule übertragen- Klasse
Stage: Jedes Objekt dieser Klasse repräsentiert das Modell einer Spielbühne. Üblicherweise gibt es nur eine Spielbühne. Es gibt aber auch Spielsituationen mit mehreren Spielbügnen (z. B. wenn neben der Hauptbühne, die nur einen Ausschnitt der Spielwelt zeigt, eine Minimap existiert, die einen Überblick auf die Spielwelt gewährt). - Klasse
Circle: Eine sehr gut wiederverwendbare Klasse, die für kreisförmige Objekte aller Art in einem Spiel zum Einsatz kommen kann. Normalerweise gibt es zahlreiche kreisförmige Objekte in einem Spiel. collision: Ein Module, das eine Kollissionsfunktion bereit stellt. Diese Kollissionsfunktion ist für die Kollissionserkennung und -behandlung von (beweglichen) Kreisobjekten mit (unbeweglichen) Rändern der Bühne zuständig.
Im Ordner js/app/game01 finden Sie für jedes dieser drei Module eine Datei. Im Ordner js finden Sie außerdem das Hauptmodul
app01.js. Der notwendige Code, um die Spielumgebung bereitzustellen ist darin bereits denthalten. Ihre Aufgabe
ist es, die Funktionen und Klassen, die in den anderen Dateien enthalten sind, zu implementieren. Welche Elemente die entsprechenden Module enthalten sollen, können Sie dem nebenstehenden Diagramm entnehmen.

Gehen Sie folgendermaßen vor:
- Kopieren Sie den Inhalt der Datei
game00.jsin die Dateigame01/game.js, ohne die darin enthaltenen Import-Befehle zu überschreiben. (Wenn Sie jetztindex01.htmlim Browser öffnen, sollte der Ball über die Bühne flitzen – zumindest, wenn Sie nicht vergessen haben,grunt watchzu aktivieren :-) ) - Lagern Sie den Code der Kollissionserkennung und -behandlung aus der Funktion
modelUpdatesin die Funktioncollisionin der Dateimodel/collision.jsaus. (Achtung: Der Code zur Berechnung der neuen Position und neuen Geschwindigkeit des Balls darf nicht in diese Datei ausgelagert werden.) Beachten Sie, dass die Funktioncollisiondie Inputparameterp_immovableundp_movablebesitzt. Die im kopierten Code enthaltenen Variablennamenv_ballundv_stagemüssen entsprechend umbenannt werden. - Rufen Sie in der Funktion
modelUpdatesdie neu erstellte (und vongame.jsauch schon importierte) Funktioncollisiongeeignet auf. Bei einem Test der Web-Anwendung sollte sich der Ball wieder wie gewohnt über die Bühne bewegen.
Quellen
- Kowarschick (MMProg): Wolfgang Kowarschick; Vorlesung „Multimedia-Programmierung“; Hochschule: Hochschule Augsburg; Adresse: Augsburg; Web-Link; 2018; Quellengüte: 3 (Vorlesung)
