2D-Grafik repaint()-Aufruf. Und nichts geschieht.

StephanL

Mitglied
Hi,

ich arbeite mich, wie ich bereits in einem anderen Thread geschrieben habe, gerade in AWT und Swing ein und versuche ein kleines Spiel zu programmieren. Leider stehe ich schon wieder vor einem Problem, das könnte in nächster Zeit wohl häufiger vorkommen...

Ich habe bereits ein grafisches Spielfeld (16*16 Felder) aufgebaut, die Spielfigur gezeichnet und den KeyListener programmiert, sodass die Figur sich auf bestimmten Elementen bewegen kann, zu anderen jedoch keinen Zutritt hat. Es funktioniert eigentlich auch alles wunderbar, das Spielfeld wird gezeichnet, der KeyListener berechnet die richtigen Koordinaten bei Tastendruck etc. Leider bleibt die Spielfigur aber, wenn sie sich eigentlich bewegen sollte, an ihrer Position stehen.

Die Funktion repaint() müsste an der Stelle, an der ich sie stehen habe, eigentlich aufgerufen werden (ich habe es mit einem System.out.println() an derselben Stelle getestet). Trotzdem bleibt das Bild unverändert. Woran kann das liegen? Bzw. was genau macht die Funktion repaint eigentlich? Die Figur wird mit Hilfe von drawPlayer() gezeichnet, was wiederum über paintComponent() aufgerufen wird. Müsste repaint() drawComponent() nicht neu auslösen?

Vielleicht kann mir hier jemand weiterhelfen, würde mich sehr freuen.

Gruß
Stephan
 
Zuletzt bearbeitet:

StephanL

Mitglied
Hi,

okay, danke, dann weiß ich gerade echt nicht weiter :noe:

Ich wollte euch zunächst meinen Kraut- und Rüben-Quellcode ersparen, ich poste mal ein paar wichtige Ausschnitte hier.

Aus der Klasse KeyIn:
Java:
@Override
    public void keyPressed(KeyEvent e) {
        int key = e.getKeyCode();

        if (ingame) {
            if (e.getKeyCode() == KeyEvent.VK_LEFT && Board.se[(KeyIn.playerPosX-blocksize)/blocksize][(KeyIn.playerPosY)/blocksize] instanceof Boden) {
                KeyIn.playerPosX -= blocksize;
            }
            if (key == KeyEvent.VK_RIGHT && Board.se[(KeyIn.playerPosX+blocksize)/blocksize][(KeyIn.playerPosY)/blocksize] instanceof Boden) {
                KeyIn.playerPosX += blocksize;
            }
            if (key == KeyEvent.VK_DOWN && Board.se[(KeyIn.playerPosX)/blocksize][(KeyIn.playerPosY+blocksize)/blocksize] instanceof Boden) {
                KeyIn.playerPosY += blocksize;
            }
            if (key == KeyEvent.VK_UP && Board.se[(KeyIn.playerPosX)/blocksize][(KeyIn.playerPosY-blocksize)/blocksize] instanceof Boden) {
                KeyIn.playerPosY -= blocksize;
            } else {
                KeyIn.playerPosX += 0;
                KeyIn.playerPosY += 0;
            }
            System.out.println(KeyIn.getPlayerPosX() + ", " + KeyIn.getPlayerPosY());
        }
        this.repaint();
    }
Hier wird unten die Repaint-Methode aufgerufen. Der KeyListener ansich funktioniert perfekt.

Auszüge der Klasse Board
Java:
// Konstruktor
public Board() {
        setDimensionD();
        
        this.addKeyListener(new KeyIn());
        
        setFocusable(true);
        
        setBackground(Color.BLACK);
        setDoubleBuffered(true);
}

@Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        doDrawing(g);
    }

private void doDrawing(Graphics g) {
        Graphics2D g2d = (Graphics2D) g;
        
        g2d.setColor(Color.BLACK);
        g2d.fillRect(0,0,d.width, d.height);
        
        drawMap(g2d);
        
        if (ingame) {
            playGame(g2d);
        } else {
            
        }
        
        g2d.drawImage(img, 5, 5, this);
        Toolkit.getDefaultToolkit().sync();
        g2d.dispose();
    }


