Hallo,
(ich hoffe, dass das der richtige Thread ist)
als Einsteiger in der JAVA-Programmierung dachte ich nun, ich wäre soweit eine kleine Simulation zu bauen. Eine Kugel (2D) fällt von oben, prallt auf den Boden auf, wird dadurch wieder in die Luft geschleudert, während sie aber wieder von der Anziehung auf den Boden gezogen wird. Eine Art Gummiball eben. Dies geschieht solange, bis die Kugel aufgrund der Erdanziehung ganz zum Stillstand kommt. Der Impuls, der sie beim Aufprall nach oben schleudert, wird natürlich von Aufprall zu Aufprall kleiner.
Ich habe in Form von Kommentaren im Code hoffentlich alles verständlich genug erklärt.
Mein Problem besteht darin, dass die Kugel beim zweiten Aufprall nicht wieder einen weiteren Impuls nach oben erhält, der natürlich kleiner sein soll. Ich könnte eine weitere if-Abfrage dazwischenschieben, die dann nach dem ersten Impuls prüft, ob die Kugel den Boden nicht mehr berührt und touched auf false setzt. Dadurch soll dann beim nächsten Aufprall wieder ein Impuls nach oben berechnet werden.
Diese Zeile führt allerdings zu einem Grafik-Bug. Beim zweiten Aufprall steckt die Kugel fest. Irgendwie sitze ich hier fest und weiß nicht genau, wo der Fehler liegt. Ob das zu schlampig programmiert ist oder mir nur mehr irgendeine Zeile zum Resultat fehlt?
Danke für Eure Hilfe schon im Voraus!
(ich hoffe, dass das der richtige Thread ist)
als Einsteiger in der JAVA-Programmierung dachte ich nun, ich wäre soweit eine kleine Simulation zu bauen. Eine Kugel (2D) fällt von oben, prallt auf den Boden auf, wird dadurch wieder in die Luft geschleudert, während sie aber wieder von der Anziehung auf den Boden gezogen wird. Eine Art Gummiball eben. Dies geschieht solange, bis die Kugel aufgrund der Erdanziehung ganz zum Stillstand kommt. Der Impuls, der sie beim Aufprall nach oben schleudert, wird natürlich von Aufprall zu Aufprall kleiner.
Ich habe in Form von Kommentaren im Code hoffentlich alles verständlich genug erklärt.
Java:
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class KugelPhysik extends JFrame{
private Screen screen;
private float kugel_posx=400;
private float kugel_posy=300;
private static float faktor=100;
private static float masse=1;
private static float g=9.81f; //Erdanziehung
private float sec=1; // Simulation startet bei Sekunde 1
private float v; // die Geschwindigkeit die jede Sekunde neu berechnet wird
private float p; // der Impuls, der beim Aufprall der Kugel nach oben (-y) geht
private static float floory=530; // die y-Position des Bodens
private float speed; // die Geschwindigkeit des Impulses
private boolean touched=false; // ob die Kugel den Boden berührt hat
public KugelPhysik(){
super("KugelPhysik");
screen = new Screen();
screen.setBounds(0,0,800,600);
add(screen);
}
public void repaintScreen(){
screen.repaint();
}
private class Screen extends JLabel{
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.RED);
g.fillOval((int)kugel_posx, (int)kugel_posy, 50, 50); // ein Kreis wird erstellt
}
}
public static void main(String[] args) {
KugelPhysik kp = new KugelPhysik();
kp.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
kp.setSize(800,600);
kp.setVisible(true);
kp.setResizable(false);
while(true)
{
if(kp.kugel_posy>=floory){
kp.touched=true; // wenn die Kugel am Boden angekommen ist, dann setzte touched auf true
}
if(kp.touched==false){
kp.kugel_posy=g*kp.sec*kp.sec/2/faktor; // y-Position der Kugel nach folgender Formel:
// Erdbeschleunigung*sec^2/2/faktor -- den Faktor habe ich verwendet
// da der Vorgang sonst zu schnell wäre
kp.speed=g*kp.sec/faktor; // berechne die Geschwindigkeit für den Impuls
}
if(kp.touched==true){
kp.p=masse*kp.speed; // der Impuls=Masse*Geschwindigkeit
kp.kugel_posy-=kp.p; // steuert die Kugel nach oben - Impuls
kp.kugel_posy+=g*kp.sec*kp.sec/2/faktor/faktor; // die Erdanziehung besteht aber natürlich immer noch
// "/faktor/faktor" kann ich mir nicht erklären, habe ich
// allerdings nach herumprobieren so angepasst
}
try {
Thread.sleep(15);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
kp.sec+=1; //zähle die Sekunde hoch
System.out.println(kp.kugel_posy); //gib die derzeitige Kugelposition aus
kp.repaintScreen(); //den Screen neu zeichnen
}
}
}
Mein Problem besteht darin, dass die Kugel beim zweiten Aufprall nicht wieder einen weiteren Impuls nach oben erhält, der natürlich kleiner sein soll. Ich könnte eine weitere if-Abfrage dazwischenschieben, die dann nach dem ersten Impuls prüft, ob die Kugel den Boden nicht mehr berührt und touched auf false setzt. Dadurch soll dann beim nächsten Aufprall wieder ein Impuls nach oben berechnet werden.
Java:
if(kp.kugel_posy<floory){
kp.touched=false; // wenn die Kugel nicht am Boden ist, setze touched auf false
}
Diese Zeile führt allerdings zu einem Grafik-Bug. Beim zweiten Aufprall steckt die Kugel fest. Irgendwie sitze ich hier fest und weiß nicht genau, wo der Fehler liegt. Ob das zu schlampig programmiert ist oder mir nur mehr irgendeine Zeile zum Resultat fehlt?
Danke für Eure Hilfe schon im Voraus!
Zuletzt bearbeitet: