commit aa2592086db2c64aa8ea0584e4f74c5ca214596e Author: burkart Date: Mon Oct 16 15:09:46 2023 +0200 Initial sharing of project 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