Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : Java - Pong programmieren



1337_alpha
28.05.2011, 13:15
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


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();

}
}
}

Tibull
28.05.2011, 13:43
http://www.teialehrbuch.de/Kostenlose-Kurse/JAVA/6726-Tastatureingaben.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)

1337_alpha
28.05.2011, 14:00
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 ^^

Tibull
28.05.2011, 15:04
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)

1337_alpha
28.05.2011, 16:01
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?

pdelvo
28.05.2011, 16:26
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