2020-02-17 16:29:50 +01:00
|
|
|
|
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<65>tigt zum Erkennen von
|
|
|
|
|
// gedr<64>ckten Tasten.
|
|
|
|
|
|
|
|
|
|
private static final long serialVersionUID = -4225811153447791553L;
|
|
|
|
|
|
2020-06-06 13:32:49 +02:00
|
|
|
|
public float xPos; // Position auf dem Frame in x-Richtung
|
|
|
|
|
public float yPos; // Position auf dem Frame in y-Richtung
|
2020-02-17 16:29:50 +01:00
|
|
|
|
|
|
|
|
|
public int lives = 3;
|
|
|
|
|
|
2020-05-11 22:50:09 +02:00
|
|
|
|
private float speed = 0.0000001f; // Diee Geschwindigkeit von Pac-man. In alle Richtungen gleich. Muss so klein
|
2020-02-17 16:29:50 +01:00
|
|
|
|
// sein wegen delta time
|
|
|
|
|
|
|
|
|
|
public long timer; // Variable die speichert zu welchem Zeitpunkt eine <20>nderung der Richtung
|
|
|
|
|
// vorgenommen wurde, welche nicht sofort durchgef<65>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<75>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;
|
|
|
|
|
|
2020-05-11 22:50:09 +02:00
|
|
|
|
public boolean hui; // Boolean zur Abfrage, ob gerade ein Brick im Weg ist, um den aktuellen
|
|
|
|
|
// Richtungsbefehl durchzuf<75>hren.
|
2020-02-17 16:29:50 +01:00
|
|
|
|
|
|
|
|
|
public Player() { // Erstellen des Konstruktors
|
|
|
|
|
|
|
|
|
|
super("Pacman_Right"); // Aufrufen der <20>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
|
2020-05-10 14:25:46 +02:00
|
|
|
|
for (int j = 0; j < 35; j++) { // f<>r jeden Brick
|
2020-02-17 16:29:50 +01:00
|
|
|
|
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<64>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<75>ckgesetzt werden
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Methoden zur Erkennung von Tastenanschl<68>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<72>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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
2020-04-30 21:18:21 +02:00
|
|
|
|
}
|