Pac-Man/src/Player.java

246 lines
7.2 KiB
Java
Raw Normal View History

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-06-06 15:19:33 +02:00
private float speed = 0.00000008f; // 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
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
}