Ich weiß nicht, wie ich meinen Code richtig designen soll und komme nicht weiter

nik.stffrs

Mitglied
Hallo,
Nach nun endlosen Versuchen komme ich trotzdem nicht dahin wo ich hin möchte. Ich bin momentan dabei ein kleines Spiel zu programmieren, jedoch weiß ich nicht wie ich dieses richtig designen soll. Im Internet bin ich auch noch nicht viel weiter gekommen und deswegen frage ich jetzt hier. Also, Ich habe eine GameMain Klasse:

Java:
public class GameMain {

public GameMain() {
    new GameFrame();
}

}

Diese ruft die Klasse GameFrame auf:
Java:
public class GameFrame extends JFrame {

public GameFrame() {
    new GameLabel(this);
}

}

Diese ruft wiederum die Klasse GameLabel auf:
Java:
public class GameLabel extends JLabel {

private GameFrame gameFrame;

public GameLabel(GameFrame gameFrame) {

}
@Override
public void paintComponent(Graphics g) {

}
}

Jetzt habe ich eine Player Klasse von der ich ein Objekt zeichnen lassen möchte:
Java:
public class Player {

public Player() {

}

public void paintPlayer(Graphics g) {

}

}

Jetzt ist mein Problem, dass ich die Verlinkung der beiden Klassen nicht richtig hinbekomme. Ich hatte vorher folgendes Modell:
Java:
public class GameMain {

private GameFrame frame;
private GameLabel label;
private Player player;

public GameMain() {
    frame = new GameFrame(this);
    label = new GameLabel(this, frame);
    player = new Player(this);
}
public GameFrame getFrame() {
    return frame;
}

public GameLabel getLabel() {
    return label;
}

public Player getPlayer() {
    return player;
}

}
und hatte dann dementsprechend meine GameLabel Klasse:
Java:
ublic class GameLabel extends JLabel {

private GameMain main;

public GameLabel(GameMain main) {
    this.main = main;
}
@Override
public void paintComponent(Graphics g) {
    main.getPlayer().paintPlayer(g);
}
}
Allerdings wurde mir gesagt, dass es so wie Ich es gemacht habe kein guter Stil ist. So wie ich es verstanden habe, gebe ich den einzelnen Klassen zu viel Sichtbarkeit untereinander. Nun weiß ich jedoch nicht, wie ich dann meinen Player zeichnen soll. Irgendwie muss dieser ja auf mein Label kommen.

Vielen Dank für eure Antworten!
 
Mal ganz allgemein zu Swing:
  1. So lange Du eine Komponente nicht um Funktionalität erweiterst, brauchst Du keine Vererbung. Das gilt insbesondere für JFrame.
  2. Du musst Komponenten den jeweiligen Containern hinzufügen (Methode add())
Allerdings wurde mir gesagt, dass es so wie Ich es gemacht habe kein guter Stil ist.
Das war aber sehr freundlich formuliert 😉 Du hast jetzt eine wunderbare zirkuläre Abhängigkeit: GameMain ist von GameLabel abhängig und umgekehrt.

Der Bezeichner GameLabel ist auch nicht glücklich gewählt. Man könnte damit ja alles mögliche verbinden, aber doch nicht, dass irgendwelche Spieler gezeichnet werden sollen.

Was für eine Art Spiel soll das denn werden? Was soll GameLabel denn nun eigentlich sein?
 
Mal ganz allgemein zu Swing:
  1. So lange Du eine Komponente nicht um Funktionalität erweiterst, brauchst Du keine Vererbung. Das gilt insbesondere für JFrame.
  2. Du musst Komponenten den jeweiligen Containern hinzufügen (Methode add())

Das war aber sehr freundlich formuliert 😉 Du hast jetzt eine wunderbare zirkuläre Abhängigkeit: GameMain ist von GameLabel abhängig und umgekehrt.

Der Bezeichner GameLabel ist auch nicht glücklich gewählt. Man könnte damit ja alles mögliche verbinden, aber doch nicht, dass irgendwelche Spieler gezeichnet werden sollen.

Was für eine Art Spiel soll das denn werden? Was soll GameLabel denn nun eigentlich sein?
Erstmal vielen Dank für die Antwort,
Es soll so ein kleines Tile Game werden. Ich dachte mir in der Klasse GameMain programmiere ich sozusagen den Haupt Timer, der alles immer wieder updatet. Die Klasse GameLabel sollte dazu genutzt werden den ganzen Spaß dann zu zeichnen. Also nicht nur den Spieler, sondern auch Hintergrund und Weiteres. Die GameLabel Klasse soll dann sozusagen immer die verschiedenen game states abfragen (damit meine ich sowas wie im Hauptmenü oder Im Spiel) und auf Basis dieser States das Spiel zeichnen. Ich hoffe das war jetzt verständlicher ausgedrückt. Wie man wahrscheinlich merkt ist dieses Spiel das Erste, welches ich komplett selber programmiere. Ich hatte vorher schon mit Hilfe von Youtube ein kleines Spiel programmiert, in welchem alles statisch geschrieben wurde (Es gab eine Klasse Var die alle möglichen Werte des Spiels in statischen Variablen gehalten hat. Das hat auch super funktioniert und man könnte schön von überall aus auf die Variablen zugreifen, aber dann hab ich erfahren, dass diese Vorgehensweise wohl nicht so super ist ;D).
 
Es soll so ein kleines Tile Game werden.
Ok. Du solltest das Spiel erstmal ohne UI modellieren. Das UI ist nur zur Interaktion mit dem Benutzer da.

Die GameLabel Klasse soll dann sozusagen immer die verschiedenen game states abfragen (damit meine ich sowas wie im Hauptmenü oder Im Spiel) und auf Basis dieser States das Spiel zeichnen.

Menü und Spielfeld in einer Komponente? Das ist keine gute Idee. Mach eigene Komponenten daraus und verwende im JFrame ein CardLayout, dann kannst Du hin und her schalten und hast die Teile voneinander getrennt.

Zurück zum GameLabel (evtl. wäre Matchfield passender?) und Player:
Java:
public class GameLabel extends JLabel {
    private Player player;
    public GameLabel(Player player) {
        this.player = player;
    }

    @Override
    protected void paintComponent(Graphics g) {
        player.paint(g);
    }
}
Das wäre eine Möglichkeit. Wie kommt das Ding in einen Frame?

Java:
public class Game {
    public void start() {
        Player player = new Player();
        GameLabel label = new GameLabel(player);
        JFrame frame = new JFrame();
        ...
        frame.add(label);
        frame.setVisible(true);
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new Game().start());
    }
}

Ich hatte vorher schon mit Hilfe von Youtube ein kleines Spiel programmiert, in welchem alles statisch geschrieben wurde
🙁
 

Zurück
Oben