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
Chefentwickler
Beiträge: 20238
Erhaltene Danke: 2050

Win 10
C# (VS 2017)
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: 3810
Erhaltene Danke: 773

Win7
C++, C# (VS 2015/17)
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: 3810
Erhaltene Danke: 773

Win7
C++, C# (VS 2015/17)
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2039
Erhaltene Danke: 376

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Di 28.11.17 17:56 
Da hat Th69 recht.
Damit dein Button nun etwas macht, musst du ihm ein Ereignis mitgeben. Dafür wird sich sowohl MouseClicked() als auch ActionPerformed() anbieten. Letzteres wird auch dann ausgelöst, wenn auf das fokusierte Button die Enter- und Leertaste betätigt wird, neben dem Mausklick.
Die Methoden .addMouseListener() und .addActionListener() sollten dies bereitstellen können.

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
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: 332
Erhaltene Danke: 47

Linux Raspbian, Win10
C, C++, Python, Java, JavaScript, 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2039
Erhaltene Danke: 376

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Di 28.11.17 22:35 
Dein Spielbrereich ist ja ein Panel, und darauf befindet sich u.a. das besagte Button. Während die "Bewegeung" abläuft wird wohl auf dem Panel ständig neu gezeichnet und das Button fällt dem zum Opfer

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)

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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2039
Erhaltene Danke: 376

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Do 30.11.17 20:25 
Du hast ja dein Panel auf 800x600 gesetzt und darin efolgt eine Kollisionsabfrage, die sich über den gesamten Bereich erstreckt.
Wenn du vorhast, Buttons permanent anzuzeigen, dann darf das Spiel nicht über das gesamte Panel stattfinden, sondern nur in einem Teilbereich, z.B. 600x600.
Dann hast du immer noch 200px frei, um dort den Button (rechts am Rand) zu positionieren.
Oder du machst es so, wenn das Spiel abbricht/pausiert (z.B. über die ESC-Taste), dass erst dann ein Button erscheint/in den Vordergrund kommt.
Wird der Button betätigt, soll er wieder unsichtbar werden und das Spiel fortsetzen, neustarten, was auch immer.

Die Steuerung sollte in einer eigenen Klasse festgelegt sein. Dazu erbst du den jeweiligen Listener (Tastatur oder Maus), regelst darin, wie das Auf und Ab der Schläger passieren soll, erzeugst von dem Listener eine Instanz und übergibst diese an die jeweilige Methode, wie z.B. .addMouseListener() in der Pong-Klasse.
So ist der Code leichter lesbar und er lässt sich leichter anpassen.

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)

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: 3810
Erhaltene Danke: 773

Win7
C++, C# (VS 2015/17)
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