private void playGame(Graphics2D g2d) {
        if(dying) {
            //death();
        } else {
            drawPlayer(g2d);
        }
    }

private void drawPlayer(Graphics2D g2d) {
        g2d.drawImage(ImageLoader.getImage("spieler"), KeyIn.getPlayerPosX(), KeyIn.getPlayerPosY(), this);
    }
Wie gesagt wird alles korrekt gezeichnet, aber bei Bewegung der Spielfigur (betätigen einer Pfeiltaste), ändern sich zwar die KeyIn.playerPos[X,Y]-Variablen (mittels Konsolenausgabe geprüft), jedoch nicht die bildliche Ausgabe.

Hier noch die Hauptklasse Spiel mit Main-Methode
Java:
public Spiel() {
        InitUI();
    }
    
    private void InitUI() {
        add(new Board());
        Board b = new Board();
        KeyIn keys = new KeyIn();
        b.addKeyListener(keys);
        setTitle("Adventurer");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(620,620);
        setLocationRelativeTo(null);
        setVisible(true);
    }
    
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                Spiel spiel= new Spiel();
                spiel.setVisible(true);
            }
        });
    }

Wahrscheinlich ist es irgendwas ganz simples, aber ich bin blutiger Anfänger, daher komme ich einfach nicht drauf....

Gruß
Stephan
 

franky27

Bekanntes Mitglied
Hm ich finds übertrieben unübersichtlich mit den ganzen draw Methoden. Ich verstehe nicht ganz wieso du this.repaint in der KeyIn Klasse aufrufst, den Zusammenhang zu blicken ist aber mit den Auszügen auch schwer. Normalerweise rufst du repaint in deiner Component Klasse auf. Also in deiner KeyIn Klasse setzt du die x/y positionen, fertig. Repaint rufst du dann in deiner drawPlayer Methode auf.
 

StephanL

Mitglied
Ich fürchte, wenn ich den gesamten Code poste, wird es erstrecht unübersichtlich. Man könnte mich als Code-Messi bezeichnen, daran sollte ich arbeiten. Ich danke dir trotzdem schon mal für deine Mühen, ich werde mich morgen noch einmal daran versuchen.

Warum der Aufruf im KeyListener? So wurde es uns in der Uni beigebracht. Ich habe es so gedeutet, dass man das macht, weil dadurch jedes Mal zu einem repaint() aufgerufen wird, wenn ein Tastendruck ausgeübt wird, also eine Bewegung beabsichtigt ist.
 

Harry Kane

