import java.awt.Color; import javax.swing.JFrame; import javax.swing.JPanel; // In dieser Klasse findet der größte Teil des Spiels statt: // Rendern von Map, Geistern, Pac-Man etc. // Überprüfung von Kollisionen verschiedener Elemente (der komplizierteste Teil des Programms) public class Game { // Deklaration der sichtbaren Elemente JFrame frame; JPanel panel; Player player; Ghost ghosts[]; Map map; // Delta time: siehe https://en.wikipedia.org/wiki/Delta_timing private long dt; private long lastT; private int delaytimer = 9; @SuppressWarnings("unused") private long fps = 60; private int windowSizeX = 800; // Größe des Frame in x-Richtung private int windowSizeY = 800; // Größe des Frame in y-Richtung private int frameLocationX = 100; // Position des Frame auf dem Bildschirm in x-Richtung private int frameLocationY = 100; // Position des Frame auf dem Bildschirm in x-Richtung // oben links (0|0) // nach rechts --> x wird größer // nach unten --> y wird größer public Game() { // Erstellen des Konstruktors (Was soll passieren, sobald dieses Klasse // aufgerufen wird?) frame = new JFrame(); // Fenster panel = new JPanel(); // darauf werden alle sichtbaren Elemente gespeichert ghosts = new Ghost[1]; // 4 Geister boolean[] ghost_up_possible = new boolean[ghosts.length]; boolean[] ghost_down_possible = new boolean[ghosts.length]; boolean[] ghost_left_possible = new boolean[ghosts.length]; boolean[] ghost_right_possible = new boolean[ghosts.length]; player = new Player(); // Pac-Man panel.add(player); // Pac-Man wird dem Panel hinzugefügt frame.addKeyListener(player); // KeyListener wird hinzugefügt, man kann nun Pac-Maan mit der tastatur steuern // Einstellen des Frame bezüglich Größe und Position frame.setSize(windowSizeX, windowSizeY); frame.setLocation(frameLocationX, frameLocationY); frame.setVisible(false); frame.setTitle("Pac-Man"); // Der Titel des Frame wird auf "Pac-Man" gesetzt frame.setResizable(false); // Man kann die Größe des Frame nicht verändern frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Wenn der Frame geschlossen wird, wird auch das Programm // beendet // Der Inhalt des Panels wird auf dem Frame angezeigt: frame.setContentPane(panel); frame.getContentPane().setLayout(null); panel.setBackground(Color.BLACK); // Der Hintergrund ist schwarz for (int i = 0; i < ghosts.length; i++) { // für jeden Geist: ghosts[i] = new Ghost(i); // Erstellen des jeweiligen Geistes panel.add(ghosts[i]); // Hinzufügen zum Panel des jeiligen Geistes ghosts[i].setBounds(ghosts[i].getPos('x', 0), ghosts[i].getPos('y', 0), 20, 20); } map = new Map(player, ghosts); // Map auf der gespielt wird map.mapping(); player.setBounds(player.getPos('x', 0), player.getPos('y', 0), 20, 20); // Pac-Man wird das erste Mal gerendert for (int i = 0; i < 35; i++) { // für jeden Brick for (int j = 0; j < 35; j++) { // für jeden Brick if (Map.bricks[j][i] != null) { // Damit kein Fehler auftritt wegen nicht vorhandenen Bricks panel.add(Map.bricks[j][i]); // Der jeweilige Brick wird zum panel hinzugefügt Map.bricks[j][i].setBounds(Map.bricks[j][i].xPos, Map.bricks[j][i].yPos, 20, 20); // Rendern des } } } frame.setVisible(true); lastT = System.nanoTime(); // delta time while (true) { // Hauptschleife dt = System.nanoTime() - lastT; // delta time lastT = System.nanoTime(); // delta time // Zu Beginn jeden Schleifendurchlaufs wird die Position von Pac-Man neu // gesetzt: player.setLocation(player.getPos('x', dt), player.getPos('y', dt)); // Aktualiesieren der Positionen der Geister: for (int i = 0; i < ghosts.length; i++) { ghosts[i].setLocation(ghosts[i].getPos('x', dt), ghosts[i].getPos('y', dt)); } for (int i = 0; i < ghosts.length; i++) { if (Map.bricks[((ghosts[i].getPos('y', 0) - 10) / 20) - 1][(ghosts[i].getPos('x', 0) - 10) / 20] == null) { ghost_up_possible[i] = true; } if (Map.bricks[((ghosts[i].getPos('y', 0) - 10) / 20) + 1][(ghosts[i].getPos('x', 0) - 10) / 20] == null) { ghost_down_possible[i] = true; } if (Map.bricks[(ghosts[i].getPos('y', 0) - 10) / 20][((ghosts[i].getPos('x', 0) - 10) / 20) - 1] == null) { ghost_left_possible[i] = true; } if (Map.bricks[(ghosts[i].getPos('y', 0) - 10) / 20][((ghosts[i].getPos('x', 0) - 10) / 20) + 1] == null) { ghost_right_possible[i] = true; } System.out.println("up: " + ghost_up_possible[i] + " | down: " + ghost_down_possible[i] + " | left: " + ghost_left_possible[i] + " | right: " + ghost_right_possible[i]); // System.out.println((ghosts[i].getPos('y', 0) - 10) / 20); ghost_up_possible[i] = false; ghost_down_possible[i] = false; ghost_left_possible[i] = false; ghost_right_possible[i] = false; } // Kollision von Pac-Man mit Bricks: for (int i = 0; i < 35; i++) { // für jeden Brick for (int j = 0; j < 35; j++) { // für jeden Brick if (Map.bricks[j][i] != null) { // Damit kein Fehler auftritt wegen nicht vorhandenen Bricks if (player.getPos('x', 0) < Map.bricks[j][i].xPos + 20 && player.getPos('x', 0) > Map.bricks[j][i].xPos - 20 && player.getPos('y', 0) < Map.bricks[j][i].yPos + 20 && player.getPos('y', 0) > Map.bricks[j][i].yPos - 20) { if (player.left) { player.setPos('x', Map.bricks[j][i].xPos + 20); player.setPos('y', Map.bricks[j][i].yPos); player.left = false; } else if (player.right) { player.setPos('x', Map.bricks[j][i].xPos - 20); player.setPos('y', Map.bricks[j][i].yPos); player.right = false; } else if (player.up) { player.setPos('y', Map.bricks[j][i].yPos + 20); player.setPos('x', Map.bricks[j][i].xPos); player.up = false; } else if (player.down) { player.setPos('y', Map.bricks[j][i].yPos - 20); player.setPos('x', Map.bricks[j][i].xPos); player.down = false; } } } } } player.calcDir(0); // Berechnen wo Pac-Man als nächstes hin soll for (int i = 0; i < ghosts.length; i++) { if (player.getPos('x', 0) < ghosts[i].getPos('x', 0) + 20 && player.getPos('x', 0) > ghosts[i].getPos('x', 0) - 20 && player.getPos('y', 0) < ghosts[i].getPos('y', 0) + 20 && player.getPos('y', 0) > ghosts[i].getPos('y', 0) - 20) { player.lives--; System.out.println(player.lives); map.mapping(); } } fps = 1000000000 / dt; // System.out.println("fps: " + fps + " | delaytimer: " + delaytimer); delay(delaytimer); // Ein delay zum Ende der Hauptschleife } } // Methode zum verzögern (warten) in ms public void delay(int time) { try { Thread.sleep(time); } catch (InterruptedException e) { e.printStackTrace(); } } }