Пишу окно, в котором постоянно должны двигаться круги\квадраты. Показываются только круги\квадраты, но в этом время другие фигуры двигаются.
(вот гит с исходником: https://github.com/Kaper156/MovingFigures)
Я решил дополнить классы стандартных фигур (MovingCircle, MovingSquare) и реализовать в них направление и расчет следующей точки (а также изменение направления при столкновении).
Проблема в следующем: мне пришлось написать два практически идентичных класса (MovingCircle, MovingSquare), которые дополняют Ellipse2d.Double и Rectangle2d.Double соответственно. Как сделать общий для этих двух классов "передвигатель"? Ведь нужные мне координаты и размеры доступны только в последней реализации.
public class MovingSquare extends Rectangle2D.Double implements MovingFigure {
private float angle;
public Color color;
MovingSquare() {
Random r = new Random();
this.width = this.height = r.nextInt(20) + 5;
this.angle = r.nextFloat() * 360;
this.x = width * 3 + r.nextDouble() * (CANVAS_W - width * 6);
this.y = height * 3 + r.nextDouble() * (CANVAS_H - height * 6);
this.color = new Color(r.nextFloat(), r.nextFloat(), r.nextFloat());
}
public void MoveSelf() {
x = x + Math.cos(angle * Math.PI / 180) * SPEED;
y = y + Math.sin(angle * Math.PI / 180) * SPEED;
if (x <= this.width || x >= CANVAS_W - width * 2) {
angle = 180 - angle;
}
if (y <= this.height || y >= CANVAS_H - height * 2) {
angle = 360 - angle;
}
}
}
public class MovingCircle extends Ellipse2D.Double implements MovingFigure {
private float angle;
public Color color;
MovingCircle() {
Random r = new Random();
this.width = this.height = r.nextInt(20) + 5;
this.angle = r.nextFloat() * 360;
this.x = width * 3 + r.nextDouble() * (CANVAS_W - width * 6);
this.y = height * 3 + r.nextDouble() * (CANVAS_H - height * 6);
this.color = new Color(r.nextFloat(), r.nextFloat(), r.nextFloat());
}
public void MoveSelf() {
x = x + Math.cos(angle * Math.PI / 180) * SPEED;
y = y + Math.sin(angle * Math.PI / 180) * SPEED;
//TODO radius
if (x <= this.width || x >= CANVAS_W - width * 2) {
angle = 180 - angle;
}
if (y <= this.height || y >= CANVAS_H - height * 2) {
angle = 360 - angle;
}
}
}
Я бы взглянул в торону генериков бы, и определил базовый класс, с указанием фигуры в виде параметра генерика.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
При запуске сервера jBoss вылетает ошибка:
Есть RESTful API на Nodejs который работает с json файлом
Как нужно настроить менеджер транзакций JtaTransactionManager, чтобы делать распределенные транзакции в разные БД? Ниже привожу полоную конфигурацию,...
Есть два inline-block расположенные горизонтальноУ одго - ширина фиксированная, у другого - задана max-width