# Ping Pong



## yourhope (22. Mai 2011)

Hallo Liebe Community,

Also, es geht sich darum. Bin kurz vor dem Abi und habe mir gedacht, vielleicht sollte ich mal was lernen. Im Unterricht programmierten wir mal ein Ping Pong Spiel. Ganz Einfach. Nur ein Spieler und keine großen Funktionen. Leider komme ich nicht mehr weiter.
Das Programm ist leider nicht ganz auskommentiert...

Mein Problem liegt jetzt eigentlich nur darin, dass sich der Ball nicht bewegt.. .
Im Internet fand ich den Timer der unten in der Try Catch Schleife steht. Leider sagt der Compiler mir die ganze zeit das in Zeile 66 der Thread nicht dereferenced werden kann. Wenn ich noch irgendwelche Daten vergessen habe und ihr mir helfen könnt, bitte melden. 

Danke schonmal.

@Fu3l Tut mir leid. Hoffe du meintest das so
Bin neu hier...


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

public class pong extends JFrame{
	JSlider m_SPaddel;
	CMeinJPanel m_malfläche;
	boolean richtung = true;
	int xpos,xposb=100,yposb=150,th,Thread;
	
	
	public static void main(String[]args){
		pong fenster= new pong("Pong Beta 1");
		fenster.pack();
		fenster.setSize(450,350);
		fenster.setResizable(false);
		fenster.setVisible(true);
		
	}//Ende main
	
	

	//Slider
	class m_SPaddel implements ChangeListener{
		
		public void stateChanged(ChangeEvent e){
			JSlider source=(JSlider)e.getSource();
			xpos=source.getValue();
			
			repaint();
		}
	}
	
	public class BallApplet extends Applet implements Runnable
{ 
public void start ()
{

    // Schaffen eines neuen Threads, in dem das Spiel läuft
    Thread th = new Thread (this);
    // Starten des Threads
    th.start ();


}
  public void run ()
{

    // Erniedrigen der ThreadPriority
 

    // Solange true ist läuft der Thread weiter
    while (true)
    {
        // Verändern der X - Koordinate des Balles
	xposb ++;
        
        // Neuzeichnen des Applets
        repaint();

        try
        {
            // Stoppen des Threads für in Klammern angegebene Millisekunden
            Thread.sleep(20);
        }
        catch (InterruptedException ex)
        {
            // do nothing
        }

        // Zurücksetzen der ThreadPriority auf Maximalwert
      
    } 
}
} 

			
	pong(String titel){
		super(titel);
		 
		 
		JPanel panel = new JPanel();
		
		setLayout(new FlowLayout());
		panel.setLayout(new GridLayout(1,1,20,20));
		
		m_malfläche = new CMeinJPanel();
		
		
		add(m_malfläche);
		add(panel);
		
		//Den Slider anlegen
		m_SPaddel=new JSlider(JSlider.VERTICAL,-278,0,0);
		
		add("East",m_SPaddel);
		
		m_SPaddel.addChangeListener(new m_SPaddel());
		
		setDefaultCloseOperation(EXIT_ON_CLOSE);
	}//Ende Kostruktor
	
	class CMeinJPanel extends JPanel{
		

		
		public void paintComponent(Graphics g){
			
				//Paddel
				g.setColor(Color.blue);
				g.fillRect(380,xpos*-1,5,20);
				
				//Oben
				g.setColor(Color.black);
				g.fillRect(0,0,390,2);	
				
				//Links
				g.fillRect(0,0,2,300);
				
				//Unten
				g.fillRect(0,298,390,2);
				
				//Rechts
				g.fillRect(388,0,2,298);
		
				//Ball
				g.setColor(Color.red);
				g.drawRect(xposb,yposb,2,2);
		}
					public Dimension getMinimumSize() 
			{
				return new Dimension(400,300);
			}//Ende getMinimumSize
		
		
			public Dimension getPreferredSize() 
			{
				return getMinimumSize();
			}

	}
}
```


----------



## Fu3L (22. Mai 2011)

Könntest du deinen Beitrag editieren und das ganze nochma aus deiner Entwicklungsumgebung reinkopieren, aber mit Java_Tags? Und wichtig: Nicht einfach die Java Tags einfügen ohne den Code neu einzufügen, dann kommt die Einrückung nämlich nicht wieder 

Edit2: Kommando zurück^^ Wegen der fehlenden Einrückung verlesen^^


----------



## Fu3L (22. Mai 2011)

Ich sündige mal mit einem Doppelpost^^

Die Klasse BallApplet wird nie aufgerufen und somit wird auch der Thread darin nicht genutzt. Allerdings ist es auch gut so, dass diese Klasse nicht aufgerufen wird^^

So funktioniert es (vllt nicht alels schön, aber immerhin):

```
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.event.*;
import java.applet.*;
 
