Mało to semantyczne(logiczne? domenowe? nie wiem jak to nazwać) - czemu masz klasy nazwane Alien_A, Alien_B i Alien_C? Co to ma oznaczać? Czym się różni A od B od C? Zerknąłem w kod, ale te klasy wyglądają prawie identyczne, i część kodu się powtarza (zła praktyka).
No i w rezultacie potrójnie kod piszesz, bo dla każdej klasy piszesz coś takiego:
public LevelBuilder withNumberOfAlien_A(int number) {
level.numberOfAlien_A = number;
return this;
}
public LevelBuilder withNumberOfAlien_B(int number) {
level.numberOfAlien_B = number;
return this;
}
public LevelBuilder withNumberOfAlien_C(int number) {
level.numberOfAlien_C = number;
return this;
}
albo tutaj:
private void moveBackgroundOne() {
// CIACH .............
private void moveBackgroundTwo() {
// IDENTYCZNA FUNKCJA!!!
poczytaj o zasadzie DRY(Don't Repeat Yourself), bo na razie ten kod jest jednym wielkim zlepkiem złych praktyk.
albo "magic numbers":
public void move() {
this.x += 5;
public Rectangle getColisionBox() {
return new Rectangle(x,y,10,10);
dlaczego 5, dlaczego 10?
No i niby obiektówka, ale programujesz de facto strukturalnie, czy jak to nazwać:
private void movePlayerBullets() {
for(int i = 0; i < player.getBullets().size(); i++) {
if(player.getBullets().get(i).isVisible() == true)
player.getBullets().get(i).move();
public void paintAlien(Graphics g) {
for(int i = 0; i < aliens.size(); i++) {
g.drawImage(aliens.get(i).getImage(),aliens.get(i).getPosX(),aliens.get(i).getPosY(),null);
}
}
w OOP raczej byś oddelegował do obiektu player ruszanie bulletami (czyli ta funkcja powinna należeć do obiektu 'player',), i byś zrobił coś w rodzaju metody wirtualnej paint (czyli coś co się nazywa polimorfizm), i obiekty same by się rysowały - bo inaczej wychodzi na to, że równie dobrze mógłbyś użyć zwykłej struktury a nie klasy. (co czasem ma sens, jeśli jest świadomym zabiegiem, np. jeśli robisz ogólny menedżer/ silnik/ renderer który potrzebuje mieć wiedzę o wszystkich obiektach, nawet kosztem enkapsulacji - ale tutaj to wygląda raczej jak nieudolna obiektówka).