# Ping Pong



## Balduran (10. Jun 2006)

Hallo,
ich hab lange überlegt ob ich nu mal in einem Forum fragen soll nach hilfe.. naja nun bin ich an einem Punkt angelangt wo mein Wissen nichtmehr ausreicht um mein Problem zu lösen(bin auch nochnicht so lange bei Java dabei  )

Gut also jetz zum Problem:

Ich habe 3 Klassen:
1. Das Programm (hier wird der Frame erstellt und alles aktualisiert bei Bewegung)
2. Ball (halt der Ball der im Feld rumfliegt)
3. Balken (die dinger zum schlagen)

Das Programm ist nochnicht fertig und zurzeit nicht zum spielen geeignet..
so mein Problem ist ich will beim Ball überprüfen ob es am Rand des Frames ankommt ( ball.posx > frame.getWidth z.B.)
naja die Sache ist nur das ich nicht von der ball klasse auf die des frames(j2d) zugreifen kann -- wieso ist das so??
Hier mal meine Quellcodes:


Hauptklasse:

```
package j2d;
import java.awt.*;
import java.awt.image.*;
import java.awt.geom.*;
import java.awt.event.*;


public class j2d extends Frame
{
    Ball ball = new Ball();
    Balken balken = new Balken();
    public static j2d Flaeche;
    
    
  public j2d()
    {
      ball.start();

              
    addWindowListener(
      new WindowAdapter() {
        public void windowClosing( WindowEvent ev ) {
          dispose();
          System.exit( 0 ); } } );
                  
        setSize(800,600);
        setTitle("Hallo");
        setVisible(true);
        addKeyListener(new MyKeyListener());
        startAnimation();

    }

   public static void main(String args[])
    {
          Flaeche = new j2d();
            
    }
   
   public void startAnimation()
   {
      while (true) {
          
          try{Thread.sleep(5);}
            catch(InterruptedException e){}
         repaint();
      }
   }
   
   public void paint( Graphics g )
    {  
        g.fillOval(ball.posx, ball.posy, ball.hoehe, ball.breite);
        g.setColor(Color.MAGENTA);
        g.fillRect(balken.posx, balken.posy, balken.breite, balken.hoehe);
        g.setColor(Color.ORANGE);
        g.fillRect(balken.pos2x, balken.pos2y, balken.breite, balken.hoehe);
   }
   
   
   /*Events*/
   
class MyKeyListener
  extends KeyAdapter
   {
     public void keyPressed(KeyEvent event)
    {
        balken.Balkenbeweg(event.getKeyCode());
     }
   }
}
```


Balkenklasse

```
/*
 * Balken.java
 *
 * Created on 10. Juni 2006, 14:30
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package j2d;
import java.util.Random.*;
import java.awt.*;
import java.awt.image.*;
import java.awt.geom.*;
import java.awt.event.*;
import java.util.Random;
/**
 *
 * @author user
 */
public class Balken
{
    public int posx=10;
    public int posy=10;
    public int pos2x=500;
    public int pos2y=10;
    public int breite=15;
    public int hoehe=100;
    public Balken()
    {
        
    }
    
    public void Balkenbeweg(int event)
    {
        if(event == KeyEvent.VK_UP)
            posy -=10;
        if(event == KeyEvent.VK_DOWN)
            posy +=10;
        if(event == KeyEvent.VK_W)
            pos2y -=10;
        if(event == KeyEvent.VK_S)
            pos2y +=10;
        Flaeche.
    }

}
```

Ballklasse!

```
/*
 * Ball.java
 *
 * Created on 10. Juni 2006, 00:26
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package j2d;
import java.util.Random.*;
import java.awt.*;
import java.awt.image.*;
import java.awt.geom.*;
import java.awt.event.*;
import java.util.Random;
/**
 *
 * @author user
 */
public class Ball extends Thread
{
    Random zufall = new Random();
    public int posy=250;
    public int posx=300;
    public int hoehe=50;
    public int breite=50;
    public int bewegx=+1;
    public int bewegy=+1;
    public int rechtsrand=800;
    public int untenrand=600;
    public Ball()
    {

    }
    
    public void run()
    {
        while(true)
        {
            Ballbewegen();
            try{Thread.sleep(5);}
            catch(InterruptedException e){}
        }
    }
    

    public void Ballbewegen()
    {
        posx += bewegx;
        posy += bewegy;
        if(posx + breite > rechtsrand-1)
            links();
        if(posx < 1)
            rechts();
        if(posy + hoehe > untenrand-1)
            hoch();
        if(posy < 26)
            runter();
    }

    /**************/
    /*Ballrichtung*/
    /*korrigieren */
    /**************/
    public void rechts()
    {
        bewegx=+1 * (1+ zufall.nextInt()%3);
    }
    
    public void links()
    {
        bewegx=-1 * (1+ zufall.nextInt()%3);
    }
    
    public void runter()
    {
        bewegy=+1;
    }
    
    public void hoch()
    {
        bewegy=-1;
    }


}
```


----------



## Beni (10. Jun 2006)

Weil dein Ball keine Referenz auf das Frame hat. Lass dir im Konstruktor von Ball noch eine Referenz auf dein Frame übergeben, und speicher sie in einer Instanzvariable:

```
public class Ball{
  private Frame frame;
  public Ball( Frame frame ){
    this.frame = frame;
  }
}
```


