Moin Moin!
Ich hatte eben schon mal einen anderen Thread zum selben Programm. Allerdings habe ich jetzt ein neues Problem.
Der Ball fliegt jetzt wunderbar hin und her, soll heißen, wenn eine Grenze des JPanel erreicht wurde, dann wird die Richtung gewechselt.
Die Flugrichtung des Balls setze ich mit der Variable int distance und ist durch die Anordnung der Ziffern auf dem Nummernblock kodiert.
Zu Beginn ist
, der Ball sollte also nach rechts fliegen. Doch da in der Methode
beim ersten Aufruf die Grenzen des JPanels nicht ausgelesen werden können, wird die Flugrichtung gleich geändert und der Ball fliegt nach links.
Warum ist das so?
Dies ist die Konsolenausgabe:
Und dies der aktuelle Code:
Ich hatte eben schon mal einen anderen Thread zum selben Programm. Allerdings habe ich jetzt ein neues Problem.
Der Ball fliegt jetzt wunderbar hin und her, soll heißen, wenn eine Grenze des JPanel erreicht wurde, dann wird die Richtung gewechselt.
Die Flugrichtung des Balls setze ich mit der Variable int distance und ist durch die Anordnung der Ziffern auf dem Nummernblock kodiert.
Zu Beginn ist
Code:
distance = 6
Code:
getPositionX(int x)
Warum ist das so?
Dies ist die Konsolenausgabe:
Code:
20 50 -20 6
20 49 -20 4
20 48 -20 4
20 47 -20 4
20 46 -20 4
20 45 -20 4
20 44 -20 4
20 43 464 4
20 42 464 4
20 41 464 4
painting...
20 40 464 4
20 39 464 4
20 38 464 4
20 37 464 4
20 36 464 4
painting...
20 35 464 4
20 34 464 4
painting...
20 33 464 4
painting...
20 32 464 4
painting...
20 31 464 4
painting...
20 30 464 4
painting...
20 29 464 4
Und dies der aktuelle Code:
Java:
public class Field extends JPanel implements Runnable {
private int x_pos = 50; // x - Position des Balles
private int y_pos = 100; // y - Position des Balles
private int radius = 20; // Radius des Balles
private int direction = 6; // Bewegungsrichtung, analog zum Nummernblock (5 = keine Bewegung)
private boolean running = true;
private Image dbImage;
private Graphics dbg;
public Field() {
Thread thread = new Thread(this);
thread.start();
this.setBackground(Color.DARK_GRAY);
}
@Override
public void update (Graphics g) {
System.out.print("1");
// Initialisierung des DoubleBuffers
if (dbImage == null) {
dbImage = createImage(this.getSize().width, this.getSize().height);
dbg = dbImage.getGraphics();
}
// Bildschirm im Hintergrund löschen
dbg.setColor(getBackground ());
dbg.fillRect(0, 0, this.getSize().width, this.getSize().height);
// Auf gelöschten Hintergrund Vordergrund zeichnen
dbg.setColor(getForeground());
paint(dbg);
// Nun fertig gezeichnetes Bild Offscreen auf dem richtigen Bildschirm anzeigen
g.drawImage(dbImage, 0, 0, this);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
System.out.println("painting...");
g.setColor(Color.RED);
g.fillOval(x_pos - radius, y_pos - radius, 2 * radius, 2 * radius);
}
public void run () {
while(running) {
x_pos = getPositionX(x_pos);
repaint();
try {
Thread.sleep(2);
}
catch(InterruptedException exception) {
}
}
}
public int getPositionX(int x) {
Dimension frameSize = this.getSize();
int limit_right = frameSize.width - radius;
int limit_left = 0 + radius;
System.out.println(limit_left + "\t" + x + "\t" + limit_right + "\t" + direction);
if(direction == 6) {
if(x < limit_right) {
x++;
}
else {
direction = 4;
x--;
}
}
else if(direction == 4) {
if(x > limit_left) {
x--;
}
else {
direction = 6;
x++;
}
}
return x;
}
}