public class pong extends JFrame implements Runnable {
    JSlider m_SPaddel;
    CMeinJPanel m_malfläche;
    boolean richtung = true;
    int xpos,xposb=100,yposb=150,th;
    
    
    public static void main(String[]args){
        pong fenster= new pong("Pong Beta 1");
        fenster.pack();
        fenster.setSize(450,350);
        fenster.setResizable(false);
        fenster.setVisible(true);
        
    }//Ende main
    
    
 
    //Slider
    class m_SPaddel implements ChangeListener{
        
        public void stateChanged(ChangeEvent e){
            JSlider source=(JSlider)e.getSource();
            xpos=source.getValue();
            
            repaint();
        }
    }
    
    
  public void run ()
{
 
    // Erniedrigen der ThreadPriority
 
 
    // Solange true ist läuft der Thread weiter
    while (true)
    {
        // Verändern der X - Koordinate des Balles
    xposb ++;
        
        // Neuzeichnen des Applets
        repaint();
 
        try
        {
            // Stoppen des Threads für in Klammern angegebene Millisekunden
            Thread.sleep(20);
        }
        catch (InterruptedException ex)
        {
            // do nothing
        }
 
        // Zurücksetzen der ThreadPriority auf Maximalwert
      
    } 
}
 
            
    pong(String titel){
        super(titel);
         
        
        JPanel panel = new JPanel();
        
        setLayout(new FlowLayout());
        panel.setLayout(new GridLayout(1,1,20,20));
        
        m_malfläche = new CMeinJPanel();
        
        
        add(m_malfläche);
        add(panel);
        
        //Den Slider anlegen
        m_SPaddel=new JSlider(JSlider.VERTICAL,-278,0,0);
        
        add("East",m_SPaddel);
        
        m_SPaddel.addChangeListener(new m_SPaddel());
        
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        
        Thread t = new Thread(this);
        t.start();
    }//Ende Kostruktor
    
    class CMeinJPanel extends JPanel{
        
 
        
        public void paintComponent(Graphics g){
            
                //Paddel
                g.setColor(Color.blue);
                g.fillRect(380,xpos*-1,5,20);
                
                //Oben
                g.setColor(Color.black);
                g.fillRect(0,0,390,2);  
                
                //Links
                g.fillRect(0,0,2,300);
                
                //Unten
                g.fillRect(0,298,390,2);
                
                //Rechts
                g.fillRect(388,0,2,298);
        
                //Ball
                g.setColor(Color.red);
                g.drawRect(xposb,yposb,2,2);
        }
                    public Dimension getMinimumSize() 
            {
                return new Dimension(400,300);
            }//Ende getMinimumSize
        
        
            public Dimension getPreferredSize() 
            {
                return getMinimumSize();
            }
 
    }
}
```

Was habe ich gemacht? Dieses unselige Konstrukt mit dem Applet entfernt. Einfach die Klassendeklaration sowie eine schließende geschweifte Klammer rausgenommen. Dann die Variable Thread entfernt:


```
int xpos,xposb=100,yposb=150,th,Thread;
```
So konnte nämlich Thread.sleep nicht aufgerufen werden^^
Dann habe ich in den Konstruktor (den man eigentlich direkt unter der Deklaration der Felder anordnet) den Startbefehl für den Thread hinzugefügt und dafür die Methode start() entfernt.

Eine weitere Anmerkung: Man schreibt Klassennamen groß und den Unterstrich verwendet man in Java eigentlich nur bei Konstanten, wie EXIT_ON_CLOSE (die so genannten Coding Conventions.. Einfach mal Googlen)^^


----------



## yourhope (22. Mai 2011)

Wow, vielen Dank! Werde mir das gleich genauer angucken. mit einer so schnellen Lösung hätte ich nicht gerechnet. :toll:


----------



## yourhope (22. Mai 2011)

Fu3L guck mal bitte deine privaten Nachrichten.


----------

