Pac-Man/src/Player.java

246 lines
7.2 KiB
Java

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;
}
}
}