# Pong Spiel Score Zähler! -.-



## yourhope (29. Mai 2011)

Also nach langem rumspielen und Testen habe auch ich dass Pong Spiel geschafft... Naja, jetzt würde ich gerne, dass der Score hochzählt. Leider habe ich ein Problem damit, dass sich das Label nicht erhöhen lässt. Ich versuche es mit einem repaint(), leider weiß ich nicht wie und wo ich es einsetzen muss, dass er es aktualisiert.

Hier im Konstruktor?

```
CPongTest(String titel) {
  	super(titel);

	//Label erzeugen
  	JLabel mylabel = new JLabel();
  	mylabel.setText("Score " + Score);

        //HIER HABE ICH ES SCHON VERSUCHT, mit einem einfachen repaint() und mylabel.repaint();

	//Zufallszahlen für Start erstellen
	int zufallx = (int) (Math.random()*100);
	int zufally = (int) (Math.random()*100);
	

	
	xposb=zufallx;
	yposb=zufally;
		
	//Zeichenfläche erzeugen
	m_zeichenfläche = new CMeinJPanel();
	
	//Slider erzeugen
	m_Spaddel = new JSlider(JSlider.VERTICAL,-300,0,-40);
     
    // Einen Layout Manager anlegen
    setLayout(new BorderLayout());
 
    // Die Zeichenfläche anlegen
	add(m_zeichenfläche);
	
	//Schriftzug zur Fläche hinzufügen
	m_zeichenfläche.add(mylabel);

	// Den Slider anlegen
	add("East",m_Spaddel);
	
	//Slider ChangeListener 
	m_Spaddel.addChangeListener(new Slider());


	
	setDefaultCloseOperation(EXIT_ON_CLOSE);
  } // ende Konstruktor
```

Kollisionsabfrage zwischen Ball und "Schläger"

```
//Wenn Ball Paddel berührt
	if((yposb>(-PosSlider))&&(yposb<(-PosSlider+20))){
	
	//Ball zurück stoßen
	deltax*=-1;
	xposb+=deltax;	
	
	//Score erhöhen
	Score++;
	
	m_zeichenfläche.setVisible(false);//UND WIE MAN HIER SIEHT VERSUCHT DIE MALFLÄCHE NEU  ZEICHNEN ZU LASSEN BZW AUCH HIER MIT EINEM REPAINT() VERSUCHT
	m_zeichenfläche.setVisible(true);

	}
}
```


Hier Nochmal die Gesamte Programmierung wenn es Notwenidig ist:


