\documentclass{handout} \csname endofdump\endcsname \usepackage{minted} \usepackage{hyperref} \usepackage[ngerman]{babel} \usepackage{hyperref} \geometry{margin=2cm} \title{SpaceInvaders Arbeitsauftrag 3} \setcounter{section}{1} \newcommand{\M}[1]{Methode \texttt{#1}} \newcommand{\K}[1]{Klasse \texttt{#1}} \newcommand{\javainline}[1]{\mintinline{java}{#1}} \begin{document} \thispagestyle{empty} \subsection{\faIcon{desktop} Schießen aber bitte einfach!} \begin{defbox}{Vererbung} Eine Klasse kann \underline{alle} Methoden und Attribute einer anderen Klasse \boldred{erben}. Vererbung wird in Java mit dem Schlüsselwort \mintinline{java}{extends Oberklasse} in der Klassendefinition der Unterklasse ausgedrückt. \begin{center} \begin{tikzpicture} \begin{class}[text width=4cm]{Oberklasse}{0, 0} \end{class} \begin{class}[text width=4cm]{Unterklasse}{7, 0} \inherit{Oberklasse} \end{class} \end{tikzpicture} \end{center} Im Klassendiagramm wird die Vererbung durch eine unausgefüllte Pfeilspitze ausgedrückt. \end{defbox} \begin{enumerate} \item Erzeuge eine neue \K{Projektil} als Unterklasse von \texttt{Actor} (wähle kein Bild aus). \item Implementiere die Bewegung sowie das Entfernen des Projektils, falls es einen Rand berührt, in der \texttt{act}-Methode der \K{Projektil} (vgl. deine \texttt{Laser} Implementierung). \item Definiere die \K{Laser} als Unterklasse von \texttt{Projektil} und initialisiere die Geschwindigkeit mit dem Wert 6 im Konstruktor der \K{Laser}. \item Implementiere die Schüsse der Aliens in der \K{Lazer} (wähle das Bild \textit{laser2}) und initialisiere die Geschwindigkeit mit dem Wert $-5$. \item Passe die \M{schiessen} der \K{Alien} entsprechend an, sodass neue \texttt{Lazer} Objekte erzeugt werden. \end{enumerate} \subsection{\faIcon{desktop} Oh nein getroffen!} Um zu überprüfen, ob ein Alien oder das Raumschiff von einem feindlichen Projektil getroffen wurden, muss überprüft werden, ob die Objekte sich berühren. \begin{defbox}{Kollision} \begin{tabular}{p{0.75\textwidth} p{0.5cm} p{0.2\textwidth}} \vspace{-1.8cm} Von einer Kollision spricht man, wenn zwei Objekte sich \textbf{überschneiden}. Eine solche Überschneidung zu erkennen kann je nach Form der Objekte kompliziert sein. In \textit{Greenfoot} bietet dazu die \K{Actor} die Methode \mintinline{java}{IsTouching(Class)} an. & & \begin{tikzpicture} \node[draw, opacity=0.7, minimum size=1.5cm, fill=red] {}; \node[circle, draw, minimum size=1cm, fill=blue] at (0.5, 0.5) {}; \end{tikzpicture} \\ \end{tabular} \end{defbox} \begin{enumerate} \item Implementiere in der \K{Raumschiff} die \M{pruefeKollision()}, in der du mittels \\ \javainline{isTouching(Lazer.class)} überprüfst, ob das Raumschiff getroffen wurde und gegebenenfalls die \M{verloren} der Welt aufrufst (\javainline{((MyWorld)getWorld()).verloren();}). Ergänze die \M{act} der \K{Raumschiff} um einen Aufruf der \M{pruefeKollision}. \item Implementiere in der \K{Alien} die \M{pruefeKollision()}, in der du mittels \\ \javainline{isTouching(Laser.class)} überprüfst, ob das Alien getroffen wurde. Falls das Alien getroffen wurde, entferne das Projektil (\javainline{removeTouching(Laser.class);}), sowie das Alien selbst (\javainline{getWorld().removeObject(this);}). Spiele zusätzlich einen Explosions-Ton ab (\javainline{Greenfoot.playSound("Explosion.wav");}). \item Wurden alle Aliens zerstört? \begin{enumerate} \item Implementiere in der \K{MyWorld} eine \M{reduziereAlienAnzahl}, in der du die \texttt{alienAnzahl} um 1 reduzierst. \item Reduziere die Alien Anzahl in der \M{pruefeKollision}, falls das Alien getroffen wurde (\javainline{((MyWorld)getWorld()).reduziereAlienAnzahl();}). \item Ergaenze die \M{act} der \K{MyWorld} um eine Ueberpruefung ob alle Aliens zerstört wurden und rufe gegebenenfalls die \M{gewonnen} auf. \end{enumerate} \end{enumerate} \subsection{\faIcon{desktop} Die Erde ist verloren!} Das Spiel ist auch verloren, wenn eins der Aliens den unteren Bildschirmrand, die Erde, erreicht hat. \begin{enumerate} \item Implementiere eine \M{pruefeSieg} in der \K{Alien}, die überprüft ob die aktuelle Y Position (\javainline{getY()}) größer oder gleich 590 ist. Falls ja soll die \M{verloren} der \K{MyWorld} aufgerufen werde. \item Rufe die \M{pruefeSieg} in der \M{act} des Aliens auf. \end{enumerate} \subsection{\faIcon{desktop} \textbf{Für Schnelle}: Tob dich aus!} Sei kreativ und erweitere das Spiel um weitere Level, andere Gegner, Projektile oder einen Highscore. \vfill Dieses Werk ist lizenziert unter einer \href{https://creativecommons.org/licenses/by-sa/4.0/}{CC BY-SA 4.0} Lizenz \faCreativeCommons\ \faCreativeCommonsBy\ \faCreativeCommonsSa. \end{document}