Hausaufgabe
Einleitung
Zu Beginn des Softwarepraktikums soll sich jeder Teilnehmer mit C#, MonoGame und den dazugehörigen Werkzeugen vertraut machen.
Dazu werden Sie im Laufe dieser Hausaufgabe die Werkzeuge installieren, und damit ein kleines MonoGame-Programm schreiben.
Die Hausaufgabe muss von jedem Teilnehmer in der ersten Woche (siehe Roadmap) verbindlich gemacht werden.
Bitte beachten Sie:
- Lesen Sie den Text jeder Aufgabe vollständig durch, bevor Sie mit der Bearbeitung beginnen.
- Bearbeiten Sie die Aufgaben der Reihe nach, da diese aufeinander aufbauen.
- Beginnen sie nicht erst, wenn die Gruppeneinteilung online ist! (Aufgabe 1 lässt sich bereits ohne Gruppeneinteilung erledigen und kann, falls Probleme auftreten viel Zeit in anspruch nehmen)
Aufgabe 1: Setup
Setzen Sie eine Arbeitsumgebung auf und testen Sie die Zugänge zu den verschiedenen Diensten.
Arbeitsumgebung
Im Folgenden sollen Sie ihre Arbeitsumgebung einrichten. Sie können im Sopra beliebige andere Werkzeuge verwenden, müssen aber sicherstellen, dass diese mit den hier vorgestellten Werkzeugen kompatibel sind.
- Folgen Sie dem Artikel Arbeitsumgebung einrichten entsprechend Ihrem Betriebssystem um ihre Entwicklungsumgebung einzurichten.
- Folgen Sie dem Artikel Dienste um ihre Zugänge zu allen Diensten einzurichten.
Aufgabe 2: Gitea
Bereiten Sie ihr Gitea (git.sopranium.de) auf den Hausaufgabensprint und die Aufgaben ihrer Gruppe vor. Gehen Sie dazu wie folgt vor.
Gitea vorbereiten
Um Gitea in Verbindung mit Scrum verwenden zu können, müssen vorher bestimmte Labels (siehe Abb. 1) für die Items im Backlog eingerichtet werden.
- Klicken Sie auf
Issues -> Labels
. - Wenn noch keine Labels eingerichtet wurden, werden Sie gefragt ob eines der vorkonfigurierten Menge von Labels verwendet werden soll. Wählen Sie hier das vorkonfigurierte Set
Sopra
. - Prüfen sie ob Labels für Priorität und Zeitabschätzung vorhanden sind, wie auf dem Bild zu sehen (Details können variieren). Wenn keine Labels zur Zeitabschätzung und Priorisierung vorhanden sind, löschen Sie alle Labels. Wählen Sie dann wie oben beschrieben das vorkonfigurierte Labelset für das Sopra.
Sprint für Hausaufgabe anlegen
Prüfen sie ob in Gitea ein Sprint für die Hausaufgabe angelegt wurde.
- Klicken Sie auf den Reiter
Issues -> Milestones
. - Falls kein Sprint (Milestone) für die Hausaufgabe angezeigt wird (siehe Abb. 2), legen Sie einen Milesstone mit dem Namen
Sprint 00 (Hausaufgabe)
an.- Verwenden Sie das Datum für das Ende des Sprints das Abgabedatum auf der Hauptseite.
User Stories für Aufgabe 3 erstellen
Prüfen Sie ob für die Hausaufgabe bereits alle Items existieren. Wenn nicht, legen Sie diese an.
- Klicken Sie auf den Reiter
Issues
. - Prüfen Sie ob bereits ein Item mit dem Titel
Student <NAME> soll Scrum, Gitea und Git verstehen
existiert (siehe Abb. 3).- Wenn nicht legen Sie eine entsprechende Userstory an indem Sie den weiteren Punkten folgen:
- Klicken Sie
Neuer Issue
. - Tragen sie als Titel
Student <NAME> soll Scrum, Gitea und Git verstehen
ein. - Tragen sie im Textfeld darunter die ausführliche Beschreibung
Student <NAME> soll Scrum, Gitea und Git verstehen um effizient arbeiten zu können.
ein. - Weisen Sie dem Item eine hohe Priorität über das Label
high
zu, indem Sie auf das Zahnrad neben dem Schrifzug Label drücken und die entsprechenden Label auswählen. - Weisen Sie dem Sprint (Meilenstein) Sprint 00 (Hausaufgabe) zu.
- Drücken sie auf
Issue Erstellen
.
Bitte beachten Sie in dieser, und in folgenden Aufgaben, den Platzhalter <NAME>
geeignet (z.B.: mit ihrem Usernamen, oder Vornamen) zu ersetzen.
Items für Aufgabe 4 erstellen
Erstellen Sie wie in den vorhergehenden Aufgaben beschrieben, die Items für Aufgabe 4
- Titel
Student <NAME> soll die Clean Code Development Texte lesen
mit BeschreibungStudent <NAME> soll die Clean Code Development Texte lesen, um besseren Code schreiben zu können.
- Titel
Student <NAME> soll den Usability Artikel lesen
mit BeschreibungStudent <NAME> soll den Usability Artikel lesen, um von vornherein Usabilityprobleme zu vermeiden.
- Titel
Student <NAME> soll die Dokumentation Texte lesen
mit BeschreibungStudent <NAME> soll die Dokumentation Texte lesen, um seinen Code sinvoll dokumentieren zu können.
Items für Aufgabe 5 erstellen
Erstellen Sie wie in den vorhergehenden Aufgaben beschrieben, das Item für Aufgabe 5
- Titel
Student <NAME> soll ein MonoGame Programm schreiben
mit BeschreibungStudent <NAME> soll das in Aufgabe 5 beschriebene Programm schreiben, um seine Entwicklungswerkzeuge zu testen.
Items akzeptieren
Bevor Sie mit den Aufgaben beginnen, sollten Sie sich die entsprechenden Items zuweisen (siehe Abb. 4).
- Wählen Sie eines ihrer Items aus dem Sprintbacklog (
Issues -> Milestones -> Hausaufgabe
) aus, indem Sie auf den Titel des Tickets klicken. - Geben sie eine Abschätzung wie lange es dauern wird das Item nach der Definition of Done umzusetzten. Weisen Sie das Label
est: 1
um die Abschätzung zu geben, dass es insgesamt eine Stunde Arbeit benötigt wird. Wenn sie vermuten, dass Sie mehr als eine Stunde benötigen, wählen Sie einen entsprechend höheren Wert aus. - Weisen Sie sich dem Item zu, indem Sie auf das Zahnrad neben dem Schriftzug Zuständig klicken, und ihren Benutzernamen auswählen.
Aktzeptieren Sie so alle Tasks die sie in den vorhergehenden Aufgaben erstellt haben. Akzeptieren Sie auch das Item zu Aufgabe 5 falls dieses schon existierte.
Beachten Sie, dass es nicht nötig für jede Änderung einen Kommentar zu schreiben. Alle Änderungen an Labels und zugewiesenen Personen werden sofort übernommen und in der Historie des Tickets eingetragen.
Überprüfen der Items
Bevor Sie mit der Arbeit beginnen, prüfen Sie noch einmal ob alle Items für Ihre Aufgaben im Sprintbacklog vorhanden sind.
- Klicken sie auf den Reiter
Issues -> Meilensteine -> Hausaufgabe
- Schränken Sie die Anzeige auf die Ihnen zugewiesenen Items ein, indem sie unter
Zuständig ⯆
ihren Usernamen wählen. Prüfen Sie ob alle Items vorhanden sind. - Erstellen Sie eventuell nicht vorhandene Userstories und Tasks wie in den vorhergehenden Aufgaben beschrieben.
Aufgabe 3: Scrum und Gitea verstehen
- Recherchieren Sie, was Scrum ist und wie Scrum funktioniert.
- Lesen Sie außerdem den Wikipedia-Artikel zu User Stories.
- Machen Sie sich mit den anderen Funktionen von Gitea vertraut und lesen Sie den Artikel Scrum im Sopra
- Sollte es Fragen zum Vorgehen (Scrum und Gitea) geben, schreiben Sie diese als Kommentar in ihr Item in Gitea, damit eventuelle Fragen schnell geklärt werden können (Kommentarfeld unter
Issues -> Meilensteine -> Hausaufgabe -> Student <NAME> soll Scrum, Gitea und Git verstehen
). - Lesen sie die Artikel Git und Git Workflow
- Richten Sie sich den Zugang zu ihrem Gruppenrepository ein, indem Sie in Gitea ein HTTPS Kennwort einrichten oder einen SSH Key hinzufügen.
- Klonen sie das Gruppenrepository.
- Öffnen Sie dort die Datei
README.md
und fügen Sie ihren Namen an der dafür vorgesehenen Stelle hinzu (Verwenden Sie hierfür nicht den Editor in Gitea, sondern eine lokale Kopie des Repositories wie in dieser Aufgabe beschrieben). - Committen sie ihre Änderungen: Benutzen sie die Commitnachricht
Added name to README.md (closes #<ticketnummer>)
um das entsprechende Item in Gitea per Commitnachricht zu schließen. - Synchronisieren sie ihre Änderungen mit dem Server. Halten Sie sich dabei and den empfohlenen Git-Workflow. Es it gut möglich, dass durch den Commit konflikte entstehen: Beachten sie hierzu die Anleitung zum Konflikte lösen in Git, und lösen Sie die entstehenden Konflikte sinvoll auf.
- Sollte es noch keine
.gitignore
-Datei in Ihrem Repository geben, erstellen Sie in ihrem Repository eine entsprechende Datei (Git#Dateien Ignorieren), sodass temporäre Dateien von Visual Stuidio und Verzeichnisse für den Compileroutput von Git ignoriert werden. Comitten Sie diese Datei und pushen Sie diese ebenfalls. Eine gute Vorlage finden Sie unter Github.
Hinweis: Achten Sie darauf, dass die in ihrem Git eingestellte Emailadresse mit der in Gitea eingestellten Emailadesse übereinstimmt, da Ihnen sonst keine Commits zugeordnet werden können.
Aufgabe 4: Texte lesen
Lesen Sie sich die folgenden Artikel durch, und kommentieren Sie ihr entsprechendes Ticket:
- Lesen Sie Clean Code Development
- Beschreiben Sie in einem Kommentar zum entsprechenden Item ein Cleancodeprinzip und wieso Sie es für das Sopra für besonders wichtig erachten.
- Lesen Sie Dokumentation
- Lesen Sie Usability-Prinzipien beim Spieldesign
- Beschreiben Sie in einem Kommentar zum entsprechenden Item ein Usabilityprinzip und wieso Sie es für das Sopra für besonders wichtig erachten.
Items bearbeiten
Bearbeiten sie die Aufgaben und tragen Sie entsprechende Zeiten in die Items in Gitea ein (im Menü rechts, Time Tracker -> Add Time). Besonders bei Programmieraufgaben ist dies sinnvoll, da so eine Historie der Bearbeitung und der verbrauchten Zeit erstellt wird. Dies hilft nicht nur Ihnen bei der Planung weiterer Aufgaben und Abschätzung der dafür benötigten Zeit, sondern dient auch als Nachweis für Ihre kontinuierliche Mitarbeit (siehe Formalien).
Items schließen
Wenn Sie mit einer Aufgabe fertig sind, sollten Sie Ihren entsprechenden Items schließen. Gehen Sie ähnlich wie beim Akzeptieren einer Story vor und drücken Sie auf den Button Schließen. Beachten Sie bei Aufgaben die zu denen Sie etwas comitten, dass Sie das Item auch über die Commitnachricht schließen können.
Vergessen Sie nicht die Zeit, die Sie für den Task benötigt haben, einzutragen (falls Sie das noch nicht gemacht haben).
Aufgabe 5: Programm schreiben
Erstellen Sie ein MonoGame Programm, welches die folgenden Eigenschaften erfüllt:
Funktionale Anforderungen
- Das Programm zeichnet eine Hintergrundgrafik in einem MonoGame-Fenster.
- Vor dieser Hintergrundgrafik rotiert ein Uni-Logo um den Bildschirmmittelpunkt.
- Das Logo muss transparent sein, d.h. es dürfen keine weißen Ränder der verwendeten Grafik sichtbar sein. Außerdem muss durch alle nicht-schwarzen Stellen des Logos hindurchgesehen werden können.
- Das Logo muss korrekt skaliert sein, damit es vollständig in den sichtbaren Bereich hinein passt.
- Das Logo darf während der Bewegung nicht über die Ränder des sichtbaren Bereiches hinausragen. (Größenveränderung des Fensters ist zu vernachlässigen. Es gilt die Größe des Fensters bei Programmaufruf.)
- Innerhalb des MonoGame-Fensters wird ein Maus-Cursor angezeigt.
Hinweis, falls Sie mit einer virtuellen Maschine arbeiten, in der Windows installiert ist: Normalerweise wird der Mauszeiger in MonoGame Fenstern standardmäßig ausgeblendet, wenn man ihn nicht explizit aktiviert. Beim Arbeiten mit einer virtuellen Maschine kann es jedoch sein, dass der Mauszeiger im Fenster immer angezeigt wird. In diesen Fällen wird nicht bemerkt, dass man den Mauszeiger eigentlich hätte anschalten müssen. Um sicher zu stellen, dass die Anforderung erfüllt ist, testen Sie Ihr Programm sicherheitshalber noch einmal an einem der Poolrechner unter Windows, um einen möglichen Punktabzug an dieser Stelle in der Hausaufgabe auszuschließen. - Wenn der Benutzer mit der Maus innerhalb des Fensters klickt, soll ein Sound abhängig von der Position des Cursors abgespielt werden:
- Befindet sich der Cursor über dem Logo, soll ein Ton A erklingen.
- Befindet sich der Cursor nicht über dem Logo, soll ein Ton B erklingen.
- Ton A und Ton B müssen verschieden sein.
Randbedingungen
Die Randbedingungen müssen erfüllt werden. Insbesondere muss Ihre Abgabe komplett frei von Resharper-Fehlern und Warnungen sein.
Hinweis: es ist sinnvoll die Resharper-Settings einzubinden bevor Sie beginnen Code zu schreiben, da Resharper per Standardkonfiguration versucht vom geschrieben Code Codingconventions abzleiten, was später im Softwarepraktikum gerne für Verwirrung über die angezeigten Resharperfehler sorgt. Die settings für das Softwarepraktikum schalten diese Funktion ab.
ReSharper-Hinweise
Beim Erstellen eines MonoGame-Projekts wird eine Variable, mGraphics von MonoGame angelegt, welche augenscheinlich initial nicht verwendet wird. Das heißt, sie wird innerhalb des Quelltextes nicht gelesen. Die Variable wird jedoch intern von der MonoGame-Engine verwendet und darf nicht gelöscht werden, da sonst wichtige Grafikschnittstellen nicht gefunden werden und das Programm abstürzt.
Es kann sein, dass die Hausaufgabe programmiert werden kann, ohne dass man diese Variable jemals irgendwo verwenden muss. Dies führt dazu, dass ReSharper eine Fehlermeldung bzgl. einer unbenutzten Variable im Projekt ausgibt.
Um ReSharper-Konformität der Hausaufgabe unter diesen Bedingungen herzustellen, sind mehrere Möglichkeiten denkbar:
- Verwenden der mGraphics Variable bei der Erstellung eines Sprite-Batches. Es ist möglich, den SpriteBatch, auf dem das Uni-Logo gezeichnet wird, mitzu initialisieren.
var someSpriteBatch = new SpriteBatch(mGraphics.GraphicsDevice);
- Hinzufügen einer ReSharper-Ausnahme für die Variable mGraphics. Eine Ausnahme für diese Variable ist die einzige Ausnahme, die wir akzeptieren.
Ressourcen
Damit das Erstellen von Grafiken ignoriert werden kann, gibt es hier die beiden Beispieldateien aus der Einführungsveranstaltung:
Als Audiodateien können beliebige, kurze, Dateien verwendet werden. Die beiden aus der Einführungsveranstaltung bekannten Waves gibt es hier:
Abgabe
Bitte verwenden Sie zur finalen Abgabe der Hausaufgabe das Git-Repository ihrer Gruppe. Der Programmier-Teil der Hausaufgabe muss als komplettes Visual Studio Projekt abgegeben werden. Sie sollten dazu einfach das Projekt in das Gruppenrepository unter /abgabe/hausaufgabe/<username>/
comitten.
Bitte vergewissern Sie sich vorher noch einmal, ob eine entsprechende .gitignore Datei angelegt ist, damit auschließlich relevante Projektdateien (z.B.: die Solution und Codedateien) aber keine temporären Dateien im Repository eingecheckt werden.
Abgabe 6: Abgabe finalisieren
Wenn Sie in Ihrer Gruppe die Aufgaben als letztes abschließen (d.h. Sie die das letzte Item im Sprintbacklog schließen) erledigen Sie noch folgende Aufgabe.
Der Fortschritt der während des Sprints erzielt wurde (Inkrement) muss auf den release
branch übertragen werden, damit trotz weiterer Arbeit immer eine auslieferbare Version verfügbar ist. In den auf die Hausaufgabe folgenden Sprints gehört dies zu den aufgaben des Product owners.
- Schließen Sie das Sprintbacklog (
Issues -> Meilensteine -> Hausaufgabe -> Schießen
). - Erstellen sie einen Pullrequest (siehe Abb. 8), sodass der aktuelle Stand von
master
nachrelease
übertragen werden kann. Gehen Sie wie folgt vor:- Klicken Sie in Gitea auf den Reiter
Code -> Branch: master
. - Drücken Sie auf den Button
Neuer Pull-Request
. - Prüfen Sie im folgenden Dialog, dass als Ziel
release
und als pullen vonmaster
gewählt sind. Geben Sie dem Pullrequest den Titel Hausaufgabe. Ihnen werden daraufhin alle Änderungen die mit dem Pull-Request vommaster
auf denrelease
-Branch übertragen werden sollen angezeigt. - Drücken Sie auf
Pullrequest Erstellen
. - Gitea wird feststellen, dass es zwischen
master
undrelease
keine Konflikte gibt, und der Merge automatisch durchgeführt werden kann. Ein weiteres Drücken aufPull-Request Zusammenführen
öffnet ein Kommentarfenster, noch einmal drücken schließt den Pull-Request ab.
- Klicken Sie in Gitea auf den Reiter
Die Änderungen die Sie und ihre Gruppe während des Hausaufgabensprints gemacht haben, befinden sich nun auch auf dem release
-Branch.
Hinweise
- Falls Sie Probleme beim Starten der Anwendung haben, schauen Sie zuerst in die FAQ und in das Discourse.
- Möglicherweise wird bei Ihnen kein Sound abgespielt, obwohl dies Ihrer Einschätzung nach eigentlich der Fall sein sollte. Prüfen Sie in diesem Fall, ob die Installation der DirectX Runtime das Problem behebt.