```
/*	CPongVorlage1
	Ein vertikaler Slider soll ein blaues Paddel 5x20 in einem Fenster von
	400x300 Pixel an X=390 von Y=0..280 bewegen.
	Das Spielfeld soll von schwarzern Strichen der Dicke 2 Pixel begrenzt
	werden.
	
	Für HI12 SAS von CLA am 11.5.11
 */

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

public class CPongTest extends JFrame {
	JSlider m_Spaddel;		// Schieber Paddel,
	CMeinJPanel m_zeichenfläche;
	Label hinweis;
	int PosSlider=-40;
	int xposb=150;
	int yposb=200;
	int deltax;
	int deltay;
	int Score=0;
	int Scorealt;
	int zufallx;
	int zufally;
	

	// weitere Klassenvariablen

  public static void main(String[] args) {
    
    CPongTest fenster = new CPongTest("Pong1");
    fenster.pack();
    fenster.setSize(450,400);
    fenster.setResizable(false);
    fenster.setVisible(true);
  	fenster.spielen();

  } // ende main()
 		
	//Konstruktor

  CPongTest(String titel) {
  	super(titel);

	//Label erzeugen
  	JLabel mylabel = new JLabel();
  	mylabel.setText("Score " + Score);

	//Zufallszahlen für Start erstellen
	int zufallx = (int) (Math.random()*100);
	int zufally = (int) (Math.random()*100);
	

	
	xposb=zufallx;
	yposb=zufally;
		
	//Zeichenfläche erzeugen
	m_zeichenfläche = new CMeinJPanel();
	
	//Slider erzeugen
	m_Spaddel = new JSlider(JSlider.VERTICAL,-300,0,-40);
     
    // Einen Layout Manager anlegen
    setLayout(new BorderLayout());
 
    // Die Zeichenfläche anlegen
	add(m_zeichenfläche);
	
	//Schriftzug zur Fläche hinzufügen
	m_zeichenfläche.add(mylabel);

	// Den Slider anlegen
	add("East",m_Spaddel);
	
	//Slider ChangeListener 
	m_Spaddel.addChangeListener(new Slider());


	
	setDefaultCloseOperation(EXIT_ON_CLOSE);
  } // ende Konstruktor

  //ChangeListener für Slider
  class Slider implements ChangeListener{
  	
  	public void stateChanged(ChangeEvent e){
  		//SliderKoordinaten holen
  		JSlider source = (JSlider)e.getSource();
  		PosSlider=source.getValue();
  	
  		repaint();
  	}
  }
  
  //Spiel starten und Ball bewegen lassen
  void spielen(){
  	deltax=1;
  	deltay=1;
  	for(;;){
  	xposb+=deltax;
  	yposb+=deltay;
  	
  	//Kollision prüfen
  	Kollision();
  		
  		//Programm für 10 ms stoppen
  		try { Thread.sleep(10); } catch (InterruptedException e) {};
  		repaint();	
  	}
  	}	
  //Kollisions abfrage
  void Kollision(){
  
	//SPaddel
	if(xposb>=426){
	
	//Neustart des Spiels aufrufen
	neustart();	
	}
	
	//Wenn Ball hinter Paddel
	if(xposb>=390)
	{
		
		//Wenn Ball Paddel berührt
	if((yposb>(-PosSlider))&&(yposb<(-PosSlider+20))){
	
	//Ball zurück stoßen
	deltax*=-1;
	xposb+=deltax;	
	
	//Score erhöhen
	Score++;
	
	m_zeichenfläche.setVisible(false);
	m_zeichenfläche.setVisible(true);

	}
}
	
  //Linke Wand
	 if(xposb<=0)
  {
  	deltax*=-1;
  	xposb+=deltax;
  }
  
  //Unten / Oben
  	if ( (yposb <=0) || (yposb >= 320) ) {
  		deltay *= -1;
  		yposb += deltay;
  	}
  }
  
  //Neustarten des Spiels
 void neustart(){
  	
  	//Zufallszahlen für jeden Neustart erzeugen
 	int zufallx = (int) (Math.random()*100);
	int zufally = (int) (Math.random()*100);
 
  xposb=zufallx;
  yposb=zufally;
}
 	
  
  class CMeinJPanel extends JPanel {
	public void paintComponent(Graphics g) {
    // Hier wird gezeichnet.

	
	//PosSlider
	g.setColor(Color.blue);
	g.fillRect(390,-PosSlider,5,20);
	//Oben
	g.setColor(Color.black);
	g.fillRect(0,0,426,2);
	
	//Links
	g.fillRect(0,0,2,320);
	
	
	//Unten
	g.fillRect(0,320,426,2);


	//Rechts
	g.fillRect(425,0,2,322);
	
	//Ball
	g.setColor(Color.red);
	g.fillOval(xposb,yposb,4,4);
	
		

	}	//Ende paintComponent 
  public Dimension getMinimumSize(){
  	return new Dimension(400,300);
  }
  public Dimension getPreferredSize(){
  	return getMinimumSize();
  }
  }  // Ende von CMeinJPanel
} // ende class CPongVorlage1
```


Danke schonmal im Vorraus

your


----------



## Marcinek (29. Mai 2011)

Hi,

eventuell ist es ein ähnliches Problem:

http://www.java-forum.org/awt-swing-swt/119011-jlabel-text-ueberlagert.html

Gruß,


----------



## yourhope (29. Mai 2011)

Danke für die Idee, allerdings passiert bei mir ja gar nichts. Ich habe ja die Variable Score oben auf Null gesetzt. Dadurch wird mir ja auch im Label der Score Null angezeigt, allerdings wenn ich den Ball Hitte, passiert ja gar nichts.


----------



## XHelp (29. Mai 2011)

Ich seh die Stelle nicht, wo du an dem 
	
	
	
	





```
mylabel
```
 irgendwas änderst. Du setzt doch nur den Wert einer int-Variable, wie soll sich dadruch der Inhalt des Labels ändern?


----------



## yourhope (29. Mai 2011)

Darunter steht im Kommentar das ich es dort schon mit einem repaint und mylabel.repaint versucht habe und es nicht funktioniert hat.


----------



## XHelp (29. Mai 2011)

Schön, aber ich hätte mit sowas wie 
	
	
	
	





```
bla.setText(...)
```
 gerechnet. Was soll denn das bringen, wenn du ein Label mit dem *alten* Inhalt neu zeichnest?


----------



## yourhope (29. Mai 2011)

Ja, aber Score wird doch im Spielverlauf erhöht und wenn ich darunter schreibe repaint, ist die Score variable doch um eins erhöht und sollte daurch doch auch dann erhöht werden?


----------



## yourhope (29. Mai 2011)

Kannst du mir bitte ein Beispiel schreiben, glaube reden gerade aneinander vorbei. 

Ich soll also nach 

mylabel.settext(Score);
repaint();

und dann was?


----------



## XHelp (29. Mai 2011)

Nö, die Änderung wird ja nicht per Zauberhand bis zum Label durchgereicht, wo irgendwer irgendwie entscheidet wie man mit dieser Änderung umzugehen hat und die sich  nun der neue Wert zusammensetzt. Du solltest also explizit 
	
	
	
	





```
.setText
```
 aufrufen.
Dafür solltest du aber die Label-Instanz irgendwie zugreifbar machen (Methoden-Variable im Konstruktor reicht nicht)


----------



## XHelp (29. Mai 2011)

Hier ein Beispiel:

