aboutsummaryrefslogtreecommitdiff
path: root/Info/10/2/JumpNRun/slides.md
diff options
context:
space:
mode:
authorFlorian Fischer <florian.fischer@muhq.space>2026-04-17 20:44:47 +0200
committerFlorian Fischer <florian.fischer@muhq.space>2026-04-17 20:44:47 +0200
commitc38d85decda449be5b7e557f6052d8ed3bd41cdc (patch)
tree31982e5432272788f945951cae587b31b44bf552 /Info/10/2/JumpNRun/slides.md
parent102ab3bede6592dff2771fe5d818d0837f5d3308 (diff)
downloadunterricht-c38d85decda449be5b7e557f6052d8ed3bd41cdc.tar.gz
unterricht-c38d85decda449be5b7e557f6052d8ed3bd41cdc.zip
significantly improve jumpnrun material
* mention combining of collision detection and handling * specify the need to cast to InteractiveElement
Diffstat (limited to 'Info/10/2/JumpNRun/slides.md')
-rw-r--r--Info/10/2/JumpNRun/slides.md78
1 files changed, 52 insertions, 26 deletions
diff --git a/Info/10/2/JumpNRun/slides.md b/Info/10/2/JumpNRun/slides.md
index c4191131..a7f620e0 100644
--- a/Info/10/2/JumpNRun/slides.md
+++ b/Info/10/2/JumpNRun/slides.md
@@ -506,7 +506,7 @@ Wir fallen einfach durch den Boden!
\faIcon{lightbulb} Wie erkennen wir, dass zwei graphische Objekte sich berühren?
\pause
-Wir müssen prüfen, ob sie sich in \emph{mindestens} einem Punkt im Koordinatensystem überschneiden.
+Wir müssen prüfen, ob sie sich in *mindestens* einem Punkt im Koordinatensystem überschneiden.
\pause
```\begin{pseudocode}```{=latex}
@@ -540,7 +540,7 @@ for (Shape shape: collidingShapes) {
Implementiere in der `void act()`{.java} des Spielers die Kollisionserkennung.
\let\tightlist\relax
-* Speichere alle \emph{soliden} kollidierenden Objekte, des aktuellen Levels als Variable.
+* Speichere alle *soliden* kollidierenden Objekte, des aktuellen Levels als Variable.
(`Shape[] collidingShapes = getCollidingShapes(jumpnrun.level.solidObjects);`{.java}
* Implementiere eine `foreach`-Wiederholung, die alle kollidierenden Objekte behandeln soll.
(`for(Shape shape: collidingShapes) {}`{.java})
@@ -556,13 +556,30 @@ Implementiere `void reactToCollisionWithShape(Shape shape)`{.java} im Spieler:
* Bestimme die Richtung, aus der der Spieler mit `shape` kollidiert ist. (`Direction direction = directionRelativeTo(shape);`{.java})
* Setze je nach Richtung (`top`, `left`, `right`, `bottom`), die Geschwindigkeit dieser Richtung auf 0.
* Mache die letzte Bewegung mit `moveBackFrom(shape, false)`{.java} rückgängig. (`moveBackFrom(Shape otherShape, boolean keepColliding)`{.java})
-* Wiederholung die letzte Bewegung in die Richtung, die \emph{nicht} zur Kollision führt.
-
+* Wiederholung die letzte Bewegung in die Richtung, die *nicht* zur Kollision führt.
+
+## \faIcon{desktop} Arbeitsauftrag: Kollision behandeln 2 \hfill{} 5min
+
+```\begin{pseudocode}```{=latex}
+```
+für alle überschneidenden Objekte
+ Behandle Überschneidung
+```
+```\end{pseudocode}```{=latex}
+
+Wir wollen unsere **Kollisionserkennung** `getCollidingShapes(Group group)`{.java} mit unserer **Kollisionsbehandlung** `reactToCollisionWithShape(Shape shape)`{.java} verbinden.
+
+\begin{center}
+\textbf{Kollisionserkennung} \hspace{5mm} \faIcon{link} \hspace{5mm} \textbf{Kollisionsbehandlung}
+\end{center}
+
+* Rufe mit *jedem* kollidierenden Shape in `collidingShapes` die `reactToCollisionWithShape` Methode auf.
## \faIcon{desktop} Arbeitsauftrag: Auf dem Boden stehen \hfill{} 10min
:::{.block}
### Wir wollen erkennen, wann wir auf festem Boden stehen!
+* Nicht fallen
* Springen erlauben
* Laufanimation abspielen
:::
@@ -570,10 +587,10 @@ Implementiere `void reactToCollisionWithShape(Shape shape)`{.java} im Spieler:
Das Attribut `Shape standsOn`{.java} der Klasse `Player` merkt sich auf welchem Shape der Spieler steht.
* (Ergänze das `standsOn` Attribut vom Typ `Shape` in der Klasse `Player`)
-* (Ändere die Gravitation zu einer Prüfung `standsOn == null`{.java})
-* Bei Kollision von \emph{oben}, speichere das kollidierende `shape` im Attribut `standsOn`.
-* Überprüfe vor der Kollisionserkennung, ob der Spieler noch mit einem möglicherweise gespeicherten `standsOn` Objekt kollidiert. (`standOn != null && !collidesWith(standsOn)`{.java})
-* \emph{Falls nein} setze `standOn` auf `null`{.java}
+* (Ändere die Prüfung, ob Gravitation wirkt zu: `standsOn == null`{.java})
+* Bei Kollision von *oben*, speichere das kollidierende `shape` im Attribut `standsOn`.
+* Überprüfe vor der Kollisionserkennung, ob der Spieler *nicht mehr* mit dem gespeicherten `standsOn` Objekt kollidiert. (`standOn != null && !collidesWith(standsOn)`{.java})
+ * *Falls ja* setze `standOn` auf `null`{.java}
## {.standout}
@@ -581,7 +598,7 @@ Wir wollen, dass etwas passiert!
## Erinnerung: Interaktive Elemente
-Neben mehrere feste Plattformen soll ein Level auch **interaktive Elemente** enthalten.
+Neben mehreren festen Plattformen soll ein Level auch **interaktive Elemente** enthalten.
::: {.columns}
:::: {.column width=50%}
@@ -612,8 +629,8 @@ Wir müssen sicherstellen, dass alle Objekte mit dem Player interagieren können
\begin{tcolorbox}[colframe=yellow, colback=yellow!20, title=\textcolor{black}{\faIcon{lightbulb} Idee(n)}]
\begin{itemize}
- \item<2-> Gemeinsmane Oberklasse
- \item<3-> \boldred{Interface}
+ \item<2-> Gemeinsame Oberklasse? (\textit{Keine gemeinsamen Attribute})
+ \item<3-> \boldred{Interface}!
\end{itemize}
\end{tcolorbox}
@@ -672,7 +689,7 @@ interface InteractiveElement {
## \faIcon{desktop} Arbeitsauftrag: Interaktive Objekte verwalten \hfill{} 10min
\let\tightlist\relax
-* Implementiere in einer neuen Datei das Interface `InteractiveElement`:
+* Implementiere in einer *neuen Datei* das Interface `InteractiveElement`:
```java
interface InteractiveElement {
void onCollisionWithPlayer(Player player, JumpNRun jumpNRun);
@@ -684,30 +701,40 @@ interface InteractiveElement {
## \faIcon{desktop} Arbeitsauftrag: Mit interaktiven Objekte interagieren \hfill{} 10min
+\vspace{-0.2cm}
+::: {.columns align=center}
+:::: {.column width=55%}
Damit etwas passiert, wenn der Spieler ein interaktives Objekt berührt, wollen wir `onCollisionWithPlayer(Player, JumpNRun)`{.java} bei einer Kollision aufrufen.
+::::
-:::{.block}
-### Interaktions Beispiele {.example}
-
-* Flagge wird berührt -> Level wechseln
-* Gegner wird berührt -> Leben verlieren
-* ...<M-Escape>
+:::: {.column width=45%}
+\begin{tcolorbox}[title=Interaktions Beispiele, colframe=green!80!black]
+ \small
+ \begin{itemize}
+ \setlength\itemsep{-2mm}
+ \item \textit{Flagge -> Level wechseln}
+ \item \textit{Gegner -> Leben verlieren}
+ \item \textit{...}
+ \end{itemize}
+\end{tcolorbox}
+::::
:::
+\let\tightlist\relax
* Ergänze die Methode `act` der Klasse `Player`, um die Kollisionserkennung mit allen interaktiven Objekten eines Levels.
- (Tipp: Du kannst viel von der Kollisionserkennung der `solidObjekts` kopieren.)
+ (**Tipp**: Du kannst viel von der Kollisionserkennung der `solidObjekts` kopieren.)
* Rufe für jedes kollidierende interaktive Objekt die Methode `onCollisionWithPlayer` mit dem Player Objekt (`this`{.java}) und dem gesamten `jumpNRun` Spiel-Objekts auf.
+ (**Hinweis**: Um die Methode `onCollisionWithPlayer`{.java} aufzurufen, musst das Objekt vom Typ `InteractiveElement` sein. Wandle das Shape mit dem [Cast](https://inf-schule.de/oop/java/experten/vererbung/konzept_typumwandlung): `((InteractiveElement)shape).onC...`{.java})
## \faIcon{desktop} Arbeitsauftrag: Ziel in Sicht \hfill{} 10min
\let\tightlist\relax
-* Implementiere die Klasse `Goal` die von der Klasse `Sprite` *erbt* und das Interface `InteraktiveElement` *implementiert*.
- (`implements InteractiveElement`{.java})
+* Implementiere die Klasse `Goal` die von der Klasse `Sprite` **erbt** und das Interface `InteraktiveElement` **implementiert** (`implements InteractiveElement`{.java}).
* Implementiere den Konstruktor der Klasse `Goal`.
- * Wähle das Sprite *160* aus der Sprite-Bibliothek `SpriteLibrary.Plattforms` aus.
+ * Wähle das Sprite **160** aus der Sprite-Bibliothek `SpriteLibrary.Plattforms` aus.
(`super(x, y, SpriteLibrary.Plattforms, 160);`{.java})
* Mit der Anweisung `playAnimation(160, 161, RepeatType.loop, 3);`{.java} lässt du die Flagge im "Wind" wehen.
-* Implementiere die Methode `onCollisionWithPlayer` der Klasse `Goal` die zum nächsten Level weiter schaltet.
+* Implementiere die Methode `onCollisionWithPlayer` der Klasse `Goal`, die zum nächsten Level weiter schaltet.
(**Tipp:** Implementiere die Methode `JumpNRun.nextLevel(Level level)` und rufe sie mit dem Nachfolger des aktuellen Levels auf)
## \faIcon{desktop} Arbeitsauftrag: Baue dein eigenes Spiel
@@ -715,13 +742,12 @@ Damit etwas passiert, wenn der Spieler ein interaktives Objekt berührt, wollen
Verändere das nun fertige Grundspiel nach deinen Vorstellungen.
### Vorschläge {.example}
-* Ergänze eine Stopuhr pro Level.
+* Ergänze eine Stoppuhr pro Level.
* Füge sich bewegende Hindernisse/Gegner hinzu.
-* Ergänze Powerups die eingesammelt werden müssen.
+* Ergänze Powerups die eingesammelt werden können.
* Erweitere das Spiel um einen zweiten Spieler.
* ...
-
## {.standout}
Dieses Werk ist lizenziert unter einer [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/) Lizenz \faCreativeCommons\ \faCreativeCommonsBy\ \faCreativeCommonsSa.