----------



## Balduran (10. Jun 2006)

hmm das versteh ich nicht so richtig:
ich muss das doch an den namen meines Frames anpassen (Flaeche heißt es bei mir) nunja hab das dann so:

```
public class Ball extends Thread
{
    
    private Frame Flaeche;
            public Ball( Frame Flaeche ){
            this.Flaeche = Flaeche;
    }
[...]
```

aber krieg nun wieder unsinnige Fehlermeldungen 


> compile:
> Exception in thread "main" java.lang.NullPointerException
> at j2d.Ball.<init>(Ball.java:35)
> at j2d.j2d.<init>(j2d.java:10)
> ...


----------



## Beni (10. Jun 2006)

1. Wieso sollte der Name der Variable eine Bedeutung haben? Du kannst die Variable auch "habakuck" nennen, und es wird dasselbe Ergebnis sein. Wichtig ist der Wert der Variable :wink:

2. Die Fehlermeldung ist nicht unsinnig: sie sagt dir, dass in Zeile 35 in Ball auf eine null-Referenz zugegriffen wird. Das funktioniert nicht (wo nichts ist, kann man auch nicht zugreiffen), und das Programm verabschiedet sich. Was übergibst du diesem Ball den? Da muss das Frame rein, auf welchem dein Ball rumspringt. (Wenn das dein j2d-Frame ist, dann sollte ein "new Ball( this )" reichen um die Verknüpfung herzustellen).


----------



## Balduran (10. Jun 2006)

Ahh cool jetz hab ichs verstanden besten dank 

musste den Quellcode erstmal bisschen umstrukturieren, kann ja nich nen Frame übergeben wo noch garkeine größe festgelegt wurd 

Was ich jetz auchnoch so als problem hab is die steuerung der beiden Balken
zurzeit mach ich das mit nem Event in diesem falle KeyPressed.. also an Balken wird die taste übergeben wenn es "W" oder "S" ist soll er balken1 bewegen wenns "Pfeil hoch" oder "Pfeil runter" is soll er balken2 bewegen
wenn jetz aber balken 1 am lenken ist und balken2 tippt wird balken1 unterbrochen.. zusätzlich ist es so das das ansteuern erst ein wenig zeit braucht bis es reagiert, woran liegt das?

hier mal das programm als .Jar:
http://www.balduran.de/j2d.jar


----------



## Wildcard (11. Jun 2006)

In der keyTyped Methode bist du vom Betriebssystem abhängig das festlegt wie oft das Event gefeuert wird.
Öffne einfach mal einen Texteditor und halte einen Buchstaben gedrückt dann siehst du den gleichen Effekt.
Für Spiele sind nur die keyPressed und keyReleased Methoden interessant.
Hier musst du dir merken welche Taste gedrückt wurde und bei keyReleased wieder vergessen.


----------



## Balduran (11. Jun 2006)

hmm meinste wenns gedrückt wurde:
gedrückt=true;
und solange bewegen bis losgelassen wird also gedrückt=false;
werd ich gleich ma ausprobieren


----------



## Wildcard (11. Jun 2006)

Hab mal einen alten Thread ausgegraben der dir sicher hilft(ist auch schon ein fertiges Pong enthalten)


----------



## Illuvatar (11. Jun 2006)

Noch eine Anmerkung, da ist noch etwas nicht ganz verstanden 


> musste den Quellcode erstmal bisschen umstrukturieren, kann ja nich nen Frame übergeben wo noch garkeine größe festgelegt wurd


Wenn ich richtig verstehe, was du meinst: Das kannst du sehr wohl! Du übergibst nämlich nur eine _Referenz_ auf das Fenster (in der C/++ Welt würde man _Zeiger_ sagen), und wenn du eine der Variablen änderst, ändert sich auch die andere Referenz. Oder kurz gesagt:

```
class Test
{
  private MainFrame frame;
  public Test (MainFrame f)
  {
    frame = f;
  }
  public void printSize()
  {
    System.out.println(frame.getSize().width + ", " + frame.getSize().height);
  }
}
public class MainFrame extends Frame
{
  public MainFrame()
  {
    Test t = new Test(this);
    setSize(800, 600);
    t.printSize(); //AUSGABE: '800, 600'
  }
  public static void main (String[] args)
  {
    new MainFrame();
  }
}
```


----------



## Balduran (11. Jun 2006)

ok danke für den Threadverweis, ich denke dadurch wird mein Problem gelöst 



öhm @Illuvatar:

es war bei mir aber so das ich den parameter frame übergeben musste aber setSize noch garnicht ausgeführt wurde und somit wurd 0,0 übergen bei width height


----------



## Illuvatar (11. Jun 2006)

Hm naja dann hab ich dich wahrscheinlich falsch verstanden. (Ich weiß dann zwar trotzdem nicht was du meinst, aber schieb das mal auf die Uhrzeit)


----------



## Balduran (11. Jun 2006)

naja ich habs hingekriegt, mag vielleicht nich die perfekte lösung sein, aber momentan reicht es / muss ja auchnicht unbedingt falsch sein 
und wegen der Uhrzeit.. ja es wird zeit 
Mein problem wurd gelöst(*haken setz*)
ich bedank mich für die gute Hilfe und wünsch ne gute (rest)Nacht


----------