Top Contributor
Ein Klassiker: du hast zwei Instanzen von Board. Die erste ist anonym und wird der Klasse Spiel hinzugefügt (add(new Board())), auf der zweiten (Board b = new Board();) registrierst du die KeyListener.
Zu deinem restlichen Code sag ich mal nix.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
Ernesto95 AnimationLoop - Problem bei Aufruf von repaint AWT, Swing, JavaFX & SWT 6
P EDT Problem? Kein Aufruf der repaint Methode AWT, Swing, JavaFX & SWT 6
JFeel-x repaint für Aufruf von paintComponent-Klasse ungeeignet? AWT, Swing, JavaFX & SWT 11
Dragonfire ZoomImage flackert -> Fehler: repaint-Aufruf [gelöst] AWT, Swing, JavaFX & SWT 5
P AWT: Expliziter repaint-Aufruf AWT, Swing, JavaFX & SWT 2
D Repaint Funktioniert nicht AWT, Swing, JavaFX & SWT 2
D JUNG Repaint function does not work AWT, Swing, JavaFX & SWT 2
E repaint Probleme AWT, Swing, JavaFX & SWT 13
G listener repaint() - verschiedene Darstellung AWT, Swing, JavaFX & SWT 24
ExceptionOfExpectation Textdarstellung auf einem Canvas mit Hilfe von repaint(); AWT, Swing, JavaFX & SWT 6
J actionperformed wird nicht aufgerufen/ repaint() AWT, Swing, JavaFX & SWT 6
L Swing repaint() ruft paintComponent(g1d) nicht auf AWT, Swing, JavaFX & SWT 12
G Repaint wird nicht durchgeführt AWT, Swing, JavaFX & SWT 8
I Swing Verhindern, dass repaint() kaskadiert AWT, Swing, JavaFX & SWT 6
ms_cikar Update swingUtilities Repaint in der Schleife AWT, Swing, JavaFX & SWT 3
T Swing Probleme mit repaint() bzw. JScrollPane AWT, Swing, JavaFX & SWT 7
N Swing JButtons werden nach repaint() doppelt dargestellt AWT, Swing, JavaFX & SWT 12
K Methode repaint() AWT, Swing, JavaFX & SWT 1
B Swing Wann brauche ich repaint() ? AWT, Swing, JavaFX & SWT 1
javampir Swing repaint in JavaFX Anwendung AWT, Swing, JavaFX & SWT 3
A repaint(); AWT, Swing, JavaFX & SWT 9
J Swing ungewünschter Nebeneffekt bei der repaint() Methode AWT, Swing, JavaFX & SWT 3
A Problem: repaint() - Schleife AWT, Swing, JavaFX & SWT 3
Joew0815 JDialog repaint() funktioniert nicht wie gewünscht. AWT, Swing, JavaFX & SWT 2
P JPanel und Repaint AWT, Swing, JavaFX & SWT 5
J JavaFX Automatisches Neuzeichnen ("Repaint") abstellen. AWT, Swing, JavaFX & SWT 10
F JTable Repaint Issue AWT, Swing, JavaFX & SWT 1
N Observer: update ruft nicht repaint auf AWT, Swing, JavaFX & SWT 0
C Repaint() funktioniert nicht in TabbedPanel AWT, Swing, JavaFX & SWT 5
S JList repaint AWT, Swing, JavaFX & SWT 1
L NullpointerException und Probleme mit repaint() AWT, Swing, JavaFX & SWT 11
M Repaint mittels Button richtig aufrufen klappt nicht AWT, Swing, JavaFX & SWT 1
B Repaint auf JFrame, JLabel und ImageIcon AWT, Swing, JavaFX & SWT 4
K 2D-Grafik Paint - Wie binde ich repaint ein? AWT, Swing, JavaFX & SWT 8
D repaint() klappt anders als vorgestellt AWT, Swing, JavaFX & SWT 15
R Repaint() in Schleifen, Threads AWT, Swing, JavaFX & SWT 13
B Swing Repaint Problem - mal wieder AWT, Swing, JavaFX & SWT 5
P 2D-Grafik Gezielter Repaint einzelner Frames in Java-Game AWT, Swing, JavaFX & SWT 6
javampir Bei repaint nix los AWT, Swing, JavaFX & SWT 2
B Swing repaint() AWT, Swing, JavaFX & SWT 3
P 2D-Grafik repaint(); steigender RAM Verbauch AWT, Swing, JavaFX & SWT 6
Y KeyListener, GUI Thread, repaint AWT, Swing, JavaFX & SWT 7
S Applet Repaint AWT, Swing, JavaFX & SWT 3
M Programm hängt sich auf nachdem repaint() benutzt wurde AWT, Swing, JavaFX & SWT 2
R Swing Grafikfehler bei repaint AWT, Swing, JavaFX & SWT 2
N repaint() blockieren AWT, Swing, JavaFX & SWT 6
K canvas zeig nach repaint nichts an AWT, Swing, JavaFX & SWT 8
M Repaint() AWT, Swing, JavaFX & SWT 14
J Swing repaint, repaint, repaint AWT, Swing, JavaFX & SWT 8
M Applet repaint() verlangsamen AWT, Swing, JavaFX & SWT 7
R paintComponent malt bei repaint() Rahmen um Panel AWT, Swing, JavaFX & SWT 7
V Applet JApplet Flackern durch Repaint AWT, Swing, JavaFX & SWT 11
kodela Problem mit repaint() AWT, Swing, JavaFX & SWT 3
N Swing Funktion repaint() updated nicht AWT, Swing, JavaFX & SWT 5
F repaint reagiert nicht AWT, Swing, JavaFX & SWT 8
S AWT Probleme mit repaint() AWT, Swing, JavaFX & SWT 2
D Repaint()? Oder was??? AWT, Swing, JavaFX & SWT 5
M Eine nicht korrekte Darstellung bei repaint() warum? AWT, Swing, JavaFX & SWT 4
T 2D-Grafik Kreis "von Hand" zeichnen -> jedesmal repaint()? AWT, Swing, JavaFX & SWT 6
R validate(), repaint funktionieren nicht! AWT, Swing, JavaFX & SWT 7
B AWT Canvas überdeckt nach repaint() JComboBox-Optionen AWT, Swing, JavaFX & SWT 2
B Swing verschachteltes GUI: repaint() ändert mehr als nur gewünschte Component AWT, Swing, JavaFX & SWT 4
S validate(), invalidate(), repaint(),... Was kommt wann? AWT, Swing, JavaFX & SWT 5
M 2D-Grafik repaint() löscht altes Bild nicht AWT, Swing, JavaFX & SWT 2
J repaint() nicht richtig? AWT, Swing, JavaFX & SWT 6
R repaint erzwingen AWT, Swing, JavaFX & SWT 3
Zettelkasten repaint() von anderen Klassen aufrufen AWT, Swing, JavaFX & SWT 4
H repaint()-Problem - 50% CPU-Auslastung AWT, Swing, JavaFX & SWT 4
P repaint während Thread läuft AWT, Swing, JavaFX & SWT 9
D Repaint Frage, Design Frage AWT, Swing, JavaFX & SWT 2
N Swing MainWindow(JFrame) aktualisieren(neuzeichnen) repaint AWT, Swing, JavaFX & SWT 4
T repaint() Problem AWT, Swing, JavaFX & SWT 2
A 2D-Grafik Repaint - Alternative? AWT, Swing, JavaFX & SWT 3
C JLabel, JTextArea, JScrollPane. repaint(); ? AWT, Swing, JavaFX & SWT 6
N Swing repaint() funktioniert nicht AWT, Swing, JavaFX & SWT 5
T Swing repaint funktioniert nur manchmal? AWT, Swing, JavaFX & SWT 6
K Jpanel repaint problem (Fullscreen) AWT, Swing, JavaFX & SWT 5
V Swing Bei repaint() tut sich nichts AWT, Swing, JavaFX & SWT 7
G ColorReader, bei Fadenkreuz zeichnen mit repaint() flackern AWT, Swing, JavaFX & SWT 19
I Canvas Repaint Probleme AWT, Swing, JavaFX & SWT 2
D Swing Actionlistener verhindert repaint?! AWT, Swing, JavaFX & SWT 2
S JLabel repaint AWT, Swing, JavaFX & SWT 8
C Swing Linux mag mein Swing-repaint() nicht... AWT, Swing, JavaFX & SWT 7
J Swing paintComponent() - repaint() - BufferedImage anzeigen AWT, Swing, JavaFX & SWT 5
Luk10 repaint() auch in anderen Klassen! AWT, Swing, JavaFX & SWT 6
A repaint() zu langsam, bitte um alternativen AWT, Swing, JavaFX & SWT 5
T Überlappende Transparenz und repaint() AWT, Swing, JavaFX & SWT 10
E EINFACHE Verständnisfrage zu repaint(), paintComponent(), usw. AWT, Swing, JavaFX & SWT 16
O Girdbag Formatierung nach repaint verloren AWT, Swing, JavaFX & SWT 2
E Swing - repaint() AWT, Swing, JavaFX & SWT 6
T Image wird nicht angezeigt?! - MediaTracker/repaint AWT, Swing, JavaFX & SWT 9
E AWT Problem mit Repaint (in Loop oder Timer) AWT, Swing, JavaFX & SWT 3
O Exception bei repaint AWT, Swing, JavaFX & SWT 3
D Fragen zu Swing, paintComponent() und repaint AWT, Swing, JavaFX & SWT 6
Dit_ Zeilenmarkierung verschwindet nach repaint() AWT, Swing, JavaFX & SWT 12
A Swing Infinite repaint loop unterbrechen AWT, Swing, JavaFX & SWT 7
hdi Swing EDT macht kein repaint() AWT, Swing, JavaFX & SWT 2
F "Verrutschen" von Komponenten bei repaint() AWT, Swing, JavaFX & SWT 9
Junker Fensterinhalt vor ausführen von repaint komplett löschen. AWT, Swing, JavaFX & SWT 2
T Fenster wird trotz repaint() und revalidate() nicht sofort neu gezeichnet AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Neue Themen


Oben