Ваши классы не должны использовать Stage в конструкторе. Если бы вы на самом деле использовали его для чего-либо, это создаст двунаправленную связь и код fr agile.
И вам абсолютно не следует загружать текстуру изнутри актера, особенно ту, которая используется другими актерами. , Текстуры - это ресурсы, которые занимают значительную память и процессор при переключении с одного на другое. Когда каждый актер загружает свою собственную копию текстуры, вы тратите впустую память, время загрузки и циклы ЦП во время процесса рисования. Вы также теряете много памяти, не выбрасывая их. Вы должны загрузить одну копию текстуры для всей игры и передать ссылку на текстуру в конструктор вашего актера.
Нет ярлыка для копирования объекта. Вы должны создать либо метод stati c, либо конструктор, который вручную копирует значения каждого свойства в новый экземпляр. И вы должны также скопировать внутренние ссылочные классы, если это уместно.
Таким образом, метод копирования для Laser будет выглядеть примерно так, но вам нужно будет скопировать каждый соответствующий параметр, который он использует:
public Laser copy() {
final Laser laser = new Laser(getX(), getY());
laser.setRotation(getRotation());
laser.setSpeed(getSpeed());
laser.setColor(getColor());
laser.laserMid.setRotation(laserMid.getRotation);
// etc.
return laser;
}
Если вы делаете это с конструкторами , вы можете воспользоваться иерархией, чтобы упростить копирование подклассов. Например:
// BaseActor constructor:
public BaseActor(BaseActor other) {
super();
setX(other.getX());
setY(other.getY());
setColor(other.getColor());
// etc.
}
// Laser constructors:
public Laser(float x, float y) {
super();
init();
}
public Laser(Laser other) {
super(other);
init()
laser.laserMid.setRotation(laserMid.getRotation);
// etc.
}
private void init() {
setSize(30,10);
setMaxSpeed(800);
setBoundaryPolygon(8);
setSpeed(10);
// etc.
}
Кстати, ваше поле color
затеняет поле цвета, которое уже есть у актера.