Ping Pong

Status
Nicht offen für weitere Antworten.

Balduran

Mitglied
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 :D )

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:
Code:
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
Code:
/*
 * 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!
Code:
/*
 * 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;
    }


}
 
B

Beni

Gast
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:
Code:
public class Ball{
  private Frame frame;
  public Ball( Frame frame ){
    this.frame = frame;
  }
}
 

Balduran

Mitglied
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:
Code:
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)
at j2d.j2d.main(j2d.java:36)
Java Result: 1
 
B

Beni

Gast
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

Mitglied
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 :D

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

Top Contributor
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

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

Illuvatar

Top Contributor
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:
Code:
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

Mitglied
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

Top Contributor
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

Mitglied
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 :D
Mein problem wurd gelöst(*haken setz*)
ich bedank mich für die gute Hilfe und wünsch ne gute (rest)Nacht :D
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Y Ping Pong Spiele- und Multimedia-Programmierung 4
M Einfaches Ping-Pong Spiel Spiele- und Multimedia-Programmierung 3
1 Ping Pong langsam Spiele- und Multimedia-Programmierung 13
J ping pong ball abprallen lassen Spiele- und Multimedia-Programmierung 12
L Java Ping Pong Spiele- und Multimedia-Programmierung 1
S Ping Pong: KeyListener in Paint und while Spiele- und Multimedia-Programmierung 10
G Ping Pong Frage Spiele- und Multimedia-Programmierung 17
R Ping Pong Spiel Fehlermeldung Spiele- und Multimedia-Programmierung 12
R Ping Pong Spiel Spiele- und Multimedia-Programmierung 28
J Probleme bei Pong Spiele- und Multimedia-Programmierung 9
J Pong Programm Spiele- und Multimedia-Programmierung 1
T Pong Hilfe bei einer Website Spiele- und Multimedia-Programmierung 4
S Pong java.lang.StackOverflowError Spiele- und Multimedia-Programmierung 3
R Pong Spiel Problem Spiele- und Multimedia-Programmierung 1
B LWJGL StackOverFlow Problem nach 30sekunden. (Pong) Spiele- und Multimedia-Programmierung 2
T Torquemada´s erstes Game (Pong) Spiele- und Multimedia-Programmierung 5
A Pong Grafikgestaltung Spiele- und Multimedia-Programmierung 10
R Pong -Reruns möglich machen Spiele- und Multimedia-Programmierung 2
Y Pong Spiel Score Zähler! -.- Spiele- und Multimedia-Programmierung 18
U Pong Spiele- und Multimedia-Programmierung 7
BattleMaster246 Pong - JOGL Spiele- und Multimedia-Programmierung 2
J Tips für ein kleines Pong-Applet Spiele- und Multimedia-Programmierung 4
D Java Pong Probleme Spiele- und Multimedia-Programmierung 7
W Hilfe bei Pong mit Bluej Spiele- und Multimedia-Programmierung 4
M Fragen zu meinem Pong-Clone Spiele- und Multimedia-Programmierung 6
L Probleme Bei Pong Programmierung Spiele- und Multimedia-Programmierung 2
G Pong klon mit Steuerungsprobleme Spiele- und Multimedia-Programmierung 8
B Pong-Klon. Denkfehler bei kollisionstest Spiele- und Multimedia-Programmierung 3
N Pong - noch 2 kleinere Probleme Spiele- und Multimedia-Programmierung 16
G Pong-Klon (Applet!) Spiele- und Multimedia-Programmierung 4
H Performance check Pong Spiele- und Multimedia-Programmierung 19

Ähnliche Java Themen

Neue Themen


Oben