From aa2592086db2c64aa8ea0584e4f74c5ca214596e Mon Sep 17 00:00:00 2001 From: burkart Date: Mon, 16 Oct 2023 15:09:46 +0200 Subject: [PATCH] Initial sharing of project --- Block.java | 21 ++++++ Display.java | 31 ++++++++ GameObject.java | 12 ++++ GeistGegner.java | 96 +++++++++++++++++++++++++ GeistGegner2.java | 97 +++++++++++++++++++++++++ Labyrinth.java | 112 +++++++++++++++++++++++++++++ Nichts.java | 18 +++++ PacMan.java | 83 +++++++++++++++++++++ Punkt.java | 44 ++++++++++++ README.TXT | 24 +++++++ Spiel.java | 102 ++++++++++++++++++++++++++ Spielfiguren.java | 127 +++++++++++++++++++++++++++++++++ Spielobjekt.java | 17 +++++ bluej.pkg | 178 ++++++++++++++++++++++++++++++++++++++++++++++ package.bluej | 178 ++++++++++++++++++++++++++++++++++++++++++++++ 15 files changed, 1140 insertions(+) create mode 100644 Block.java create mode 100644 Display.java create mode 100644 GameObject.java create mode 100644 GeistGegner.java create mode 100644 GeistGegner2.java create mode 100644 Labyrinth.java create mode 100644 Nichts.java create mode 100644 PacMan.java create mode 100644 Punkt.java create mode 100644 README.TXT create mode 100644 Spiel.java create mode 100644 Spielfiguren.java create mode 100644 Spielobjekt.java create mode 100644 bluej.pkg create mode 100644 package.bluej diff --git a/Block.java b/Block.java new file mode 100644 index 0000000..d83f033 --- /dev/null +++ b/Block.java @@ -0,0 +1,21 @@ +import java.awt.*; +/** + * Beschreiben Sie hier die Klasse Wand. + * + * @author (Ihr Name) + * @version (eine Versionsnummer oder ein Datum) + */ +public class Block extends Spielobjekt +{ + + public Block(int x, int y){ + super(x,y); + } + + @Override + public void render(Graphics2D g, int SpielobjektGröße){ + g.setColor(Color.BLUE); + g.fillRect(x*SpielobjektGröße,y*SpielobjektGröße,SpielobjektGröße,SpielobjektGröße); + + } +} diff --git a/Display.java b/Display.java new file mode 100644 index 0000000..327d57a --- /dev/null +++ b/Display.java @@ -0,0 +1,31 @@ +import javax.swing.*; +import java.awt.*; + + +/** + * Beschreiben Sie hier die Klasse Display. + * + * @author (Ihr Name) + * @version (eine Versionsnummer oder ein Datum) + */ +public class Display extends JPanel +{ + private final Spiel spiel; + public Display(Spiel spiel){ + super(); + this.spiel = spiel; + spiel.add(this); + } + + @Override + public void paint(Graphics g){ + Graphics2D g2 = (Graphics2D) g; + g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); + g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BICUBIC); + g2.setRenderingHint(RenderingHints.KEY_RENDERING,RenderingHints.VALUE_RENDER_QUALITY); + + spiel.render(g2); + } + + +} diff --git a/GameObject.java b/GameObject.java new file mode 100644 index 0000000..611480e --- /dev/null +++ b/GameObject.java @@ -0,0 +1,12 @@ +import java.awt.*; +/** + * Beschreiben Sie hier die Klasse GameObject. + * + * @author (Ihr Name) + * @version (eine Versionsnummer oder ein Datum) + */ +public abstract class GameObject +{ + public abstract void render(Graphics2D g,int SpielobjektGröße); +} + \ No newline at end of file diff --git a/GeistGegner.java b/GeistGegner.java new file mode 100644 index 0000000..f4c8f57 --- /dev/null +++ b/GeistGegner.java @@ -0,0 +1,96 @@ + +import java.awt.*; +import java.awt.geom.Rectangle2D; +import java.awt.event.KeyListener; +import java.awt.event.KeyEvent; +/** + * Beschreiben Sie hier die Klasse PacMan. + * + * @author (Ihr Name) + * @version (eine Versionsnummer oder ein Datum) + */ +public class GeistGegner extends Spielfiguren implements KeyListener +{ + protected PacMan pacman; + + GeistGegner(Spiel spiel, double centerX, double centerY, double radius, double Geschwindigkeit){ + super(spiel, centerX, centerY, radius, Geschwindigkeit, Color.RED); + } + + public void tickSpielerkollision() { + int x = (int) centerX; + int y = (int) centerY; + + double dx = pacman.getCenterX() - centerX; + double dy = pacman.getCenterY() - centerY; + double r = pacman.getRadius() + radius; + + if (dx * dx + dy * dy < r * r) { + spiel.lose(); + } + } + + + + private void tickPunktKollision(){ + int x = (int) centerX; + int y = (int) centerY; + if(spiel.getLabyrinth().getSpielobjekt(x,y) instanceof Punkt punkt){ + double dx = punkt.getCenterX() - centerX; + double dy = punkt.getCenterY() - centerY; + double r = punkt.getRadius() + radius; + + if (dx * dy + dy * dx < r * r){ + spiel.getLabyrinth().setSpielobjekt(x, y, new Nichts(x, y)); + if (spiel.getLabyrinth().PunkteZaehler() == 0) { + spiel.win(); + } + } + } + } + + @Override + public void keyTyped(KeyEvent e){ + + } + + @Override + public void keyPressed(KeyEvent e) { + int keyCode = e.getKeyCode(); + + if (keyCode == KeyEvent.VK_T) { + bevorzugteRichtungX = 0; + bevorzugteRichtungY = -1; + }else if (keyCode == KeyEvent.VK_F) { + bevorzugteRichtungX = -1; + bevorzugteRichtungY = 0; + }else if (keyCode == KeyEvent.VK_G) { + bevorzugteRichtungX = 0; + bevorzugteRichtungY = 1; + }else if (keyCode == KeyEvent.VK_H) { + bevorzugteRichtungX = 1; + bevorzugteRichtungY = 0; + } + } + + @Override + public void keyReleased(KeyEvent e){ + + } + + @Override + public void tick(){ + super.tick(); + } + + @Override + public void render(Graphics2D g, int SpielobjektGröße){ + double centerXOnScreen = centerX * SpielobjektGröße; + double centerYOnScreen = centerY* SpielobjektGröße; + double radiusOnScreen = radius * SpielobjektGröße; + double diameterOnScreen = radiusOnScreen * 2.0; + + g.setColor(color); + g.fill(new Rectangle2D.Double(centerXOnScreen - radiusOnScreen, centerYOnScreen - radiusOnScreen, diameterOnScreen, diameterOnScreen)); + } +} \ No newline at end of file diff --git a/GeistGegner2.java b/GeistGegner2.java new file mode 100644 index 0000000..98cb206 --- /dev/null +++ b/GeistGegner2.java @@ -0,0 +1,97 @@ + + +import java.awt.*; +import java.awt.geom.Rectangle2D; +import java.awt.event.KeyListener; +import java.awt.event.KeyEvent; +/** + * Beschreiben Sie hier die Klasse PacMan. + * + * @author (Ihr Name) + * @version (eine Versionsnummer oder ein Datum) + */ +public class GeistGegner2 extends Spielfiguren implements KeyListener +{ + protected PacMan pacman; + + GeistGegner2(Spiel spiel, double centerX, double centerY, double radius, double Geschwindigkeit){ + super(spiel, centerX, centerY, radius, Geschwindigkeit, Color.BLUE); + } + + public void tickSpielerkollision() { + int x = (int) centerX; + int y = (int) centerY; + + double dx = pacman.getCenterX() - centerX; + double dy = pacman.getCenterY() - centerY; + double r = pacman.getRadius() + radius; + + if (dx * dx + dy * dy < r * r) { + spiel.lose(); + } + } + + + + private void tickPunktKollision(){ + int x = (int) centerX; + int y = (int) centerY; + if(spiel.getLabyrinth().getSpielobjekt(x,y) instanceof Punkt punkt){ + double dx = punkt.getCenterX() - centerX; + double dy = punkt.getCenterY() - centerY; + double r = punkt.getRadius() + radius; + + if (dx * dy + dy * dx < r * r){ + spiel.getLabyrinth().setSpielobjekt(x, y, new Nichts(x, y)); + if (spiel.getLabyrinth().PunkteZaehler() == 0) { + spiel.win(); + } + } + } + } + + @Override + public void keyTyped(KeyEvent e){ + + } + + @Override + public void keyPressed(KeyEvent e) { + int keyCode = e.getKeyCode(); + + if (keyCode == KeyEvent.VK_UP) { + bevorzugteRichtungX = 0; + bevorzugteRichtungY = -1; + }else if (keyCode == KeyEvent.VK_LEFT) { + bevorzugteRichtungX = -1; + bevorzugteRichtungY = 0; + }else if (keyCode == KeyEvent.VK_DOWN) { + bevorzugteRichtungX = 0; + bevorzugteRichtungY = 1; + }else if (keyCode == KeyEvent.VK_RIGHT) { + bevorzugteRichtungX = 1; + bevorzugteRichtungY = 0; + } + } + + @Override + public void keyReleased(KeyEvent e){ + + } + + @Override + public void tick(){ + super.tick(); + } + + @Override + public void render(Graphics2D g, int SpielobjektGröße){ + double centerXOnScreen = centerX * SpielobjektGröße; + double centerYOnScreen = centerY* SpielobjektGröße; + double radiusOnScreen = radius * SpielobjektGröße; + double diameterOnScreen = radiusOnScreen * 2.0; + + g.setColor(color); + g.fill(new Rectangle2D.Double(centerXOnScreen - radiusOnScreen, centerYOnScreen - radiusOnScreen, diameterOnScreen, diameterOnScreen)); + } +} \ No newline at end of file diff --git a/Labyrinth.java b/Labyrinth.java new file mode 100644 index 0000000..eb1f1f1 --- /dev/null +++ b/Labyrinth.java @@ -0,0 +1,112 @@ +import java.awt.*; +/** + * Beschreiben Sie hier die Klasse Labyrinth. + * + * @author (Ihr Name) + * @version (eine Versionsnummer oder ein Datum) + */ +public class Labyrinth extends GameObject +{ + + private static final int[][] MAP = { + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 1, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 1}, + {1, 2, 1, 1, 1, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 1, 1, 1, 2, 1}, + {1, 2, 1, 2, 2, 2, 1, 2, 2, 2, 1, 0, 2, 2, 2, 0, 1, 2, 2, 2, 1, 2, 2, 2, 1, 2, 1}, + {1, 2, 1, 2, 1, 2, 1, 2, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1}, + {1, 2, 2, 2, 1, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 1, 2, 2, 2, 1}, + {1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1}, + {1, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 1}, + {1, 2, 1, 2, 1, 2, 1, 2, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1}, + {1, 2, 1, 2, 1, 2, 1, 2, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1}, + {1, 2, 1, 2, 1, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 1, 2, 1, 2, 1}, + {1, 2, 1, 2, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 2, 1, 2, 1}, + {1, 2, 2, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 1, 2, 2, 2, 2, 1, 2, 2, 2, 1, 2, 2, 2, 1}, + {1, 2, 1, 2, 1, 2, 1, 2, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1}, + {1, 2, 1, 2, 2, 2, 1, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 1, 2, 2, 2, 1, 2, 1}, + {1, 2, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 1, 1, 2, 1}, + {1, 2, 2, 2, 2, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1} + }; + + private final int SpielobjektGröße; + Spielobjekt[][]Spielobjekte; + + Labyrinth(int SpielobjektGröße){ + this.SpielobjektGröße = SpielobjektGröße; + Spielobjekte = new Spielobjekt[MAP.length][MAP[0].length]; + zuruecksetzen(); + + } + + public void zuruecksetzen(){ + for(int y = 0; y < getHöhe(); y++){ + for(int x = 0; x < getBreite(); x++){ + int SpielobjektID = MAP[y][x]; + + if(SpielobjektID == 0){ + Spielobjekte[y][x] = new Nichts(x,y); + }else if(SpielobjektID == 1){ + Spielobjekte[y][x] = new Block(x,y); + }else if(SpielobjektID == 2){ + Spielobjekte[y][x] = new Punkt(x,y); + } + } + } + } + + public void render(Graphics2D g, int SpielobjektGröße){ + for(Spielobjekt[] row: Spielobjekte){ + for(Spielobjekt spielobjekt: row){ + spielobjekt.render(g, SpielobjektGröße); + } + } + } + + public int PunkteZaehler(){ + int sum = 0; + + for (Spielobjekt[] reihe : Spielobjekte){ + for (Spielobjekt spielobjekt : reihe){ + if (spielobjekt instanceof Punkt){ + sum++; + } + } + } + + return sum; + } + + public boolean isFrei(int x, int y){ + if(x < 0){ + return false; + }else if(y < 0){ + return false; + }else if(x >= getBreite()){ + return false; + }else if(y >= getHöhe()){ + return false; + } + return !(Spielobjekte[y][x] instanceof Block); + } + + public int getBreite(){ + return Spielobjekte[0].length; + } + + public int getHöhe(){ + return Spielobjekte.length; + } + + public int getSpielobjektGröße(){ + return SpielobjektGröße; + } + + public Spielobjekt getSpielobjekt(int x, int y){ + return Spielobjekte[y][x]; + } + + public void setSpielobjekt(int x, int y, Spielobjekt spielobjekt){ + Spielobjekte[y][x] = spielobjekt; + } +} diff --git a/Nichts.java b/Nichts.java new file mode 100644 index 0000000..090f1a7 --- /dev/null +++ b/Nichts.java @@ -0,0 +1,18 @@ +import java.awt.*; +/** + * Beschreiben Sie hier die Klasse Nichts. + * + * @author (Ihr Name) + * @version (eine Versionsnummer oder ein Datum) + */ +public class Nichts extends Spielobjekt +{ + Nichts(int x, int y){ + super(x,y); + } + + public void render(Graphics2D g, int SpielobjektGröße){ + + } + +} diff --git a/PacMan.java b/PacMan.java new file mode 100644 index 0000000..b217609 --- /dev/null +++ b/PacMan.java @@ -0,0 +1,83 @@ +import java.awt.*; +import java.awt.geom.Ellipse2D; +import java.awt.event.KeyListener; +import java.awt.event.KeyEvent; +/** + * Beschreiben Sie hier die Klasse PacMan. + * + * @author (Ihr Name) + * @version (eine Versionsnummer oder ein Datum) + */ +public class PacMan extends Spielfiguren implements KeyListener +{ + PacMan(Spiel spiel, double centerX, double centerY, double radius, double Geschwindigkeit){ + super(spiel, centerX, centerY, radius, Geschwindigkeit, Color.YELLOW); + } + + private void tickPunktKollision(){ + int x = (int) centerX; + int y = (int) centerY; + if(spiel.getLabyrinth().getSpielobjekt(x,y) instanceof Punkt punkt){ + double dx = punkt.getCenterX() - centerX; + double dy = punkt.getCenterY() - centerY; + double r = punkt.getRadius() + radius; + + if (dx * dy + dy * dx < r * r){ + spiel.getLabyrinth().setSpielobjekt(x, y, new Nichts(x, y)); + if (spiel.getLabyrinth().PunkteZaehler() == 0) { + spiel.win(); + } + } + + } + } + + + + @Override + public void tick(){ + super.tick(); + tickPunktKollision(); + } + + @Override + public void render(Graphics2D g, int SpielobjektGröße){ + double centerXOnScreen = centerX * SpielobjektGröße; + double centerYOnScreen = centerY* SpielobjektGröße; + double radiusOnScreen = radius * SpielobjektGröße; + double diameterOnScreen = radiusOnScreen * 2.0; + + g.setColor(color); + g.fill(new Ellipse2D.Double(centerXOnScreen - radiusOnScreen, centerYOnScreen - radiusOnScreen, diameterOnScreen, diameterOnScreen)); + } + + @Override + public void keyTyped(KeyEvent e){ + + } + + @Override + public void keyPressed(KeyEvent e) { + int keyCode = e.getKeyCode(); + + if (keyCode == KeyEvent.VK_W) { + bevorzugteRichtungX = 0; + bevorzugteRichtungY = -1; + }else if (keyCode == KeyEvent.VK_A) { + bevorzugteRichtungX = -1; + bevorzugteRichtungY = 0; + }else if (keyCode == KeyEvent.VK_S) { + bevorzugteRichtungX = 0; + bevorzugteRichtungY = 1; + }else if (keyCode == KeyEvent.VK_D) { + bevorzugteRichtungX = 1; + bevorzugteRichtungY = 0; + } + } + + + @Override + public void keyReleased(KeyEvent e){ + + } +} diff --git a/Punkt.java b/Punkt.java new file mode 100644 index 0000000..1476661 --- /dev/null +++ b/Punkt.java @@ -0,0 +1,44 @@ +import java.awt.*; +import java.awt.geom.Ellipse2D; +/** + * Beschreiben Sie hier die Klasse Punkt. + * + * @author (Ihr Name) + * @version (eine Versionsnummer oder ein Datum) + */ +public class Punkt extends Spielobjekt +{ + double radius; + + Punkt(int x, int y, double radius){ + super(x,y); + this.radius = radius; + } + + public Punkt(int x, int y){ + this(x,y, 0.125); + } + + @Override + public void render(Graphics2D g, int SpielobjektGröße){ + double centerXOnScreen = getCenterX() * SpielobjektGröße; + double centerYOnScreen = getCenterY()* SpielobjektGröße; + double radiusOnScreen = radius * SpielobjektGröße; + double diameterOnScreen = radiusOnScreen * 2.0; + + g.setColor(Color.YELLOW); + g.fill(new Ellipse2D.Double(centerXOnScreen - radiusOnScreen, centerYOnScreen - radiusOnScreen, diameterOnScreen, diameterOnScreen)); + } + + public double getCenterX(){ + return x + 0.5; + } + + public double getCenterY(){ + return y + 0.5; + } + + public double getRadius(){ + return radius; + } +} diff --git a/README.TXT b/README.TXT new file mode 100644 index 0000000..03573c3 --- /dev/null +++ b/README.TXT @@ -0,0 +1,24 @@ + +PROJEKTBEZEICHNUNG: Grafikdokument + +PROJEKTZWECK: +Ein erstes Einstiegsprojekt in die Entwicklungsumgebung BlueJ. +Dient zur Wiederholung der Begriffe Klasse, Objekt, Attribut, Methode, etc. +aus dem Informatikunterricht der Unterstufe. + +Man kann verschiedene Figuren erzeugen, die mit ihrem zugehörigen Grafiksymbol +in einem Grafikfenster eingezeichnet werden. + +Diese Figuren können, durch den Aufruf von Methoden interaktiv verändert werden. +Nach jedem Methodenaufruf wird das Grafiksymbol und damit die ganze Zeichnung +automatisch angepasst. + +WIE IST DAS PROJEKT ZU STARTEN: +Erzeugen neuer Figur-Objekte über das Kontextmenü. + +VERSION: +1.0 + +AUTOR(EN): +U.Freiberger + diff --git a/Spiel.java b/Spiel.java new file mode 100644 index 0000000..dfc9933 --- /dev/null +++ b/Spiel.java @@ -0,0 +1,102 @@ +import javax.swing.*; +import java.awt.*; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; + + +/** + * Beschreiben Sie hier die Klasse Spiel. + * + * @author (Ihr Name) + * @version (eine Versionsnummer oder ein Datum) + */ +public class Spiel extends JFrame +{ + private final Display display; + private final Labyrinth labyrinth; + private final PacMan pacman; + private final GeistGegner geistgegner; + private final GeistGegner2 geistgegner2; + + private boolean won; + + + + + Spiel(){ + super("Game"); + + display = new Display(this); + labyrinth = new Labyrinth(40); + pacman = new PacMan(this, 13.5, 10.5, 0.375, 0.07); + addKeyListener(pacman); + + geistgegner = new GeistGegner(this,12.5, 8.5, 0.375, 0.06); + addKeyListener(geistgegner); + + geistgegner2 = new GeistGegner2(this,14.5, 8.5, 0.375, 0.06); + addKeyListener(geistgegner2); + + + setSize(1096, 759); + setResizable(false); + setDefaultCloseOperation(EXIT_ON_CLOSE); + setLocationRelativeTo(null); + setVisible(true); + + startSpielLoop(); + } + + + + private void startSpielLoop(){ + Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(()-> {tick();display.repaint();}, 0L, 1000L / 60L, TimeUnit.MILLISECONDS); + } + + private void zuruecksetzen(){ + won = false; + labyrinth.zuruecksetzen(); + pacman.zuruecksetzen(); + geistgegner.zuruecksetzen(); + geistgegner2.zuruecksetzen(); + } + + public void win() { + won = true; + } + + public void lose(){ + JOptionPane.showMessageDialog(null, "Game Over!"); + zuruecksetzen(); + } + + private void tick(){ + if (won) { + JOptionPane.showMessageDialog(null, "Du hast gewonnen!"); + zuruecksetzen(); + } + pacman.tick(); + geistgegner.tick(); + geistgegner2.tick(); + } + + public void render(Graphics2D g2){ + g2.setColor(Color.BLACK); + g2.fillRect(0,0,getWidth(), getHeight()); + + labyrinth.render(g2, labyrinth.getSpielobjektGröße()); + pacman.render(g2, labyrinth.getSpielobjektGröße()); + + geistgegner.render(g2, labyrinth.getSpielobjektGröße()); + geistgegner2.render(g2, labyrinth.getSpielobjektGröße()); + + } + + public Labyrinth getLabyrinth(){ + return labyrinth; + } + + public GeistGegner getGegner() { + return geistgegner; + } +} diff --git a/Spielfiguren.java b/Spielfiguren.java new file mode 100644 index 0000000..c51243f --- /dev/null +++ b/Spielfiguren.java @@ -0,0 +1,127 @@ +import java.awt.*; +import java.awt.geom.Ellipse2D; +/** + * Beschreiben Sie hier die Klasse Spielfiguren. + * + * @author (Ihr Name) + * @version (eine Versionsnummer oder ein Datum) + */ +public abstract class Spielfiguren extends GameObject +{ + protected final Spiel spiel; + protected double centerX; + protected double centerY; + protected final double radius; + protected final double Geschwindigkeit; + protected Color color; + + protected int bevorzugteRichtungX; + protected int bevorzugteRichtungY; + protected int bewegteRichtungX; + protected int bewegteRichtungY; + + private final double initialX; + private final double initialY; + + public Spielfiguren(Spiel spiel, double centerX, double centerY, double radius, double Geschwindigkeit, Color color){ + this.spiel = spiel; + this.centerX = centerX; + this.centerY = centerY; + this.radius = radius; + this.Geschwindigkeit = Geschwindigkeit; + this.color = color; + + initialX = centerX; + initialY = centerY; + } + + public void zuruecksetzen(){ + centerX = initialX; + centerY = initialY; + bevorzugteRichtungX= 0; + bevorzugteRichtungY = 0; + bewegteRichtungX = 0; + bewegteRichtungY = 0; + } + + public void tickBewegteRichtung(){ + if(bewegteRichtungX == 0 && bewegteRichtungY == 0){ + bewegteRichtungX = bevorzugteRichtungX; + bewegteRichtungY = bevorzugteRichtungY; + }else if(bewegteRichtungX != 0 && bevorzugteRichtungX != 0){ + bewegteRichtungX = bevorzugteRichtungX; + }else if(bewegteRichtungY != 0 && bevorzugteRichtungY != 0){ + bewegteRichtungY = bevorzugteRichtungY; + } + } + + public void tickWallCollisions(){ + Labyrinth labyrinth = spiel.getLabyrinth(); + + if(bewegteRichtungX == 1 && !labyrinth.isFrei((int) (centerX + 0.5), (int) centerY)){ + centerX = (int) centerX + 0.5; + bewegteRichtungX = 0; + }else if(bewegteRichtungX == -1 && !labyrinth.isFrei((int) (centerX -0.5), (int) centerY)){ + centerX = (int) centerX + 0.5; + bewegteRichtungX = 0; + }else if(bewegteRichtungY == 1 && !labyrinth.isFrei((int) centerX, (int) (centerY + 0.5))){ + centerY = (int) centerY + 0.5; + bewegteRichtungY = 0; + }else if(bewegteRichtungY == -1 && !labyrinth.isFrei((int) centerX, (int) (centerY - 0.5))){ + centerY = (int) centerY + 0.5; + bewegteRichtungY = 0; + } + } + + + private void tickTurn(boolean crossedCenterX, boolean crossedCenterY){ + boolean turnXToY = crossedCenterX && bewegteRichtungX != 0 && bevorzugteRichtungY != 0 && spiel.getLabyrinth().isFrei((int) centerX, (int) (centerY + bevorzugteRichtungY)); + boolean turnYToX = crossedCenterY && bewegteRichtungY != 0 && bevorzugteRichtungX != 0 && spiel.getLabyrinth().isFrei((int) (centerX + bevorzugteRichtungX), (int) centerY); + if(turnXToY){ + centerX = (int) centerX + 0.5; + bewegteRichtungX = 0; + bewegteRichtungY = bevorzugteRichtungY; + }else if(turnYToX){ + centerX = (int) centerX + 0.5; + bewegteRichtungY = 0; + bewegteRichtungX = bevorzugteRichtungX; + } + } + + public void tick(){ + tickBewegteRichtung(); + + double newX = centerX + bewegteRichtungX * Geschwindigkeit; + double newY = centerY + bewegteRichtungY * Geschwindigkeit; + + boolean crossedCenterX = Math.abs((centerX - 0.5)%1.0 - (newX - 0.5) % 1.0)> 0.5; + boolean crossedCenterY = Math.abs((centerY - 0.5)%1.0 - (newY - 0.5) % 1.0)> 0.5; + + centerX = newX; + centerY = newY; + + + tickTurn(crossedCenterX, crossedCenterY); + tickWallCollisions(); + } + + public double getCenterX(){ + return centerX; + } + + public double getCenterY(){ + return centerY; + } + + public double getRadius(){ + return radius; + } + + public int getBewegteRichtungX() { + return bewegteRichtungX; + } + + public int getBewegteRichtungY() { + return bewegteRichtungY; + } +} diff --git a/Spielobjekt.java b/Spielobjekt.java new file mode 100644 index 0000000..87a1bca --- /dev/null +++ b/Spielobjekt.java @@ -0,0 +1,17 @@ + +/** + * Beschreiben Sie hier die Klasse Spielobjekte. + * + * @author (Ihr Name) + * @version (eine Versionsnummer oder ein Datum) + */ +public abstract class Spielobjekt extends GameObject +{ + protected final int x; + protected final int y; + + public Spielobjekt(int x, int y){ + this.x = x; + this.y = y; + } +} diff --git a/bluej.pkg b/bluej.pkg new file mode 100644 index 0000000..8b14838 --- /dev/null +++ b/bluej.pkg @@ -0,0 +1,178 @@ +#BlueJ package file +dependency1.from=PacMan +dependency1.to=Spiel +dependency1.type=UsesDependency +dependency10.from=GeistGegner +dependency10.to=Punkt +dependency10.type=UsesDependency +dependency11.from=GeistGegner +dependency11.to=Nichts +dependency11.type=UsesDependency +dependency12.from=Labyrinth +dependency12.to=Spielobjekt +dependency12.type=UsesDependency +dependency13.from=Labyrinth +dependency13.to=Nichts +dependency13.type=UsesDependency +dependency14.from=Labyrinth +dependency14.to=Block +dependency14.type=UsesDependency +dependency15.from=Labyrinth +dependency15.to=Punkt +dependency15.type=UsesDependency +dependency16.from=Spiel +dependency16.to=Display +dependency16.type=UsesDependency +dependency17.from=Spiel +dependency17.to=Labyrinth +dependency17.type=UsesDependency +dependency18.from=Spiel +dependency18.to=PacMan +dependency18.type=UsesDependency +dependency19.from=Spiel +dependency19.to=GeistGegner +dependency19.type=UsesDependency +dependency2.from=PacMan +dependency2.to=Punkt +dependency2.type=UsesDependency +dependency20.from=Spiel +dependency20.to=GeistGegner2 +dependency20.type=UsesDependency +dependency21.from=Spielfiguren +dependency21.to=Spiel +dependency21.type=UsesDependency +dependency22.from=Spielfiguren +dependency22.to=Labyrinth +dependency22.type=UsesDependency +dependency23.from=Display +dependency23.to=Spiel +dependency23.type=UsesDependency +dependency3.from=PacMan +dependency3.to=Nichts +dependency3.type=UsesDependency +dependency4.from=GeistGegner2 +dependency4.to=PacMan +dependency4.type=UsesDependency +dependency5.from=GeistGegner2 +dependency5.to=Spiel +dependency5.type=UsesDependency +dependency6.from=GeistGegner2 +dependency6.to=Punkt +dependency6.type=UsesDependency +dependency7.from=GeistGegner2 +dependency7.to=Nichts +dependency7.type=UsesDependency +dependency8.from=GeistGegner +dependency8.to=PacMan +dependency8.type=UsesDependency +dependency9.from=GeistGegner +dependency9.to=Spiel +dependency9.type=UsesDependency +editor.fx.0.height=0 +editor.fx.0.width=0 +editor.fx.0.x=0 +editor.fx.0.y=0 +objectbench.height=82 +objectbench.width=1256 +package.divider.horizontal=0.6 +package.divider.vertical=0.8469852104664392 +package.editor.height=488 +package.editor.width=1132 +package.editor.x=0 +package.editor.y=0 +package.frame.height=685 +package.frame.width=1294 +package.numDependencies=23 +package.numTargets=12 +package.showExtends=true +package.showUses=true +project.charset=windows-1252 +readme.height=60 +readme.name=@README +readme.width=48 +readme.x=10 +readme.y=10 +target1.height=70 +target1.name=PacMan +target1.showInterface=false +target1.type=ClassTarget +target1.width=120 +target1.x=780 +target1.y=270 +target10.height=70 +target10.name=Block +target10.showInterface=false +target10.type=ClassTarget +target10.width=120 +target10.x=480 +target10.y=390 +target11.height=70 +target11.name=Spielobjekt +target11.showInterface=false +target11.type=AbstractTarget +target11.width=120 +target11.x=320 +target11.y=210 +target12.height=70 +target12.name=Display +target12.showInterface=false +target12.type=ClassTarget +target12.width=120 +target12.x=10 +target12.y=150 +target2.height=70 +target2.name=GeistGegner2 +target2.showInterface=false +target2.type=ClassTarget +target2.width=120 +target2.x=930 +target2.y=90 +target3.height=70 +target3.name=GeistGegner +target3.showInterface=false +target3.type=ClassTarget +target3.width=120 +target3.x=770 +target3.y=90 +target4.height=70 +target4.name=Labyrinth +target4.showInterface=false +target4.type=ClassTarget +target4.width=120 +target4.x=530 +target4.y=110 +target5.height=70 +target5.name=Punkt +target5.showInterface=false +target5.type=ClassTarget +target5.width=120 +target5.x=160 +target5.y=390 +target6.height=70 +target6.name=Nichts +target6.showInterface=false +target6.type=ClassTarget +target6.width=120 +target6.x=320 +target6.y=350 +target7.height=70 +target7.name=Spiel +target7.showInterface=false +target7.type=ClassTarget +target7.width=120 +target7.x=100 +target7.y=40 +target8.height=70 +target8.name=GameObject +target8.showInterface=false +target8.type=AbstractTarget +target8.width=120 +target8.x=320 +target8.y=110 +target9.height=70 +target9.name=Spielfiguren +target9.showInterface=false +target9.type=AbstractTarget +target9.width=120 +target9.x=560 +target9.y=240 diff --git a/package.bluej b/package.bluej new file mode 100644 index 0000000..8b14838 --- /dev/null +++ b/package.bluej @@ -0,0 +1,178 @@ +#BlueJ package file +dependency1.from=PacMan +dependency1.to=Spiel +dependency1.type=UsesDependency +dependency10.from=GeistGegner +dependency10.to=Punkt +dependency10.type=UsesDependency +dependency11.from=GeistGegner +dependency11.to=Nichts +dependency11.type=UsesDependency +dependency12.from=Labyrinth +dependency12.to=Spielobjekt +dependency12.type=UsesDependency +dependency13.from=Labyrinth +dependency13.to=Nichts +dependency13.type=UsesDependency +dependency14.from=Labyrinth +dependency14.to=Block +dependency14.type=UsesDependency +dependency15.from=Labyrinth +dependency15.to=Punkt +dependency15.type=UsesDependency +dependency16.from=Spiel +dependency16.to=Display +dependency16.type=UsesDependency +dependency17.from=Spiel +dependency17.to=Labyrinth +dependency17.type=UsesDependency +dependency18.from=Spiel +dependency18.to=PacMan +dependency18.type=UsesDependency +dependency19.from=Spiel +dependency19.to=GeistGegner +dependency19.type=UsesDependency +dependency2.from=PacMan +dependency2.to=Punkt +dependency2.type=UsesDependency +dependency20.from=Spiel +dependency20.to=GeistGegner2 +dependency20.type=UsesDependency +dependency21.from=Spielfiguren +dependency21.to=Spiel +dependency21.type=UsesDependency +dependency22.from=Spielfiguren +dependency22.to=Labyrinth +dependency22.type=UsesDependency +dependency23.from=Display +dependency23.to=Spiel +dependency23.type=UsesDependency +dependency3.from=PacMan +dependency3.to=Nichts +dependency3.type=UsesDependency +dependency4.from=GeistGegner2 +dependency4.to=PacMan +dependency4.type=UsesDependency +dependency5.from=GeistGegner2 +dependency5.to=Spiel +dependency5.type=UsesDependency +dependency6.from=GeistGegner2 +dependency6.to=Punkt +dependency6.type=UsesDependency +dependency7.from=GeistGegner2 +dependency7.to=Nichts +dependency7.type=UsesDependency +dependency8.from=GeistGegner +dependency8.to=PacMan +dependency8.type=UsesDependency +dependency9.from=GeistGegner +dependency9.to=Spiel +dependency9.type=UsesDependency +editor.fx.0.height=0 +editor.fx.0.width=0 +editor.fx.0.x=0 +editor.fx.0.y=0 +objectbench.height=82 +objectbench.width=1256 +package.divider.horizontal=0.6 +package.divider.vertical=0.8469852104664392 +package.editor.height=488 +package.editor.width=1132 +package.editor.x=0 +package.editor.y=0 +package.frame.height=685 +package.frame.width=1294 +package.numDependencies=23 +package.numTargets=12 +package.showExtends=true +package.showUses=true +project.charset=windows-1252 +readme.height=60 +readme.name=@README +readme.width=48 +readme.x=10 +readme.y=10 +target1.height=70 +target1.name=PacMan +target1.showInterface=false +target1.type=ClassTarget +target1.width=120 +target1.x=780 +target1.y=270 +target10.height=70 +target10.name=Block +target10.showInterface=false +target10.type=ClassTarget +target10.width=120 +target10.x=480 +target10.y=390 +target11.height=70 +target11.name=Spielobjekt +target11.showInterface=false +target11.type=AbstractTarget +target11.width=120 +target11.x=320 +target11.y=210 +target12.height=70 +target12.name=Display +target12.showInterface=false +target12.type=ClassTarget +target12.width=120 +target12.x=10 +target12.y=150 +target2.height=70 +target2.name=GeistGegner2 +target2.showInterface=false +target2.type=ClassTarget +target2.width=120 +target2.x=930 +target2.y=90 +target3.height=70 +target3.name=GeistGegner +target3.showInterface=false +target3.type=ClassTarget +target3.width=120 +target3.x=770 +target3.y=90 +target4.height=70 +target4.name=Labyrinth +target4.showInterface=false +target4.type=ClassTarget +target4.width=120 +target4.x=530 +target4.y=110 +target5.height=70 +target5.name=Punkt +target5.showInterface=false +target5.type=ClassTarget +target5.width=120 +target5.x=160 +target5.y=390 +target6.height=70 +target6.name=Nichts +target6.showInterface=false +target6.type=ClassTarget +target6.width=120 +target6.x=320 +target6.y=350 +target7.height=70 +target7.name=Spiel +target7.showInterface=false +target7.type=ClassTarget +target7.width=120 +target7.x=100 +target7.y=40 +target8.height=70 +target8.name=GameObject +target8.showInterface=false +target8.type=AbstractTarget +target8.width=120 +target8.x=320 +target8.y=110 +target9.height=70 +target9.name=Spielfiguren +target9.showInterface=false +target9.type=AbstractTarget +target9.width=120 +target9.x=560 +target9.y=240