```
public class CPongTest extends JFrame {
    JSlider m_Spaddel;      // Schieber Paddel,
    JLabel scoreText;
...
  CPongTest(String titel) {
...
    scoreLabel = new JLabel();
    scoreLabel.setText("Score " + Score);
  void Kollision(){
....
    Score++;
    scoreLabel.setText(Score);
...
```

Jetzt fällt mir auch auf, dass du ganz ungünstige Namenswahl hast: sich mal Code Conventions for the Java Programming Language durchzulesen wird nicht schaden


----------



## yourhope (29. Mai 2011)

Ahso, alles klar jetzt habe ich das verstanden. Programmiere nur für die Schule und muss es nur noch eine Woche machen, tut mir leid. :*

Ich habe das jetzt so gemacht, wie in deinem Beispiel gezeigt. Jetzt kommt nur noch die Fehlermeldung, dass der die Variable scoreText nicht kennt in dem void, was ja auch klar ist. 
ScoreText meine ich natürlich.

Fehlermeldung:
D:\Java Programme\CPongTest.java:142: setText(java.lang.String) in javax.swing.JLabel cannot be applied to (int)

	scoreText.setText(Score);


----------



## XHelp (29. Mai 2011)

Öhm, ja, da war ja was. Dann mach wie am anfang 
	
	
	
	





```
setText("Score "+Score)
```


----------



## yourhope (29. Mai 2011)

Im cmd Fenster kommt dann eine NullPointer.Exeption fehlermeldung
Mano...


----------



## XHelp (29. Mai 2011)

Vermutlich, weil du noch irgendwo mit mylabel arbeitest?
Ansonsten steht doch da eine Zeilenangabe: schau in die Zeile rein oder nenn die zumindestmal


----------



## yourhope (29. Mai 2011)

Ahso tut mir leid..

Äh Zeile 36:

CPongTest fenster = new CPongTest("Pong1");

und Zeile 62: (Wo eher der Fehler sein könnte ich es aber nicht sehe ^^)

m_zeichenfläche.add(scoreText);



```
public static void main(String[] args) {
    
    CPongTest fenster = new CPongTest("Pong1");      <----------Hier
    fenster.pack();
    fenster.setSize(450,400);
    fenster.setResizable(false);
    fenster.setVisible(true);
  	fenster.spielen();

  } // ende main()
 		
	//Konstruktor

  CPongTest(String titel) {
  	super(titel);

	//Label erzeugen
	JLabel scoreText = new JLabel();
	  	scoreText.setText("Score " + Score);
	
	
		//Schriftzug zur Fläche hinzufügen


	//Zufallszahlen für Start erstellen
	int zufallx = (int) (Math.random()*100);
	int zufally = (int) (Math.random()*100);
	
	m_zeichenfläche.add(scoreText);                <----------Hier
	m_zeichenfläche.repaint();

	  	
	xposb=zufallx;
	yposb=zufally;
		
	//Zeichenfläche erzeugen
	m_zeichenfläche = new CMeinJPanel();
	
	//Slider erzeugen
	m_Spaddel = new JSlider(JSlider.VERTICAL,-300,0,-40);
     
    // Einen Layout Manager anlegen
    setLayout(new BorderLayout());
 
    // Die Zeichenfläche anlegen
	add(m_zeichenfläche);
	


	// Den Slider anlegen
	add("East",m_Spaddel);
	
	//Slider ChangeListener 
	m_Spaddel.addChangeListener(new Slider());


	
	setDefaultCloseOperation(EXIT_ON_CLOSE);
  } // ende Konstruktor
```


----------



## XHelp (29. Mai 2011)

Du fügst in Zeile 29 was zu der Zeichenfläche noch bevor du die in Zeile 37 erstellst. Also entweder früher erstellen oder später hinzufügen.
Darüber hinaus kannst du dir das repaint im Konstruktor sparen


----------



## yourhope (29. Mai 2011)

Danke, dass war der Fehler, Spiel läuft jetzt soweit, nur jetzt sobald er den Paddel berührt kommt wieder ein NullPointer 


```
//Kollisions abfrage
  void Kollision(){
  
	//SPaddel
	if(xposb>=426){
	
	//Neustart des Spiels aufrufen
	neustart();	
	}
	
	//Wenn Ball hinter Paddel
	if(xposb>=390)
	{
		
		//Wenn Ball Paddel berührt
	if((yposb>(-PosSlider))&&(yposb<(-PosSlider+20))){
	
	//Ball zurück stoßen
	deltax*=-1;
	xposb+=deltax;	
	
	//Score erhöhen
	Score++;
	scoreText.setText("Score " + Score); <---HIER

	}
}
```


Muss ich den noch irgendwie Inizialiesieren?;(;(


----------



## XHelp (29. Mai 2011)

Nein, einfach richtig abtippen  Im Konstruktor muss das 
	
	
	
	





```
JLabel
```
 vor dem scoreText weg, dann sollte alles klappen. In deinem vorletzten Post ist es Zeile 18


----------



## yourhope (29. Mai 2011)

Oh man, du bist echt nen Engel 

Vielen Vielen dank für deine geduld!


----------

