Autor Beitrag
LINUS19
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 156
Erhaltene Danke: 1

Windows 10, 7
Java(Eclipse)
BeitragVerfasst: Fr 24.11.17 16:56 
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 ?

ausblenden volle Höhe 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


Zuletzt bearbeitet von LINUS19 am Fr 24.11.17 19:41, insgesamt 1-mal bearbeitet
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
LINUS19 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 156
Erhaltene Danke: 1

Windows 10, 7
Java(Eclipse)
BeitragVerfasst: Mo 27.11.17 22:35 
Hallo,
Ich habe es jetzt hinbekommen den Button anzeigen zulassen, doch dann funktioniert die Bewegung nicht.
ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 28.11.17 10:03 
Hallo,

verwende anstatt der Thread-Klasse besser einen Timer, s. How to Use Swing Timers sowie Java: Countdown und Timer (am Beispiel von Swing).
LINUS19 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 156
Erhaltene Danke: 1

Windows 10, 7
Java(Eclipse)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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.

Für diesen Beitrag haben gedankt: LINUS19
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 28.11.17 17:56 
- Nachträglich durch die Entwickler-Ecke gelöscht -
LINUS19 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 156
Erhaltene Danke: 1

Windows 10, 7
Java(Eclipse)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 382
Erhaltene Danke: 67

Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
BeitragVerfasst: 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.

_________________
most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
LINUS19 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 156
Erhaltene Danke: 1

Windows 10, 7
Java(Eclipse)
BeitragVerfasst: Di 28.11.17 21:27 
Aber warum ist dann der Button sichtbar wenn ich die Bewegegung rausnehme,sonst aber nicht.

LG
LINUS19
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 28.11.17 22:35 
- Nachträglich durch die Entwickler-Ecke gelöscht -

Für diesen Beitrag haben gedankt: LINUS19
LINUS19 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 156
Erhaltene Danke: 1

Windows 10, 7
Java(Eclipse)
BeitragVerfasst: 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
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 30.11.17 20:25 
- Nachträglich durch die Entwickler-Ecke gelöscht -

Für diesen Beitrag haben gedankt: LINUS19
LINUS19 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 156
Erhaltene Danke: 1

Windows 10, 7
Java(Eclipse)
BeitragVerfasst: 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 :

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 156
Erhaltene Danke: 1

Windows 10, 7
Java(Eclipse)
BeitragVerfasst: 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