Hallo,
ich bin gerade dabei ein Programm zu schreiben, wobei sich zwei Bälle innerhalb einer Leinwand bewegen.
Ich habe es soweit geschafft, dass beide Bälle den Rand der Leinwand erkennen und entsprechend abprallen. Beim auftreffen auf die Leinwand ändern sie auch die Farbe.
Nun möchte ich, dass sie auch von einander abprallen.
mein Ansatz ist folgender:
Mir ist klar, dass der Abprall so nicht gerade realistisch wirkt, aber darum geht es auch garnicht.
Aber dieser Code funktioniert auch so nicht. Mein Problem ist, dass ich nicht weiss, wie ich die Bedingung formulieren soll.
Die Bedingung soll in die Methode "bewegen".
Hier der ganze Code:
mfG,
neotox
ich bin gerade dabei ein Programm zu schreiben, wobei sich zwei Bälle innerhalb einer Leinwand bewegen.
Ich habe es soweit geschafft, dass beide Bälle den Rand der Leinwand erkennen und entsprechend abprallen. Beim auftreffen auf die Leinwand ändern sie auch die Farbe.
Nun möchte ich, dass sie auch von einander abprallen.
mein Ansatz ist folgender:
Java:
if (xPosition.ball_1 + radius == xPosition.ball_2 + radius && yPosition_ball1 + radius == yPosition.ball_2 + radius)
{
xGeschwindigkeit = -xGeschwindigkeit ;
yGeschwindigkeit = -yGeschwindigkeit;
}
Mir ist klar, dass der Abprall so nicht gerade realistisch wirkt, aber darum geht es auch garnicht.
Aber dieser Code funktioniert auch so nicht. Mein Problem ist, dass ich nicht weiss, wie ich die Bedingung formulieren soll.
Die Bedingung soll in die Methode "bewegen".
Hier der ganze Code:
Java:
import java.awt.geom.Ellipse2D; // importiert die Möglichkeit 2D-Objekte zu zeichnen (für methode "zeichnen")
public class Ball extends Kreis{ // Ball erweitert Kreis
// Anfang Attribute
private int durchmesser; // durchmesser als int (zahlenwert)
private int xPosition; // xPosition als int (zahlenwert)
private int yPosition; // yPosition als int (zahlenwert)
private int xg; // xGeschwindigkeit als int (zahlenwert)
private int yg; // yGeschwindigkeit als int (zahlenwert)
private int xmax; // maximale xPosition als int (zahlenwert)
private int ymax; // maximale yPosition als int (zahlenwert)
private int radius;
// Ende Attribute
public Ball (int xgS, int ygS, int xPositionS, int yPositionS){
super();
// Werte von Ball
durchmesser = 30; // Durchmesser des Balles
xPosition = xPositionS; // xPosition beim erstellen
yPosition = yPositionS; // yPosition beim erstellen
farbe = "blau"; // farbe beim erstellen = blau
radius = durchmesser/2;
xg = xgS; // Geschwindigkeit des Balles in x Richtung
yg = ygS; // Geschwindigkeit des Balles in y Richtung
xmax = 300; // Größe des Applets in x Richtung
ymax = 300; // Größe des Applets in y Richtung
istSichtbar = false; // Ball ist beim erstellen unsichtbar
}
public static void main (String[] args) {
Ball ball_1;
Ball ball_2;
ball_1= new Ball(3,3,140,30);
ball_1.farbeAendern ("gelb");
ball_1.sichtbarMachen();
ball_2= new Ball(6,12,190,80);
ball_2.farbeAendern ("rot");
ball_2.sichtbarMachen();
for (int i = 1; i < 300; i++){
ball_1.bewegen();
ball_2.bewegen();
}
}
// Anfang Methoden
// Methode um einem weiteren Ball neue Werte zu geben
public void Ball2 (){ // klasse Ball2 is öffentlich
// Werte von Ball2
durchmesser = 30; // Durchmesser des Balles2
xPosition = 40; // xPosition beim erstellen
yPosition = 80; // yPosition beim erstellen
farbe = "rot"; // farbe beim erstellen = blau
xg = 2; // Geschwindigkeit des Balles2 in x Richtung
yg = 1; // Geschwindigkeit des Balles2 in y Richtung
istSichtbar = false; // Ball2 ist beim erstellen unsichtbar
}
// Methode um den Ball zu bewegen
public void bewegen(){
xPosition += xg;
yPosition += yg;
// Solange true ist läuft der Thread weiter
// Wenn der Ball den rechten Rand berührt, dann prallt er ab
if (xPosition > xmax - durchmesser)
{
// Ändern der Richtung des Balles
xg = -xg;
// Wenn die Bedingung erfüllt wird, ändere Farbe in Rot
farbe = ("rot");
}
// Ball berührt linken Rand und prallt ab
else if ( xPosition < 0)
{
// Ändern der Richtung des Balles
xg = -xg;
// Wenn die Bedingung erfüllt wird, ändere Farbe in Blau
farbe = ("blau");
}
// Verändern der x- Koordinate
xPosition += xg;
// Neuzeichnen des Applets
zeichnen();
// Wenn der Ball unten den Rand berührt, dann prallt er ab
if (yPosition > ymax - durchmesser)
{
// Ändern der Richtung des Balles
yg = -yg;
// Wenn die Bedingung erfüllt wird, ändere Farbe in Gelb
farbe = ("gelb");
}
// Ball berührt den oberen Rand und prallt ab
else if ( yPosition < 0)
{
// Ändern der Richtung des Balles
yg = -yg;
// Wenn die Bedingung erfüllt wird, ändere Farbe in Grün
farbe = ("gruen");
}
//zeichne mit neuen Werten
zeichnen();
}
public void Kreis (double deltaX, double deltaY){
//um 180 Grad drehen
xg = -xg;
yg = -yg;
}
// "rot", "gelb", "blau", "gruen", "lila" und "schwarz".
public void farbeAendern(String neueFarbe) {
farbe = neueFarbe;
zeichnen();
}
public void zeichnen() {
if (istSichtbar) {
Leinwand leinwand = Leinwand.gibLeinwand();
leinwand.zeichne(this, farbe, new Ellipse2D.Double(xPosition,
yPosition, durchmesser, durchmesser));
leinwand.warte(10);
}
}
// Ende Methoden
}
mfG,
neotox