Ich bin ziemlich neu in Java und ich verwende die ACM-Bibliothek für Grafiken. Was ich versuche mit diesem Code zu tun ist:Java Glitchy Collision Detection mit ACM Graphics
- Führen Sie zwei Kugeln, eine auf der linken Seite und eine in der Mitte. Beide sind in der Mitte, y-Koordinaten.
- Machen Sie den ersten Ball, bis Sie den zweiten Ball treffen. Stoppen Sie dann und geben Sie der zweiten Kugel eine Geschwindigkeit proportional zu ihrer Größe (ähnlich einer Impulserhaltung).
- Den zweiten Ball von der Wand springen lassen und bewegen, bis der erste Ball getroffen wird. Stoppen Sie dann und geben Sie der ersten Kugel wieder eine ihrer Größe proportionale Geschwindigkeit.
- Machen Sie diese Aktion unendlich.
Mein Code ist als solche:
import java.awt.Color;
import acm.graphics.*;
import acm.program.*;
import acm.util.RandomGenerator;
public class Collision extends GraphicsProgram {
private static final double RADIUS_ONE = 35;
private static final double RADIUS_TWO = 65;
public void run() {
GOval ballOne = new GOval(0, (getHeight() - RADIUS_ONE)/2, RADIUS_ONE, RADIUS_ONE);
ballOne.setFilled(true);
ballOne.setColor(Color.GREEN);
add(ballOne);
GOval ballTwo = new GOval((getWidth() - RADIUS_TWO)/2, (getHeight() - RADIUS_TWO)/2, RADIUS_TWO, RADIUS_TWO);
ballTwo.setFilled(true);
ballTwo.setColor(Color.ORANGE);
add(ballTwo);
double velocityOne = 3;
double velocityTwo = 0;
while (true) {
ballOne.move(velocityOne, 0);
ballTwo.move(velocityTwo, 0);
if (ballOne.getX() >= getWidth() - RADIUS_ONE || ballOne.getX() <= 0) {
velocityOne = -velocityOne;
}
if (ballTwo.getX() >= getWidth() - RADIUS_TWO || ballTwo.getX() <= 0) {
velocityTwo = -velocityTwo;
}
if (ballOne.getX() + RADIUS_ONE >= ballTwo.getX()) {
if (velocityTwo == 0) {
velocityTwo = (velocityOne * RADIUS_ONE * RADIUS_ONE)/(RADIUS_TWO * RADIUS_TWO);
velocityOne = 0;
} else if (velocityOne == 0) {
velocityOne = (velocityTwo * RADIUS_TWO * RADIUS_TWO)/(RADIUS_ONE * RADIUS_ONE);
velocityTwo = 0;
}
}
pause(10);
}
}
}
Wenn Sie diesen Code ausführen, sehen Sie es nicht richtig funktioniert. Beim Treffen des zweiten Balls hört der erste Ball nicht auf, sich zu bewegen und bewegt sich mit dem zweiten Ball mit. Aber wenn Sie velocityOne
zu 2 anstelle von 3 ändern, funktioniert alles in Ordnung. Oder wenn Sie RADIUS_TWO
auf 45 statt 65, funktioniert der Code, wie es für jeden Wert von velocityOne
sollte.
Könnte mir jemand erklären, warum dieser Code für die meisten Werte nicht funktioniert, während er so arbeitet, wie er es mit so wenig tun soll? Danke vielmals.
Danke für die Klarstellung :) Wie ich schon erwähnt habe, bin ich recht neu in Java. Wie könnte ich die Zeit zwischen den Kollisionskontrollen verkürzen? – Glycerius
Was macht das "pause (10)" Linie tun ??? –
Wenn ich die Pause nicht hinzufüge, ist der Ball schwer zu beobachten. Da dies alles in einer Zeitschleife ist, geschieht die Bewegung natürlich ziemlich schnell. Aber selbst wenn ich die Pause entferne, passiert der Fehler in bestimmten Fällen. Was soll ich machen? – Glycerius