hey leute,
ich habe versucht mal ein kleines pong spiel zu schreiben.
Soweit passt auch fast alles. Aber der Ball prallt am oberen Rand nicht richtig ab (auf höhe des schlägers). Am linken rand mit weitem Abstand und am unteren Rand erst, wenn er verschwunden ist.
Ich habe schon einige Varianten in den Klassen ausprobiert. Ich kann den Fehler aber leider nicht ausmerzen.
Ich hoffe ihr habt einen Tipp, wo ich was falsch gemacht habe.
Hier die in frage kommenden Klassen:
PingPong:
Move:
Kollision:
und gegnermove:
Ich hoffe mir kann jemand die schwachstelle aufzeigen. anschließend würde ich dann mit dem abprallen am unteren und oberen balken weiter machen.
ich habe versucht mal ein kleines pong spiel zu schreiben.
Soweit passt auch fast alles. Aber der Ball prallt am oberen Rand nicht richtig ab (auf höhe des schlägers). Am linken rand mit weitem Abstand und am unteren Rand erst, wenn er verschwunden ist.
Ich habe schon einige Varianten in den Klassen ausprobiert. Ich kann den Fehler aber leider nicht ausmerzen.
Ich hoffe ihr habt einen Tipp, wo ich was falsch gemacht habe.
Hier die in frage kommenden Klassen:
PingPong:
Java:
public class Pingpong extends JComponent implements ActionListener, MouseMotionListener, KeyListener
{
//Anfangs X und Y Position
public static int ballX=0;
public static int ballY=0;
//X und Y Geschwindigkeit
public static int ballXSpeed=1;
public static int ballYSpeed=-1;
//Anfangsposition des Schlägers
static int schlaegerSpielerX=0;
static int schlaegerGegnerX=0;
//Höhe und breite
static int hoehe=800;
static int breite=1200;
//Schrift für die Punkte
static Font font=new Font("Arial", Font.PLAIN, 20);
static int spielerpoints=0;
static int gegnerpoint=0;
public Pingpong() {
JFrame frame=new JFrame("Ping Pong");
Draw draw=new Draw();
Move move=new Move();
Kollision kollision=new Kollision();
Gegnermove gm=new Gegnermove();
frame.add(draw);
frame.addMouseMotionListener(this);
frame.setSize(1200, 800);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
//Hier sind noch eininge Methoden der Listener vorhanden. Diese habe ich jetzt weggelassen, da sie nicht relevant sind.
Move:
Java:
import java.util.Timer;
import java.util.TimerTask;
public class Move {
Timer timer;
public Move() {
timer=new Timer();
TimerTask TimerTask;
timer.scheduleAtFixedRate(TimerTask=new TimerTask() {
@Override
public void run() {
//Festlegen der Geschwindigkeit in x und y richtung
Pingpong.ballX=Pingpong.ballX+Pingpong.ballXSpeed*2;
Pingpong.ballY=Pingpong.ballY+Pingpong.ballYSpeed*2;
//wenn die position des balls an den rechten bildschirmrand schlägt springt er zurück
if(Pingpong.ballX>=(1170))
{
Pingpong.ballXSpeed=-1;
}
//wenn die position des balls kleiner der des linken Randes ist
if(Pingpong.ballX<=0)
{
Pingpong.ballXSpeed=1;
}
//wenn die position des balls größer als des Frames ist
if(Pingpong.ballY>=(Pingpong.hoehe-15))//770)
{
Pingpong.ballYSpeed=-1;
}
}
}, 0, 5);
}
}
Kollision:
Java:
import java.util.Timer;
import java.util.TimerTask;
public class Kollision {
Timer timer;
public Kollision() {
timer=new Timer();
TimerTask TimerTask;
timer.scheduleAtFixedRate(TimerTask=new TimerTask() {
@Override
public void run() {
if(Pingpong.ballY<=(Pingpong.hoehe-Pingpong.hoehe)+30)
{
Pingpong.ballYSpeed=1;
Pingpong.spielerpoints+=1;
}
if(Pingpong.ballY>=(Pingpong.hoehe-30))
{
Pingpong.ballYSpeed=-1;
Pingpong.gegnerpoint+=1;
}
if(Pingpong.ballX<=(Pingpong.breite-Pingpong.breite)+30)
{
Pingpong.ballXSpeed=1;
}
if(Pingpong.ballX>=(Pingpong.breite)-30)
{
Pingpong.ballXSpeed=-1;
}
//Der 3 Fall wurde verändert, damit der ball vom schläger und nicht mitten im Bildschirm abprallt
//wenn die horizontale des balls größer ist als die länge des Spieler schlägers und
//wenn die hörizontale des balls kleiner ist als die Länge des spieler schläger +150 und
//wenn die vertikale des balls größer als der obere Rand ist
if(Pingpong.ballX>=Pingpong.schlaegerSpielerX&&Pingpong.ballX<=Pingpong.schlaegerSpielerX-150&&Pingpong.ballY>=20)
{
//dann wird die geschwindigkeit positiv;
Pingpong.ballYSpeed=1;
}
}
}, 0, 6);
}
}
und gegnermove:
Java:
import java.util.Timer;
import java.util.TimerTask;
public class Gegnermove {
Timer timer;
public Gegnermove() {
timer=new Timer();
TimerTask TimerTask;
timer.scheduleAtFixedRate(TimerTask=new TimerTask() {
@Override
public void run() {
//Gegnermove
//wenn der ball in der oberen Hälfte ist und er in der horizontalen kleiner ist als der Gegner schläger +75
if(Pingpong.ballY<Pingpong.hoehe/2&&Pingpong.ballX<=Pingpong.schlaegerGegnerX+75)
{//und wenn der ball in der oberen hälfte in der horizontalen kleiner als die hälfte der breite ist
//und wenn der gegner schläger in der horiz. größer als die hälfte der breite ist
if(Pingpong.ballX<=Pingpong.breite/2 && Pingpong.schlaegerGegnerX>=Pingpong.breite/2)
{//dann wandert der gegnerschläger nach links
Pingpong.schlaegerGegnerX-=1;
}
}
//wenn der ball in der horizontalen größer als die breite des Spielfelds ist
//und der gegner schläger kleiner als die hälfte des felds
if(Pingpong.ballX>=Pingpong.breite/2 && Pingpong.schlaegerGegnerX<=Pingpong.breite/2)
{//dann wandert der gegnerschläger nach rechts
Pingpong.schlaegerGegnerX+=1;
}
// //wenn die horizontale des balls größer gleich das ende des Gegner Schlägers ist
// if(Pingpong.ballX>=Pingpong.schlaegerGegnerX+75)
// {
// Pingpong.schlaegerGegnerX=5;
// }
// //wenn die horizontale des balls kleiner oder gleich der des gegner schlägers ist
// if(Pingpong.ballX<=Pingpong.schlaegerGegnerX+75)
// {
// Pingpong.schlaegerGegnerX=-5;
// }
// //Wenn der ball am oberen Rand anschlägt
// if(Pingpong.ballY<=(Pingpong.hoehe-Pingpong.hoehe)+30)
// {
// //fliegt er zurück
// Pingpong.ballYSpeed=1;
// //und der spieler bekommt einen punkt
// Pingpong.spielerpoints+=1;
// }
//
//
//// //Wenn der Ball in der unteren Hälfte ist
// if(Pingpong.ballY>=Pingpong.hoehe/2)
// //wenn der ball am unteren rand anschlägt
// if(Pingpong.ballY>=(Pingpong.hoehe-30))//770)
// {
// //fliegt er zurück
// Pingpong.ballYSpeed=-1;
// //und der gegner bekommt einen Punkt
// Pingpong.gegnerpoint+=1;
// }
}
}, 0, 5);
}
}
Ich hoffe mir kann jemand die schwachstelle aufzeigen. anschließend würde ich dann mit dem abprallen am unteren und oberen balken weiter machen.