Entwickler-Ecke

Alle Sprachen - Alle Plattformen - Java Pong Buttons einfügen


LINUS19 - Fr 24.11.17 16:56
Titel: Java Pong Buttons einfügen
Hallo,
Ich wollte in meinem Pong Spiel Buttons für "neues Spiel" usw. einbauen, doch ich kann die Buttons nicht erstellen könnte mir wer dabei helfen ?


Quelltext
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:
Hier der Quellcode: 
import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

public class Pong extends JPanel { 

 int x = 30, y = 300; // Anfangskoordinaten Schläger 1 
 int Px = 200, Py = 200; //Anfangskoordinaten Ball 
 int x2 = 770, y2 = 300; //Anfangskoordinaten Schläger 2 
 int dPx = 10, dPy = 10; // Geschwindigkeit Ball 
 boolean Spieler1o = false; // Pfeiltaste oben am Anfang Taste nicht gedrückt 
 boolean Spieler1u = false; // Pfeiltast unten 
 boolean Spieler2o = false; 
 boolean Spieler2u = false; 

 public Pong() { 
 setPreferredSize(new Dimension(800, 600)); // Fenstergröße 

 Ball neu = new Ball(); 
 neu.start(); // Thraed Ball wird gestartet 
 Schläger s = new Schläger(); // Thread Schläger wird gestartet 
 s.start(); 
 // Hier wollte ich die Buttons setzten 


 } 

 public void paint(Graphics gr) { // beiden Schläger und Ball 
 Graphics2D g = (Graphics2D) gr; // werden gezeichnet 
 g.setColor(Color.WHITE); 
 g.fill(g.getClipBounds()); // damit die Zeichnung überschrieben wird 
 g.setColor(Color.BLACK); 
 g.fillRect(x, y, 10, 80); // Ball und Schläger werden gezeichnet 
 g.fillOval(Px, Py, 30, 30); 
 g.fillRect(x2, y2, 10, 80); 
 } 


 class Ball extends Thread { // thread für Ball 
 void bewegen() { 
 Px = Px + dPx; //die Bewegung 
 Py = Py + dPy; 

 if (Px < 0) { // Ball prallt von der Wand ab 
 Px = 0; 
 dPx = -dPx; 
 } 
 if (Py < 0) { // Ball prallt von der Wand ab 
 Py = 0; 
 dPy = -dPy; 
 } 
 if (Py > 570) { // Ball prallt von der Wand ab 
 Py = 570; 
 dPy = -dPy; 
 } 
 if (Px > 770) { // Ball prallt von der Wand ab 
 Px = 770; 
 dPx = -dPx; 
 } 

 if (Px == 40 && Py >= y && Py <= y + 80) { // Hier soll er vom Schläger1 abprallen 
 Px = 40; 
 dPx = -dPx; 
 } 

 if (Px == 740 && Py >= y2 && Py <= y2 + 80) {//// Hier soll er vom Schläger2 abprallen 

 Px = 740; 
 dPx = -dPx; 
 dPy = -dPy; 
 } 
 repaint(); 
 } 

 public void run() { // Thread für Ball 

 while (!isInterrupted()) { 

 bewegen(); 
 try { 
 Thread.sleep(50); 
 } catch (InterruptedException e) { 
 return; 
 } 
 } 
 } 
 } 

 class Schläger extends Thread implements KeyListener { 
 Schläger() { 
 addKeyListener(this); // KeyListenr wird hinzugefügt 
 } 

 public void run() { 

 while (true) { // solange Spieler Taste drückt 
 //wird Schläger bewegt 
 if (Spieler1o == true) { // Bewegung Schläger1 
 y -= 12; 
 } 
 if (Spieler1u == true) { 
 y += 12; 
 } 
 if (Spieler2o == true) { // Bewegung Schläger2 
 y2 -= 12; 
 } 
 if (Spieler2u == true) { 
 y2 += 12; 
 } 

 if (y2 > 520) { // 600-80 wegen Schlägerlänge 
 y2 = 520; // Damit die Schläger nicht aus dem Bild verschwinden 
 } 
 if (y2 < 0) { 
 y2 = 0; 
 } 
 if (y < 0) { 
 y = 0; 
 } 
 if (y > 520) { 
 y = 520; 
 } 
 repaint(); 
 try { 
 Thread.sleep(50); 
 } catch (InterruptedException e) { 
 e.printStackTrace(); 
 } 
 } 
 } 

 public void keyPressed(KeyEvent e) { // Spieler 1 hier wird geguckt ob Taste gedrückt 
 if (e.getKeyCode() == KeyEvent.VK_W) { 
 Spieler1o = true; 
 } 
 if (e.getKeyCode() == KeyEvent.VK_S) { 
 Spieler1u = true; 
 } 

 if (e.getKeyCode() == KeyEvent.VK_UP) { // Spieler2 hier wird geguckt ob Taste gedrückt 
 Spieler2o = true; 
 } 
 if (e.getKeyCode() == KeyEvent.VK_DOWN) { 
 Spieler2u = true; 
 } 
 } 

 public void keyReleased(KeyEvent e) { // Hier ob Taste wieder losgelassen 
 // wenn ja stoppt Schlägerbewegung 
 if (e.getKeyCode() == KeyEvent.VK_W) { 
 Spieler1o = false; 
 } 
 if (e.getKeyCode() == KeyEvent.VK_S) { 
 Spieler1u = false; 
 } 
 if (e.getKeyCode() == KeyEvent.VK_UP) { 
 Spieler2o = false; 
 } 
 if (e.getKeyCode() == KeyEvent.VK_DOWN) { 
 Spieler2u = false; 
 } 
 } 

 public void keyTyped(KeyEvent e) { 
 } 
 } 



 und die Hauptklasee: 

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

public class Fenster extends JFrame { 
 private Pong pong = new Pong(); 

 public Fenster() { 
 setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
 getContentPane().add(pong); 
 pack(); 
 getRootPane();setVisible(true); 
 pong.setFocusable(true); 


 JButton button = new JButton("Neues Spiel"); // Hier wollte ich die Buttons setzen 
 pong.setLayout(null); 
 button.setBounds(100,20,100,20); 
 pong.add(button); 
 button.setVisible(true); 

 } 

 public static void main(String[] args) { 
 new Fenster(); 

 } 
}


LG
LINUS19


Christian S. - Fr 24.11.17 17:01

Hallo,

bitte fasse Deinen Code in die entsprechenden Tags, damit er im Forum korrekt dargestellt wird. Das geht so:

[code] ... hier Dein Code ...[/code]

Editiere einfach Deinen Beitrag und füge die Tags hinzu. :zustimm:

Viele Grüße
Christian


LINUS19 - Mo 27.11.17 22:35

Hallo,
Ich habe es jetzt hinbekommen den Button anzeigen zulassen, doch dann funktioniert die Bewegung nicht.

Quelltext
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:
// Hier die Hauptklasse:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Fenster extends JFrame {

private Pong pong = new Pong();

public Fenster() {
   setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
   add(new Pong());
   setVisible(true);
   //getContentPane().add(pong);       
   pack();
     getRootPane();setVisible(true);             
     pong.setFocusable(true);                    
}
public static void main(String[] args) {
  new Fenster();
  
}
}

// und der Konstruktor:
  public Pong() {    
    setPreferredSize(new Dimension(Breite,Höhe));  
    
    Schläger s = new Schläger();
    //s.start();
    Ball b = new Ball();
    //b.start();

    JButton button = new JButton("Spielstart");
          setLayout(null);
          button.setBounds(100,20,100,20);
          add(button);
  }

Hoffe mir kann jemand weiterhelfen, bin echt am verzweifeln.

LG
LINUS19


Th69 - Di 28.11.17 10:03

Hallo,

verwende anstatt der Thread-Klasse besser einen Timer, s. How to Use Swing Timers [https://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html] sowie Java: Countdown und Timer (am Beispiel von Swing) [http://blog.mynotiz.de/programmieren/java-countdown-und-timer-am-beispiel-von-swing-1707/].


LINUS19 - Di 28.11.17 14:58

Hallo,
Ich verstehe nicht ganz wie mir der Timer weiterhelfen soll, weil das ganze ja trotzdem parallel ablaufen muss.

LG
LINUS19


Th69 - Di 28.11.17 15:39

Der Timer sorgt dafür, daß alle Aufrufe im UI-Thread stattfinden und du dich nicht um Thread-Synchronisierung kümmern mußt.

Und anstatt dem Thread.sleep(50) gibst du dann die Zeit (50) dem Timer mit, so daß dieser dann selbständig alle 50ms die Timer-Methode aufruft.


Delete - Di 28.11.17 17:56

- Nachträglich durch die Entwickler-Ecke gelöscht -


LINUS19 - Di 28.11.17 20:14

Also verwendet man für die Spieleprogrammierung Timer, nennt sich das ganze dann Gameloop? Hatte davon schon Mal was gelesen doch nicht wirklich verstanden

LG
LINUS19


Symbroson - Di 28.11.17 21:03

Game loop, core loop - wie auch immer - aber nein, das sollte er nicht sein. Eigentlich ist der core loop eine 'while true' Schleife in der du deine Spielmechaniken, Grafik etc behandelst. Wenn du dafür einen Timer nutzt ist das ganze... naja suboptimal weil du dann nicht die schnellstmögliche Geschwinfdigkeit erreichst. Ich weiß nicht genau wie der TTimer arbeitet - ich vermute mal der startet nen Thread und führt die Callback-Methode mit Synchronize aus - das kann dauern. Also lieber dafür entweder nen eigenen Thread starten oder im Hauptthread laufen lassen wenn du sonst nichts zu tun hast.


LINUS19 - Di 28.11.17 21:27

Aber warum ist dann der Button sichtbar wenn ich die Bewegegung rausnehme,sonst aber nicht.

LG
LINUS19


Delete - Di 28.11.17 22:35

- Nachträglich durch die Entwickler-Ecke gelöscht -


LINUS19 - Do 30.11.17 18:38

Ok, danke aber wie soll ich dann die Buttons hinzufügen?

Ich wollte es jetzt doch mit Tasten machen z.B wenn ich F1 drücke das dann das Spiel startet und bei F2 beendet wird, doch ich bekomme es nur hin das Spiel mit F2 zu beenden, das Starten des Spiels funktioniert nicht. Könnte mir wer dabei helfen?
LG
LINUS19


Delete - Do 30.11.17 20:25

- Nachträglich durch die Entwickler-Ecke gelöscht -


LINUS19 - Fr 01.12.17 19:58

Hallo,
Ich hab jetzt das Panel auf die Größe 1000*600 gesetzt und den Button an den Rand gepackt, doch er ist wieder nur sichtbar wenn die Bewegung raus ist und ich folgendes in der Fensterklasse geändert habe :


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
public Fenster() {
   setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
   
         add(new Pong()); // nur so ist der Button anscheinend sichtbar
   // getContentPane().add(pong);       
   pack();
         getRootPane();setVisible(true);             
         pong.setFocusable(true);                    
}

Kann mir das überhaupt nicht erklären, ich hoffe mir kann jemand weiterhelfen

LG
LINUS19


Th69 - Sa 02.12.17 10:54

Du erzeugst mit add(new Pong()) ein neues Pong-Objekt. Weiter unten verwendest du aber wiederum den Member pong.
Warum also nicht add(pong)?


LINUS19 - Sa 02.12.17 11:22

Hallo,
Erstmal danke für deine Antwort.
Doch jetzt ist der Button nur sichtbar wenn ich mit der Maus drüber gehe.

LG
LINUS19