-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathGameGUI.java
More file actions
219 lines (190 loc) · 8.86 KB
/
GameGUI.java
File metadata and controls
219 lines (190 loc) · 8.86 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
package gamegui;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class GameGUI {
// Deklarationen
private JFrame fenster; // Das Hauptfenster
private boolean running = true; // Spiel läuft
private GamePanel panel; // Das Panel, auf dem gezeichnet wird
int a[] = new int[10]; // x Koordinate enemy
int b[] = new int[10]; // y Koordinate enemy
int life = 5; // Leben des Spielers
int i = 0; // Schleifenindex
int c = 270; // x Koordinate player in der Mitte
int d; // x Koordinate bullet
int e = 800; // y Koordinate bullet
boolean fired = false; // Explosion ist da?
boolean isbullet = false; //Bullet ist da?
int firedenemy = -1; // Index des getroffenen Feindes
boolean[] keys = new boolean[256]; // Array to track pressed keys
private GameGUI() {
// Konstruktor
this.guiErstellen();
Thread gameThread = new Thread(() -> {
this.gameloop();
});
gameThread.start();
}
private void guiErstellen() { //Hauptfernster erstellen
fenster = new JFrame("Mein erster GUI-GAME " + "♥".repeat(life)); // Titel links, Leben mitte
fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fenster.setSize(600,900);
panel = new GamePanel();
fenster.add(panel);
fenster.setVisible(true);//Sichtbarkeit
fenster.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
running = false;
}
});
fenster.addKeyListener(new KeyListener() { // KeyListener hinzufügen, um die Tastatureingaben zu verfolgen
@Override
public void keyPressed(KeyEvent e) { // Wenn eine Taste gedrückt wird, wird der entsprechende Eintrag im keys-Array auf true gesetzt
keys[e.getKeyCode()] = true;
}
@Override
public void keyReleased(KeyEvent e) {} // Wenn eine Taste losgelassen wird, passiert hier nichts, da wir nur wissen müssen, ob die Taste gedrückt ist oder nicht
@Override
public void keyTyped(KeyEvent e) {} // Diese Methode wird nicht verwendet, aber muss implementiert werden, da KeyListener ein Interface ist
});
fenster.setFocusable(true);
}
private void gamestart() { //angfangsfenster erstellen
int option = JOptionPane.showOptionDialog(fenster,
"Willkommen zum Spiel! Möchtest du starten?",
"Spielstart",
JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE,
null,
null,
null);
if (option == JOptionPane.NO_OPTION) {
running = false; // Spiel beenden, wenn der Spieler "Nein" wählt
}
else if (option == JOptionPane.YES_OPTION) {
// Reset variables
life = 5;
c = 270;
e = 800;
isbullet = false;
fired = false;
running = true; // Neustart
}
for (int i = 0; i < 10; i++) { // 10 neuer Enemy erstellen
a[i] = (int) ((Math.random() * 560)+20); // zufällige x Koordinate für enemy +-20 pixel vom rändern, damit sie nicht direkt am Rand spawnen
b[i] = -i * 100; // unterschiedliche Abstände, damit die Enemies zeitversetzt kommen
panel.repaint(); // Panel neu zeichnen, um den neuen Enemy anzuzeigen
}
}
private void gameloop() {
gamestart(); // Startbildschirm anzeigen
while (running) {
try {
Thread.sleep(160); // 16ms ≈ 60 FPS
} catch (InterruptedException e) {
JOptionPane.showMessageDialog(fenster,
"Fehler im Gameloop: " + e.getMessage(),
"Warnung",
JOptionPane.WARNING_MESSAGE);
return;
}
for (int i = 0; i < 10; i++) {
panel.repaint();
b[i] += 3; // Enemy bewegt sich nach unten
if (b[i] > 820) { // Wenn der Enemy den unteren Rand erreicht
b[i] = 0; // y Koordinate zurücksetzen, damit der Enemy von oben startet
a[i] = (int) ((Math.random() * 560)+20); // zufällige x Koordinate für enemy, +-20 Pixel vom Rand
life -= 1; // Leben verlieren
//schreibt aus, dass du einen Leben verloren hast und wie viele Leben noch da sind:
JOptionPane.showMessageDialog(fenster,
"Du hast ein Leben verloren! Noch " + life + " Leben übrig.",
"Leben verloren",
JOptionPane.INFORMATION_MESSAGE);
if (life <= 0) {
running = false; // Spiel beenden
JOptionPane.showMessageDialog(fenster,
"Game Over! Du hast alle Leben verloren.",
"Game Over",
JOptionPane.INFORMATION_MESSAGE);
gameloop(); // Spiel neu starten
}
}
if (isbullet && Math.abs(d - a[i]) < 20 && Math.abs(e - b[i]) < 20) {
// Bullet trifft Enemy
fired = true; // Explosion zeichnen
firedenemy = i; // Index des getroffenen Feindes speichern
}
}
if (e < 0) { // wenn Bullet den oberen Rand erreicht, dann zurücksetzen
isbullet = false;
e = 800; // Y-Koordinate von Bulett zurücksetzen
keys[KeyEvent.VK_SPACE] = false; // die Taste als "nicht gedrückt" markiert wird
}
if (isbullet) {
e -= 20; // Bullet bewegt sich nach oben
}
if (keys[KeyEvent.VK_SPACE] && !isbullet) { // If i press the space key and the bullet is not already there, then shoot a bullet
d = c;
isbullet = true; //auf einmal max 1 Schießen im Spielfeld
keys[KeyEvent.VK_SPACE] = false; // die Taste als "nicht gedrückt" markiert wird
}
if (keys[KeyEvent.VK_LEFT]) {
c -= 10; // Spieler nach links bewegen
keys[KeyEvent.VK_LEFT] = false; // die Taste als "nicht gedrückt" markiert wird
}
if (keys[KeyEvent.VK_RIGHT]) {
c += 10;// Spieler nach rechts bewegen
keys[KeyEvent.VK_RIGHT] = false; // die Taste als "nicht gedrückt" markiert wird
}
c = Math.max(30, Math.min(c, 570)); // Spieler innerhalb der Bildschirmgrenzen halten
}
}
class GamePanel extends JPanel {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.BLACK);
g.fillRect(0, 0, 600, 900);
player(g,c);
if (isbullet) {
bullet(g, d, e);
}
if (fired) {
bumm(g,d,e, firedenemy);
fired = false; // Nach dem Zeichnen zurücksetzen
}
for (int i = 0; i < 10; i++) {
enemy (g, a[i], b[i]); // Enemies zeichnen
}
}
private void bumm(Graphics g, int x, int y, int enemyIndex) {
g.setColor(Color.ORANGE);
int[] xPoints = { x, x+6, x+15, x+6, x+9, x, x-9, x-6, x-15, x-6 };
int[] yPoints = { y-15,y-6, y-3, y+3, y+12, y+6, y+12, y+3, y-3, y-6 };
g.fillPolygon(xPoints, yPoints, 10);
b[enemyIndex] = -200; // neue enemy mit Verspätung starten
a[enemyIndex] = (int) ((Math.random() * 560)+20); // zufällige x Koordinate für neue enemy, +-20 Pixel vom Rand
firedenemy = -1; // Zurücksetzen
isbullet = false; // Bullet entfernen
e = 800; //den Y Koordinate des Bullets zurücksetzen für den nächsten
keys[KeyEvent.VK_SPACE] = false; // die Taste als "nicht gedrückt" markiert wird
}
private void enemy(Graphics g, int x, int y) {
g.setColor(Color.RED);
g.fillPolygon(new int[] {x, x-20,x+20}, new int[] {y,y-20,y-20}, 3);
}
private void player(Graphics g, int x) {
g.setColor(Color.BLUE);
g.fillPolygon(new int[] {x-30,x+30,x}, new int[] {850,850,820}, 3);
}
private void bullet(Graphics g, int x, int y) { // Die Koordinaten für Bullet
g.setColor(Color.ORANGE);
g.fillRect(x-2, y, 5, 20);
}
}
public static void main(String[] args) {
GameGUI game = new GameGUI();
}
}