Pong Spiel Score Zähler! -.-

yourhope

Mitglied
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?
Java:
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"
Java:
	//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:

Java:
/*	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
 
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.
 
Ich seh die Stelle nicht, wo du an dem
Code:
mylabel
irgendwas änderst. Du setzt doch nur den Wert einer int-Variable, wie soll sich dadruch der Inhalt des Labels ändern?
 
Schön, aber ich hätte mit sowas wie
Code:
bla.setText(...)
gerechnet. Was soll denn das bringen, wenn du ein Label mit dem alten Inhalt neu zeichnest?
 
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?
 
Kannst du mir bitte ein Beispiel schreiben, glaube reden gerade aneinander vorbei. 😛

Ich soll also nach

mylabel.settext(Score);
repaint();

und dann was?
 
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
Code:
.setText
aufrufen.
Dafür solltest du aber die Label-Instanz irgendwie zugreifbar machen (Methoden-Variable im Konstruktor reicht nicht)
 
Hier ein Beispiel:
Java:
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
 
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);
 
Zuletzt bearbeitet:
Vermutlich, weil du noch irgendwo mit mylabel arbeitest?
Ansonsten steht doch da eine Zeilenangabe: schau in die Zeile rein oder nenn die zumindestmal
 
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);


Java:
  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
 
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
 
Danke, dass war der Fehler, Spiel läuft jetzt soweit, nur jetzt sobald er den Paddel berührt kommt wieder ein NullPointer 😀

Java:
 //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?;(;(
 
Nein, einfach richtig abtippen 😉 Im Konstruktor muss das
Code:
JLabel
vor dem scoreText weg, dann sollte alles klappen. In deinem vorletzten Post ist es Zeile 18
 

Zurück
Oben