faecher:informatik:mittelstufe:breakout:breakout05:start

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.

Link zu der Vergleichsansicht

Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung
Nächste Überarbeitung
Vorherige Überarbeitung
faecher:informatik:mittelstufe:breakout:breakout05:start [12.10.2023 19:20] Frank Schiebelfaecher:informatik:mittelstufe:breakout:breakout05:start [12.10.2023 19:25] (aktuell) – [Reflexion] Frank Schiebel
Zeile 30: Zeile 30:
 Es ist umständlich, jedes Mal die Welt neu mit den Objekten zu füllen. In Greenfoot kann man eine einmal erstellt Welt abspeichern, so dass die Objekte nach jeder neuen Compilierung oder Drücken des "Reset"-Buttons wieder eingefügt werden. Es ist umständlich, jedes Mal die Welt neu mit den Objekten zu füllen. In Greenfoot kann man eine einmal erstellt Welt abspeichern, so dass die Objekte nach jeder neuen Compilierung oder Drücken des "Reset"-Buttons wieder eingefügt werden.
 Füge in deine Welt das Paddle, einige Blöcke und einen Ball ein. Klicke dann mit der rechten Maustaste auf die Welt und wähle "Save the world". Füge in deine Welt das Paddle, einige Blöcke und einen Ball ein. Klicke dann mit der rechten Maustaste auf die Welt und wähle "Save the world".
 +
 +===== Reflexion =====
 +
 +Der Ball soll nun am Paddel reflektiert werden, falls er es trifft. Wenn ein Actor-Objekt auf ein zweites Actor-Objekt trifft, erhält man das zweite Actor-Objekt mit der Actor-Methode ''getOneIntersectingObject(java.lang.Class cls)''.
 +
 +Falls diese beiden Objekte sich nicht überlappen, liefert diese Methode den Wert ''null'' zurück.
 +
 +Der zugehörige Quelltextschnipsel, um zu erkennen, ob es eine Überlappung gibt, lautet:
 +<code java>
 +if (getOneIntersectingObject(Paddel.class) != null) {
 +   ...
 +}
 +</code>
 +
 +Dann soll sich die Richtung des Balls so ändern, als wenn er am unteren Spielfeldrand reflektiert worden wäre.
 +
 +Der Parameter ''Paddel.class'' in dieser Methode ist etwas ungewöhnlich. Gemeint ist damit, dass auf Kontakt mit irgendeinem Objekt der Klasse Paddel geprüft wird und nicht auf Kontakt mit dem konkreten Paddel auf dem Spielfeld.
 +
 +
 +Erstelle eine neue Methode ''reflektierePaddel()'' und füge den zugehörigen Metho­denaufruf **an geeigneter Stelle**  in ''act()'' ein. Teste dein Programm.
 +
 +Nun fehlt nur noch die Reflexion des Balls an den Blöcken und das Entfernen des getroffe­nen Blocks. Erstelle dazu eine Methode ''reflektiereBlock()'' und füge den zugehöri­gen Methodenaufruf an geeigneter Stelle in ''act()'' ein.
 +<code java>
 +private void reflektiereBlock() {
 +    Actor block = getOneIntersectingObject(Block.class);
 +    if (block != null) {
 +        dy = -dy;
 +        getWorld().removeObject(block);
 +    }
 +}
 +</code>
 +
 +Im Unterschied zu ''reflektierePaddel()'' wird ein Verweis auf den getroffenen Block einige Zeilen später benötigt, weil man genau diesen Block entfernen will. Aus diesem Grund muss man ihn in einer lokalen Variablen speichern.
 +
 +Mit dem Methodenaufruf ''getOneIntersectingObject(Block.class)'' prüft man zunächst auf Kontakt mit irgendeinem Objekt der Klasse Block (''Block.class''). Erst dann, wenn diese Metho­de einen ''Actor'' zurück liefert, hat man den konkreten Block gefunden, den man anschließend entfernen kann.
  
  
  • faecher/informatik/mittelstufe/breakout/breakout05/start.1697138451.txt.gz
  • Zuletzt geändert: 12.10.2023 19:20
  • von Frank Schiebel