package src;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Example extends JPanel implements Runnable, MouseMotionListener{
//Klassenanmen schreibt man groß!!!!
private static final long serialVersionUID = 1L;
JFrame frame; //das Fenster
Rectangle bat; //der Schläger
Rectangle ball; // der Ball
int dx = 2; //Bewegungsänderung in x
int dy = 2; //Bewegungsänderung in y
public static void main(String[] args){
new Example(); //diese Klasse initialisieren
}
public Example(){
//Fenster erzegeugen
frame = new JFrame("Beispiel");
frame.setSize(500,500);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(this); //die Instanz dieses JPanels in Fenster packen
bat = new Rectangle(10,250,10,60); //Schläger initialisieren
ball = new Rectangle(200,200,10,10); // Ball initialisieren
setBackground(Color.black); //Panel-Hintergrudn schwarz
addMouseMotionListener(this); //MouseMotionListener ins JPanel packen
frame.setVisible(true); //alles anzeigen
Thread t = new Thread(this); //GameLoop in eingenem Thread
t.run();
}
public void run() {
while(frame.isVisible()){ //Thread so lange ausführen, wie Fenster sichtbar ist.
moveBall(); //Ball bewegen
checkCollision(); //Schläger-Ball-Kollision
try {
Thread.sleep(20); //Päuschen
} catch (InterruptedException e) {}
repaint(); //Repaint
}
}
private void checkCollision(){
if(bat.intersects(ball)){ //Standard-Methode von Rectangle intersetcts(Rectangle r)
dx *= -1; //dx negieren, damit Ball wegfliegt
ball.x += dx; //einmal bewegen, damit Kollisionsabfrage nicht nochmal greift
}
}
private void moveBall(){
//wenn linke Seite des Balls nicht mehr sichtbar. X-Bewegung ändern
if(ball.x<0){
dx = 2;
}
//das selbe in Grün für die rechte Seite
if(ball.x+ball.width >getWidth()){
dx = -2;
}
//Beide Bedingung für analog für Y
if(ball.y<0){
dy = 2;
}
if(ball.y+ball.height>getHeight()){
dy = -2;
}
//simple Ballbewegung - unabhängig vom GameLoop
ball.x += dx;
ball.y += dy;
}
@Override
//Hier wird gemalt
protected void paintComponent(Graphics g) {
super.paintComponent(g); //super-Aufruf nicht vergessen.
//Schläger
g.setColor(Color.red);
g.fillRect(bat.x, bat.y, bat.width, bat.height);
//Ball
g.setColor(Color.blue);
g.fillOval(ball.x, ball.y, ball.width, ball.height);
}
//MouseMotionListener-Methoden
public void mouseDragged(MouseEvent e) {
}
//einfache Übernahme y-Wert auch wenn Schläger nach unten verschwinden kann.
public void mouseMoved(MouseEvent e) {
bat.y = (int) e.getPoint().getY();
}
}