Ergebnis 1 bis 6 von 6

Thema: Java - Pong programmieren

  1. #1
    Prophet Avatar von 1337_alpha
    Registriert seit
    03.10.2007
    Beiträge
    7.297

    Standard Java - Pong programmieren

    Hey ;)

    Wir müssen derzeit bei uns in IT eine Projektarbeit machen und am Montag müssen wir zeigen was wir bisher erreicht haben ;)

    Hier ist das was ich bisher erreicht hab nur verlier ich langsam irgendwie den Überblick wenn ich ehrlich bin

    Was ich jetzt noch gerne einfügen würde bis zum Montag sind eben die Paddles und eine Mittellinie
    Mittellinie sollte recht einfach denke ich zu programmieren sein (eben einfach ne Linie die auf der x Koordinate (Spielfeldbreite/2) sitzt

    Aber bei den Paddles hab ich nicht den geringsten Schimmer da ich sowas noch nie gemacht hab
    Soll das per Rectangle oder per Linie die eine bestimmte Dicke aufweist gemacht werden?

    Und wie zur Hölle steuer ich die dann? o.O Hab im Internet schon nach Lösungen gesucht aber da findet man so gut wie gar nichts
    Wäre sehr nett wenn mir jemand helfen könnte da ich wie gesagt auch Langsam den Überblick verlier

    Code:
    import java.awt.*;
    import java.awt.event.*;
    
    //Variablen
    public class Pong extends Frame{
      static int breite=1024,hoehe=800,punkte;
      int max_zahl = 1;
      int trefferspieler1=0;
      int trefferspieler2=0;
      Ball b;
      private Image dbImage;
      private Graphics dbg;
    
      //Zeichnen des Fensters
      public void update(Graphics g)
        {
            if(dbImage==null)
            {
                dbImage=createImage(this.getSize().width, this.getSize().height);
                dbg=dbImage.getGraphics();
            }
            
            dbg.setColor(getBackground());
            dbg.fillRect(0,0,this.getSize().width, this.getSize().height);
            dbg.setColor(getForeground());
            paint(dbg);
            g.drawImage(dbImage,0,0,this);
        }
      
      //Spiel wird geschlossen wenn x gedrückt wird
      public Pong(String s){
        super(s); 
        this.addWindowListener (new WindowAdapter(){
          public void windowClosing(WindowEvent e){
            dispose();
            System.exit(0);
          }
        });
    //Farbe des Balls und Startposition
          Color farbe=Color.WHITE;
          b = new Ball(this,1024/2,800/2,20,farbe);
      }
    
      //Überschrift des Fensters,Größe,Hintergrundfarbe
      public static void main(String args[]){
        Pong f = new Pong("Pong - TGI-EK - Projektarbeit");
        f.setSize(breite,hoehe);
        f.setBackground(Color.black);
        f.setVisible(true);
      }
    
      //Punktestandanzeige (unvollständig) - korrekte Zählung fehlt
      public void paint(Graphics f){
        b.maleball(f);
        f.setColor(Color.white);
        f.drawString("Punktestand: "+ trefferspieler1+" : "+trefferspieler2,500,780);
      }
    
    }
    
    //Bewegung des Balls
    class Ball extends Thread{
      private int x,y,r,xr=2,yr=3;
      Color farbe;
      boolean sichtbar=true;
      Pong b;
    
      public Ball(Pong e,int xk,int yk,int rk,Color kfarbe){
        farbe=kfarbe;
        b=e;
        r=rk;
        x=xk;
        y=yk;
        this.start();
      }
    
      public void sichtbar_wechsel(boolean x){sichtbar=x;}
    
      public void maleball(Graphics g){
        if (sichtbar==true){
          g.setColor(farbe);
          g.fillOval(x,y,r*2,r*2);
        }
      }
    
      public int b_x(){return x;}
    
      public int b_y(){return y;}
    
      public int b_r(){return r;}
    
      // Geschwindigkeit des Balls
      public void run(){
        for(;;){
          try {this.sleep(3);}
          catch(InterruptedException e){}
          x=x-xr;
          y=y-yr;
          if( (x<=0) || (x>=(b.breite-2*r)) ) xr = -xr;
          if( (y<=20) || (y>=(b.hoehe-2*r)) ) yr = -yr;
          b.repaint();
          
        }
      }
    }
    Geändert von 1337_alpha (28.05.2011 um 13:58 Uhr)

  2. #2
    Semi Pro Avatar von Tibull
    Registriert seit
    16.03.2009
    Beiträge
    1.307

    Standard

    http://www.teialehrbuch.de/Kostenlos...reingaben.html
    keyListener vllt ?
    google-"java tastatur eingabe"-#5

    zu deinen paddles - ich würde rechtecke nehmen weil man da die koordinaten dann leichter findet imho

    denn später brauchst du ja diese um die kollision mit dem ball zu berechnen also die äußeren dürften nie weniger als Radius von Ball von dessen Mitte entfernt sein -> ansonsten andere Richtung

    zum code: wäre enfacher zu lesen wenns die einrückstruktur hätte (mit bbcode CODE dürfte das doch gehen) und vllt alle klassen nur mit einem wort an kommentar von den anderen abgegrenzt werden [name + beschreibung vllt]

    noch ne frage - wie wird eigentlich die zeit gesteuert ?
    du brauchst doch eine zeit um die geschwindigkeit des balls und der paddles konstant zu halten oder richtig zu beschleunigen (da die frames unterschiedlich schnell gezeichnet werden)
    MfG
    _Tibull_
    SketchUp




  3. #3
    Prophet Avatar von 1337_alpha
    Registriert seit
    03.10.2007
    Beiträge
    7.297

    Standard

    Ok hab das mit der Einrückstruktur gemacht und auch kommentiert

    Das mit dem KeyListener schau ich mir mal an

    Zeit gesteuert? o.O Und warum sollte ich die Geschwindigkeit des Balls konstant halten?
    Sorry aber ich versteh grad grad nur Bahnhof
    Wie gesagt verlier ich mittlerweile einfach die übersicht und das Ganze fängt an mich etwas zu überfordern ^^
    Geändert von 1337_alpha (28.05.2011 um 14:10 Uhr)

  4. #4
    Semi Pro Avatar von Tibull
    Registriert seit
    16.03.2009
    Beiträge
    1.307

    Standard

    naja du willst doch wahrscheinlich das spiel spielbar machen und zum leben erwecken und kein bild fabrizieren oder ?

    dafür brauchst du

    bewegung
    1. paddles - spieler
    2. ball - konstant (oder ansteigend mit jedem treffer was auch immer)
    funktionX "bewege ball" braucht dann die geschwindigkeit, vektor und die zeit
    -> bewegt den ball um die errechnete distanz in richtung des vektors

    geschwindigkeiten und beschleunigungen
    1. paddles - je länger taste gedrückt desto schneller fährt der nach oben o.ä.
    2. ball - wird pro auftatzen am paddle schneller (zb)
    funktionY "beschleunigeBall" braucht zb die kollisionen usw...
    kollision oder einen trick um den ball am spielfeldrand (oben&unten überall und rechts und links nur am paddle) zu reflektieren
    spielfeldränder.position
    paddles.position + (wenn du weist wie das rechteck gezeichnet wird) paddlesränder.position
    ball.position + ball.radius / rand
    functionK "kollidiere" würde dann jeden frame die entfernung von ball (mittelpunkt) zu den rändern der anderen teile überprüfen und wenn diese kleiner wird als ball.radius den ball nicht zum errechneten punkt bewegen lassen (so [ohne zeit] würde er durch das hinternis durchfliegen) sondern im eintrittswinkel wieder vom hindernis wegbewegen

    => zeit

    denn die frames werden zB (irgendeine zahl) in 1ms gezeichnet
    dann startet zufällig ein programm im hintergrund und die zeit verlängert sich auf 2ms
    -> der ball würde ohne zeitabfrage also mit der 1ms konstante bewegt obwohl das bild schon 2ms später ist .... ergo er wäre langsamer (und könnte hindernisse durchfliegen)
    MfG
    _Tibull_
    SketchUp




  5. #5
    Prophet Avatar von 1337_alpha
    Registriert seit
    03.10.2007
    Beiträge
    7.297

    Standard

    Irgendwie hilft mir das nicht wirklich weiter wenn ich ehrlich bin =/

    Und ich fabriziere doch gar kein "Bild"?! Das ganze bewegt sich doch schon

    Ich will auch weder dass der Ball beim auftazen schneller wird noch dass die Paddles schneller werden je länger man drückt

    Und warum sollte ich eine "Zeit" programmieren?! Von sowas hab ich noch nie gehört o.O
    Das ganze muss doch auch ohne gehen

    Und Kollision ist doch auch schon vorhanden?

  6. #6
    User
    Registriert seit
    04.04.2011
    Beiträge
    38

    Standard

    Du brauchst die Zeit in Sekunden(als Fließkommazahl), die zwichen 2 Frames vergangen ist. Dann musst du dir irgendwo hinterlegen, welcher Weg in einer Sekunde zurückgelegt werden soll und damit multiplizieren. Dann bleibt die Geschwindigkeit konstant, egal wie viele frames gerade pro sekunde berechnet werden

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •