Posiadam obecnie coś takiego
Link do projektu w Eclipse: http://dl.dropbox.com/u/1280777/BallApplication.zip
Póki co mam panel na który wrzucam dowolną ilość kul. Jedynym elementem od którego mogą się odbić są ściany.
- Pytanie jak zrobić, aby kule odbijały się też od siebie. Z detekcją samego zdarzenia nie ma problemu ponieważ wiadomo, że jeśli odległości jednego środka od drugiego jest mniejsza, równa sumie ich promieni to doszło do zderzenia, ale jak wyliczyć kąt odbicia?
2)W klasie Ball w ogóle nie trzymam czegoś takiego jak kąt po jakim się porusza kula, a jedynie wartość składowych x i y oraz ich zwroty. Czy na podstawie tych informacji jestem w stanie wyliczyć nowe wartości po zderzeniu?
czyli np Ball1 porusza się zgodnie z wektorem Ball1[3, 3] zaś Ball2[-1,2], wiem, że się zderzyły, czego jeszcze potrzebuję, aby wyliczyć nowe wartości tych wektorów?
package pl.animation.ball;
import java.awt.geom.Ellipse2D;
import java.awt.geom.RectangularShape;
public class Ball {
// wielkość kuli
public double ELLIPSE_SIZE = 20.0;
// zmiana prędkości składowej x
private int shiftDx = 4;
// zmiana prędkości składowej y
private int shiftDy = 3;
// aktualne położenie x
private int x;
// aktualne położenie y
private int y;
// czy wektor x ma wartość ujemną (kula porusza się w prawo czy w lewo)
private boolean dx = true;
// czy wektor y ma wartość ujemną (kula porusza się w dół czy w górę)
private boolean dy = true;
// waga
private int weight = 1;
public Ball(int x, int y) {
super();
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public void moveTo(int x, int y) {
this.x = x;
this.y = y;
}
public void moveByParam(int panelWidth, int panelHeight) {
if (dx) {
this.x = this.x + shiftDx;
} else {
this.x = this.x - shiftDx;
}
if (dy) {
this.y = this.y + shiftDy;
} else {
this.y = this.y - shiftDy;
}
if (checkCollisionWithBorder(panelWidth, panelHeight)) {
// tak dla testów
// shiftDy = (new Random().nextInt(10))+1;
}
;
}
private boolean checkCollisionWithBorder(int panelWidth, int panelHeight) {
boolean result = false;
if ((isDx()) && (getX() + 20 >= panelWidth)) {
setDx(false);
result = true;
}
if (!(isDx()) && (getX() < 0)) {
setDx(true);
result = true;
}
if ((isDy()) && (getY() + 20 >= panelHeight)) {
setDy(false);
result = true;
}
if (!(isDy()) && (getY() < 0)) {
setDy(true);
result = true;
}
return result;
}
public boolean isDx() {
return dx;
}
public void setDx(boolean dx) {
this.dx = dx;
}
public boolean isDy() {
return dy;
}
public void setDy(boolean dy) {
this.dy = dy;
}
public RectangularShape getShape() {
return new Ellipse2D.Double((double) x, (double) y, ELLIPSE_SIZE,
ELLIPSE_SIZE);
}
public double getSpeed() {
return Math.sqrt(Math.pow((double) shiftDx, 2.0)
+ Math.pow((double) shiftDy, 2));
}
}