import java.awt.event.KeyEvent; import java.awt.event.KeyListener; // Diese Klasse stellt die vom Spieler mit den Pfeiltasten gestuerte Figur --> Pac-Man dar public class Player extends Picture implements KeyListener { // extends Picture --> Jeder 'Player' ist auch ein // 'Picture' // implements KeyListener --> Benötigt zum Erkennen von // gedrückten Tasten. private static final long serialVersionUID = -4225811153447791553L; public float xPos; // Position auf dem Frame in x-Richtung public float yPos; // Position auf dem Frame in y-Richtung public int lives = 3; private float speed = 0.00000008f; // Diee Geschwindigkeit von Pac-man. In alle Richtungen gleich. Muss so klein // sein wegen delta time public long timer; // Variable die speichert zu welchem Zeitpunkt eine Änderung der Richtung // vorgenommen wurde, welche nicht sofort durchgeführt wegen kann, wegen einem // Brick, welcher im Weg ist. --> siehe boolean hui public int blob = 1000; // Zeit in ms, nachdem die Richtungsangabe auf einer Geraden zurückgesetzt wird public boolean right; // Boolean der speichert, ob sich Pac-Man gerade nach rechts bewegt (Analog für // links, oben, unten) public boolean pressed_right; // Boolean der speichert, ob Pac-Man als nächstes nach rechts gehen soll (Analog // für links, oben, unten) public boolean left; public boolean pressed_left; public boolean up; public boolean pressed_up; public boolean down; public boolean pressed_down; public boolean hui; // Boolean zur Abfrage, ob gerade ein Brick im Weg ist, um den aktuellen // Richtungsbefehl durchzuführen. public Player() { // Erstellen des Konstruktors super("Pacman_Right"); // Aufrufen der übergeordneten Klasse (Picture) } public void calcDir(int keyCode) { // Methode zum Errechnen der Richtung in die Pacman gerade geht und als nächstes // gehen soll mit der Eingabe, welche Taste angeschlagen wurde // keyCode = 37 --> Pfeiltaste nach links // keyCode = 39 --> Pfeiltaste nach rechts // keyCode = 38 --> Pfeiltaste nach oben // keyCode = 40 --> Pfeiltaste nach unten if (keyCode == 37 || pressed_left && System.currentTimeMillis() - timer <= blob) { 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 (Map.bricks[j][i].xPos + 20 == (int) xPos && (int) yPos < Map.bricks[j][i].yPos + 20 && (int) yPos > Map.bricks[j][i].yPos - 20) { // wenn Pac-Man gerade rechts an einem // Brick vorbeistreift: hui = true; // Pac-Man kann gerade nicht nach links gehen } } } } if (!hui) { // wenn links von Pac-Man gerade kein Block ist: // bewegt sich Pac-Man nun nach links: left = true; right = false; up = false; down = false; // und Pac-Man hat keine Richtung in die er als nächstes soll: pressed_left = false; pressed_right = false; pressed_up = false; pressed_down = false; // und Pac-Man schaut jetzt nach links this.changeSauce("Pacman_Left"); } else { // ansonsten: // soll Pac-Man sich sobald er kann nach links bewegen pressed_left = true; pressed_right = false; pressed_up = false; pressed_down = false; if (keyCode == 37) // wenn die Pfeiltaste nach links gedrückt wurde: timer = System.currentTimeMillis(); // wird der Timer, der angibt, wann der Befehl zum nach links // Abbiegen eingegeben wurde } } // Analog für rechts, oben, unten: if (keyCode == 39 || pressed_right && System.currentTimeMillis() - timer <= blob) { for (int i = 0; i < 35; i++) { for (int j = 0; j < 35; j++) { if (Map.bricks[j][i] != null) { if (Map.bricks[j][i].xPos - 20 == (int) xPos && (int) yPos < Map.bricks[j][i].yPos + 20 && (int) yPos > Map.bricks[j][i].yPos - 20) { hui = true; } } } } if (!hui) { left = false; right = true; up = false; down = false; pressed_left = false; pressed_right = false; pressed_up = false; pressed_down = false; this.changeSauce("Pacman_Right"); } else { pressed_left = false; pressed_right = true; pressed_up = false; pressed_down = false; if (keyCode == 39) timer = System.currentTimeMillis(); } } if (keyCode == 38 || pressed_up && System.currentTimeMillis() - timer <= blob) { for (int i = 0; i < 35; i++) { for (int j = 0; j < 35; j++) { if (Map.bricks[j][i] != null) { if (Map.bricks[j][i].yPos + 20 == (int) yPos && (int) xPos < Map.bricks[j][i].xPos + 20 && (int) xPos > Map.bricks[j][i].xPos - 20) { hui = true; } } } } if (!hui) { left = false; right = false; up = true; down = false; pressed_left = false; pressed_right = false; pressed_up = false; pressed_down = false; this.changeSauce("Pacman_Up"); } else { pressed_left = false; pressed_right = false; pressed_up = true; pressed_down = false; if (keyCode == 38) timer = System.currentTimeMillis(); } } if (keyCode == 40 || pressed_down && System.currentTimeMillis() - timer <= blob) { for (int i = 0; i < 35; i++) { for (int j = 0; j < 35; j++) { if (Map.bricks[j][i] != null) { if (Map.bricks[j][i].yPos - 20 == (int) yPos && (int) xPos < Map.bricks[j][i].xPos + 20 && (int) xPos > Map.bricks[j][i].xPos - 20) { hui = true; } } } } if (!hui) { left = false; right = false; up = false; down = true; pressed_left = false; pressed_right = false; pressed_up = false; pressed_down = false; this.changeSauce("Pacman_Down"); } else { pressed_left = false; pressed_right = false; pressed_up = false; pressed_down = true; if (keyCode == 40) timer = System.currentTimeMillis(); } } hui = false; // Muss zurückgesetzt werden } // Methoden zur Erkennung von Tastenanschlägen: public void keyPressed(KeyEvent e) { calcDir(e.getKeyCode()); // aufrufen von der Methode calcDir mit der Eingabe e.getKeyCode() --> zuletzt // angeschlagene Taste } // Die folgenden 2 Methoden sind zwar leer, müssen jedoch trotzdem existieren, // damit nicht dauerhaft Fehlermeldungen ausgegeben werden: public void keyReleased(KeyEvent e) { } public void keyTyped(KeyEvent e) { } // Methode zum Errechnen der aktuellen Position public int getPos(char coordinate, long dt) { // Hier kommt die zuvor erwähnte delta time ins Spiel if (coordinate == 'x') { // Auslesen der 'x' - Koordinate: if (left && dt != 0) { xPos -= speed * dt; } else if (right && dt != 0) { xPos += speed * dt; } return (int) xPos; } else if (coordinate == 'y') { // Auslesen der 'y' - Koordinate: if (down && dt != 0) { yPos += speed * dt; } else if (up && dt != 0) { yPos -= speed * dt; } return (int) yPos; } else { return -1; } } // Methode zum Setzen einer neuen Position: public void setPos(char coordinate, int newPos) { if (coordinate == 'x') { this.xPos = newPos; } else if (coordinate == 'y') { this.yPos = newPos; } } }