From 3e955cdfe4303cdf0af2370df60f2b70ddb4cb3f Mon Sep 17 00:00:00 2001 From: Thomas Smits Date: Sat, 20 Jan 2024 16:43:16 +0100 Subject: [PATCH] Update of exercises --- Assignment_074/readme.md | 2 + Assignment_074/solution/readme.md | 3 +- .../main/java/pr2/lambda/anonymous/Alien.java | 46 ++++++++++++++ .../java/pr2/lambda/anonymous/GameBoard.java | 62 +++++++++++++++++++ .../java/pr2/lambda/anonymous/GameMain.java | 28 +++++++++ 5 files changed, 139 insertions(+), 2 deletions(-) create mode 100644 sources/src/main/java/pr2/lambda/anonymous/Alien.java create mode 100644 sources/src/main/java/pr2/lambda/anonymous/GameBoard.java create mode 100644 sources/src/main/java/pr2/lambda/anonymous/GameMain.java diff --git a/Assignment_074/readme.md b/Assignment_074/readme.md index e037d19..bece556 100644 --- a/Assignment_074/readme.md +++ b/Assignment_074/readme.md @@ -8,6 +8,8 @@ Eine anonyme Klasse verwenden, um einen Event-Handler zu implementieren. Den Zug ## Aufgabe +Gehen Sie in das Paket [pr2.lambda.anonymous](../../solutions/src/main/java/pr2/lambda/anonymous/). + In dieser Aufgabe sollen Sie den Event-Handler für das Zerstören des Aliens als anonyme Klasse im Konstruktor von `GameBoard` realisieren. D.h. nicht mehr das Alien selbst reagiert auf das Klicken, sondern das `GameBoard` bekommt alle Klicks und überprüft, ob sich die Maus über dem Alien befindet. Fügen Sie dem Konstruktor von `GameBoard` eine anonyme Klasse hinzu, die von `MouseAdapter` erbt. Überschreiben Sie in dieser Klasse die Methode `mousePressed` aus `MouseAdapter`. diff --git a/Assignment_074/solution/readme.md b/Assignment_074/solution/readme.md index 6c6590c..b349ed6 100644 --- a/Assignment_074/solution/readme.md +++ b/Assignment_074/solution/readme.md @@ -2,5 +2,4 @@ Musterlösung: -[pr2.lambda.anonymous](../../solutions/src/main/java/pr2/lambda/anonymous/). -va) +[pr2.lambda.anonymous](../../solutions/src/main/java/pr2/lambda/anonymous/) diff --git a/sources/src/main/java/pr2/lambda/anonymous/Alien.java b/sources/src/main/java/pr2/lambda/anonymous/Alien.java new file mode 100644 index 0000000..15ab6ce --- /dev/null +++ b/sources/src/main/java/pr2/lambda/anonymous/Alien.java @@ -0,0 +1,46 @@ +package pr2.lambda.anonymous; + +import de.smits_net.games.framework.board.Board; +import de.smits_net.games.framework.image.AnimatedImage; +import de.smits_net.games.framework.image.ImagePack; +import de.smits_net.games.framework.image.StripedImage; +import de.smits_net.games.framework.sprite.AnimatedSprite; +import de.smits_net.games.framework.sprite.Direction; + +import java.awt.Point; + +/** + * Ein Alien. + */ +public class Alien extends AnimatedSprite { + + /** + * Geschwindigkeit des Aliens X-Richtung. + */ + private static final int ALIEN_SPEED = 2; + + /** + * Neues Alien anlegen. + * + * @param board das Spielfeld + * @param startPoint Start-Position + */ + public Alien(Board board, Point startPoint) { + super(board, startPoint, BoundaryPolicy.JUMP_BACK, + new AnimatedImage(50, + new ImagePack("pr2/lambda/anonymous/", + "ship01", "ship02", "ship03"))); + velocity.setVelocity(Direction.WEST, ALIEN_SPEED); + } + + /** + * Alien explodieren lassen. + */ + public void explode() { + setActive(false); + setImages(new AnimatedImage(20, + new StripedImage("pr2/lambda/anonymous/explosion_1" + ".png", + 43))); + setInvisibleAfterFrames(70); + } +} diff --git a/sources/src/main/java/pr2/lambda/anonymous/GameBoard.java b/sources/src/main/java/pr2/lambda/anonymous/GameBoard.java new file mode 100644 index 0000000..a999179 --- /dev/null +++ b/sources/src/main/java/pr2/lambda/anonymous/GameBoard.java @@ -0,0 +1,62 @@ +package pr2.lambda.anonymous; + +import de.smits_net.games.framework.board.Board; + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Point; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.util.Random; + +/** + * Spielfeld. + */ +public class GameBoard extends Board { + + /** + * Alien, das durch das Bild läuft. + */ + Alien alien; // nicht private wegen des Zugriffs aus der inneren Klasse + + /** + * Erzeugt ein neues Board. + */ + public GameBoard() { + // neues Spielfeld anlegen + super(10, new Dimension(800, 300), Color.BLACK); + + // Alien initialisieren + alien = new Alien(this, + new Point(800, 50 + new Random().nextInt(100))); + + // TODO: Event-Handler hier erstellen + } + + /** + * Spielfeld neu zeichnen. Wird vom Framework aufgerufen. + */ + @Override + public void drawGame(Graphics g) { + // Alien zeichnen + alien.draw(g, this); + } + + /** + * Game-Over-Text anzeigen. Wird vom Framework aufgerufen. + */ + @Override + public void drawGameOver(Graphics g) { + centerText(g, "Das Spiel ist aus!"); + } + + /** + * Spielsituation updaten. Wird vom Framework aufgerufen. + */ + @Override + public boolean updateGame() { + alien.move(); + return alien.isVisible(); + } +} diff --git a/sources/src/main/java/pr2/lambda/anonymous/GameMain.java b/sources/src/main/java/pr2/lambda/anonymous/GameMain.java new file mode 100644 index 0000000..33056e6 --- /dev/null +++ b/sources/src/main/java/pr2/lambda/anonymous/GameMain.java @@ -0,0 +1,28 @@ +package pr2.lambda.anonymous; + +import de.smits_net.games.framework.board.MainWindow; + +import java.awt.EventQueue; + +/** + * Hauptklasse des Spiels. + */ +public class GameMain extends MainWindow { + + /** + * Neues Spiel anlegen. + */ + public GameMain() { + super("Click Alien - (04) Anonymous Class", new GameBoard()); + + } + + /** + * Startpunkt. + * + * @param args command line arguments. + */ + public static void main(String[] args) { + EventQueue.invokeLater(GameMain::new); + } +}