2D-Grafik Animation flackert

D

Daniel1993

Gast
Sehr geehrte Mitglieder dieses Forums,
ich habe in meiner Schule das Unterrichtsfach programmieren und uns wurde heute
das programmieren von Animationen näher gebracht.

Meine Aufgabe ist es eine flüssige Animation zu programmieren, da meine stark flackert.

Ich habe 3Klassen, welche ich präsentiere und es wäre nett, wenn mir jemand sagt wie ich den Quellcode umschreiben muss, um eine
flüssige Animation zu erhalten.

Klasse 1: Fenster
Java:
import java.awt.event.*;
import java.awt.*;

public class Fenster extends Frame
{
    Man man = new Man ("Planet.png",0,0);
    
    public Fenster()
    {
        this.add(man);
        this.setTitle("Weltraumanimation");
        this.setSize(1280,819);
        this.show();
        this.addWindowListener(new FensterMitXSchliessen());
        
        for (int x = 50; x <= 1000; x++)
        {
            man.setBounds(x,100);
            delay(10);
            man.repaint();
        }
    }
    
    public void delay(int ms)
    {
        try
        {
            Thread.currentThread().sleep(10);
        }
        catch (InterruptedException e)
        {}
    }
    
    public static void main (String[] args)
    {
        Fenster f = new Fenster();
    }
}

Klasse 2: Man
Java:
 import java.awt.*;

public class Man extends Canvas
{
    private Image image;
    int xPos, yPos;
    
    public Man(String imagePath, int x, int y)
    {
        image = loadImage (imagePath);
        xPos = x;
        yPos = y;
        setBackground(Color.blue);
    }
    
    public void paint (Graphics g)
    {
        Image Weltall = Toolkit.getDefaultToolkit().getImage("Weltall.jpg");
        g.drawImage(Weltall,0,0,this);
        g.drawImage(image, xPos, yPos, null);
    }
    
    public void setBounds(int x, int y)
    {
        xPos = x;
        yPos = y;
    }
    
    public Image loadImage (String imagePath)
    {
        Image image = Toolkit.getDefaultToolkit().getImage(imagePath);
        return image;
    }
}

Klasse 3: Fenster mit X Schließen
Java:
 import java.awt.event.*;
public class FensterMitXSchliessen extends WindowAdapter
{
    public void windowClosing(WindowEvent e)
    {
        System.exit(0);
    }
}

Als Editor nutze ich BlueJ

Ich würde mich gerne über Hilfe freuen

mfg Daniel
 

Michael...

Top Contributor
und uns wurde heute
das programmieren von Animationen näher gebracht.
Hat man da auch das Thema Threads und EDT erwähnt? Sollte man diesbzgl. kennen.

Ansonsten sollte in der
Code:
paint(Graphics g)
möglichst nur gezeichnet und schon gar keine Bilder geladen werden. Zumal es grundsätzlich unsinnig ist ein Bild immer wieder neu zu laden.
 
D

Daniel1993

Gast
Also das Weltall Bild wird als Hintergrund geladen und uns wurde nicht gesagt wo man es sonst einbinden kann.
Leider wurden uns Threads sowie EDT nicht gelehrt.
Jedoch bin ich für weiterbildung offen.

Wie sollte ich denn das Bild Planet.png einbinden, um es nicht immer wieder neu zu laden?

Uns wurde das so beigebracht: Bild laden, löschen, laden ,löschen bis zum endpunkt
(Wie ein Daumenkino)
 

Marco13

Top Contributor
Stichworte AWT und DoubleBuffering, verwende statt AWT (Frame, Canvas) lieber Swing (JFrame, JComponent - dort dann paintComponent überschreiben), Swing ist automatisch double buffered...
 
D

Daniel1993

Gast
Wird dadurch das flackern behoben?

Wenn ja könntest du mir kurz erklären was ich bei swing anderst schreiben muss als bei awt oder ob sich nur die Bibliothek sowie
die Klasseneröffnung ändert?
 
D

Daniel1993

Gast
Habe swing benutzt und nun folgen Fehlermeldung: cannot find symbol - class Image

Quellcode:

Java:
import javax.swing.*;

public class Man extends JComponent
{
    private Image image;
    int xPos, yPos;
    
    public Man(String imagePath, int x, int y)
    {
        image = loadImage (imagePath);
        xPos = x;
        yPos = y;
        setBackground(Color.blue);
    }
    
    public void paint (Graphics g)
    {
        Image Weltall = Toolkit.getDefaultToolkit().getImage("Weltall.jpg");
        g.drawImage(Weltall,0,0,this);
        g.drawImage(image, xPos, yPos, null);
    }
    
    public void setBounds(int x, int y)
    {
        xPos = x;
        yPos = y;
    }
    
    public Image loadImage (String imagePath)
    {
        Image image = Toolkit.getDefaultToolkit().getImage(imagePath);
        return image;
    }
}
 

Michael...

Top Contributor
Habe swing benutzt und nun folgen Fehlermeldung: cannot find symbol - class Image
Es fehlt ein
Code:
import java.awt.Image;
Wie sollte ich denn das Bild Planet.png einbinden, um es nicht immer wieder neu zu laden?
Es geht nicht um das Planetenbild, das Vorgehen passt ja. Es geht um das Weltall.jpg. Das solltest Du nur einmalig im Konstruktor der Klasse laden - genauso wie Planet.png
 

Marco13

Top Contributor
Man darf nach wie vor
import java.awt.*;
schreiben, es geht nur um alles, was von "Component" erbt, also nicht Button, Label, Frame, sondern JButton, JLabel, JFrame verwenden - und man muss paintComponent statt paint überschreiben:
Java:
public class Man extends JComponent
{
    ...
    @Override
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);

        // BOGUS:
        Image Weltall = Toolkit.getDefaultToolkit().getImage("Weltall.jpg");
        g.drawImage(Weltall,0,0,this);
        g.drawImage(image, xPos, yPos, null);
    }
Bei jedem Neuzeichnen das Bild neu zu laden ist übrigens Unfug, wie schon gesagt wurde... glaub's oder glaub's nicht.

Und wichtig: Die Methode
Java:
/*
    public void setBounds(int x, int y)
    {
        xPos = x;
        yPos = y;
    }
*/
undbedingt umbennenen, auf jeden Fall nicht so implementieren: setBounds ist schon eine Methode in Component, d.h. dort überschreibst du die Original-setBounds-Methode - das kann einen Huafen Probleme verursachen!
 

L-ectron-X

Gesperrter Benutzer
Zusammengefasst so in etwa:
Java:
import java.io.*;
import java.awt.*;
import javax.swing.*;
import javax.imageio.*;

public class SpacePanel extends JPanel
{
    private Image spaceImage, planetImage;
    private int xPos, yPos;

    public SpacePanel(String imagePath, int x, int y)
    {
        spaceImage = loadImage("Weltall.jpg");
        planetImage = loadImage(imagePath);
        xPos = x;
        yPos = y;
        setBackground(Color.blue);
    }

    public void movePlanet(int x, int y)
    {
        xPos = x;
        yPos = y;
        repaint();
    }

    private Image loadImage(String imagePath)
    {
        try {
          return ImageIO.read(new File(imagePath));
        }
        catch(IOException e) {
          JOptionPane.showInternalMessageDialog(this,
          "Eine Grafikdatei konnte nicht geladen werden!",
          "IOException",
          JOptionPane.ERROR_MESSAGE);
        }
        return null;
    }

    @Override
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        if(spaceImage != null && planetImage != null) {
            g.drawImage(spaceImage, 0, 0, this);
            g.drawImage(planetImage, xPos, yPos, this);
        }

    }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Animation läuft nicht korrekt AWT, Swing, JavaFX & SWT 8
Ernesto95 JavaFX Return Value nach Beendigung einer Animation AWT, Swing, JavaFX & SWT 15
H Simple Animation mit Swing AWT, Swing, JavaFX & SWT 2
DeBoiJoshua 2D-Grafik Gif Animation will nicht laden AWT, Swing, JavaFX & SWT 1
S JavaFX WebView zeigt keine Animation AWT, Swing, JavaFX & SWT 5
E showAndWait is not allowed during animation or layout processing Memory FX AWT, Swing, JavaFX & SWT 2
A 2D-Grafik Ruckelfreie Animation AWT, Swing, JavaFX & SWT 20
L JavaFX Animation, erst zeichnen dann anzeigen AWT, Swing, JavaFX & SWT 4
L JavaFX Animation für Panel wechsel AWT, Swing, JavaFX & SWT 3
J Java FX Koordinaten NACH Animation setzen, wie? AWT, Swing, JavaFX & SWT 9
Pr0m3theus Animation nach Event AWT, Swing, JavaFX & SWT 6
F JavaFX Timeline Animation soll X- und Y-Position während Animation ändern AWT, Swing, JavaFX & SWT 2
javampir 2D-Grafik Effizienz bei animation AWT, Swing, JavaFX & SWT 0
C Pixel-Rendering/Animation Performance in BufferedImage AWT, Swing, JavaFX & SWT 1
wolfgang63 JavaFX Animation, Kreise im vorgegebem Takt durchs Fenster laufen lassen AWT, Swing, JavaFX & SWT 3
P Ansatz für 2D Animation gesucht AWT, Swing, JavaFX & SWT 2
Thallius HHübsche Kopier Animation? AWT, Swing, JavaFX & SWT 5
L JPanel kleine "Animation" AWT, Swing, JavaFX & SWT 7
E Animation läuft nicht mehr flüssig AWT, Swing, JavaFX & SWT 8
E Warum macht die einfache Animation einen kleinen Fehler? AWT, Swing, JavaFX & SWT 14
B 2D-Grafik Dynamisches Erstellen von Images und deren Animation AWT, Swing, JavaFX & SWT 4
R Swing Komponenten bleiben bei Animation unsichtbar AWT, Swing, JavaFX & SWT 7
J GIF Animation AWT, Swing, JavaFX & SWT 2
B Swing Thread+Animation AWT, Swing, JavaFX & SWT 7
R Swing Animation mit JLayeredPane? AWT, Swing, JavaFX & SWT 8
K 3D-Grafik Animation AWT, Swing, JavaFX & SWT 4
U Gif Animation mit JLabel AWT, Swing, JavaFX & SWT 3
P KeyListener + Animation AWT, Swing, JavaFX & SWT 2
R Polygon-Animation mit Darstellungsfehlern AWT, Swing, JavaFX & SWT 5
StupidAttack Animation, JComponent AWT, Swing, JavaFX & SWT 3
S SWT Rudimentäre Bild Animation AWT, Swing, JavaFX & SWT 3
C Animation auf einem JPanel AWT, Swing, JavaFX & SWT 3
A paintComponent() - Animation AWT, Swing, JavaFX & SWT 2
S Ich brauche eine Idee: Animation mit teil eines Bildes AWT, Swing, JavaFX & SWT 16
H "Animation" AWT, Swing, JavaFX & SWT 2
S Animation korrekt darstellen AWT, Swing, JavaFX & SWT 8
Developer_X Nach Animation Button adden AWT, Swing, JavaFX & SWT 3
Developer_X Swing JPanel-THE ANIMATION AWT, Swing, JavaFX & SWT 3
T JFrame und Scale-Animation AWT, Swing, JavaFX & SWT 8
M Animation berechnen AWT, Swing, JavaFX & SWT 4
M Animation auf JPanel per Knopfdruck AWT, Swing, JavaFX & SWT 12
P Problem bei Animation AWT, Swing, JavaFX & SWT 2
K Animation auf GUI AWT, Swing, JavaFX & SWT 3
R ruckelfreie animation AWT, Swing, JavaFX & SWT 8
T Animation will nicht trotz Thread. AWT, Swing, JavaFX & SWT 14
S animation Flackern trotz doppelpufferung wieso? AWT, Swing, JavaFX & SWT 2
S Animation geht nicht AWT, Swing, JavaFX & SWT 3
m@nu Animation in GlassPane: Performanceeinbruch JFrame maximiert AWT, Swing, JavaFX & SWT 17
rudi.schraml Animation von Robotern auf FactoryFloor - repaint()? AWT, Swing, JavaFX & SWT 7
J Animation - Runnable AWT, Swing, JavaFX & SWT 3
O Animation in einem JPanel AWT, Swing, JavaFX & SWT 2
H Animation startet nicht/ Thread AWT, Swing, JavaFX & SWT 6
N Animation nach einem bestimmten Ereignis starten lassen? AWT, Swing, JavaFX & SWT 4
A Problem mit Animation AWT, Swing, JavaFX & SWT 4
M Animation mit Keylistener AWT, Swing, JavaFX & SWT 2
D JavaFX Label flackert beim aktualisieren AWT, Swing, JavaFX & SWT 12
Damtonix BufferStrategy flackert (Swing) AWT, Swing, JavaFX & SWT 9
M Warum flackert das Bild ? (Swing) AWT, Swing, JavaFX & SWT 16
frankred Swing Eigener ListCellRenderer D'n'D "MOVE" - Mauszeiger flackert AWT, Swing, JavaFX & SWT 14
T Swing OpenOffice IFrame flackert beim ändern der Größe AWT, Swing, JavaFX & SWT 6
K Swing Spiel flackert sehr häufig AWT, Swing, JavaFX & SWT 2
J Applet Tetris flackert AWT, Swing, JavaFX & SWT 9
J Swing JWindow flackert trotz Doppelpufferung AWT, Swing, JavaFX & SWT 2
B Swing JButton flackert trotz DoubleBufferings AWT, Swing, JavaFX & SWT 11
J Swing JEditorPane flackert AWT, Swing, JavaFX & SWT 2
H Swing JWindow flackert beim resizen AWT, Swing, JavaFX & SWT 6
Dragonfire ZoomImage flackert -> Fehler: repaint-Aufruf [gelöst] AWT, Swing, JavaFX & SWT 5
P Image auf JPanel flackert AWT, Swing, JavaFX & SWT 3
M DragAndDrop-Waypoints bewegen, ABER Bildschirm flackert AWT, Swing, JavaFX & SWT 3
B JPanel#paintComponent(Graphics g) << flackert oO AWT, Swing, JavaFX & SWT 3
J JProgressBar flackert AWT, Swing, JavaFX & SWT 14
C JScrollPane flackert AWT, Swing, JavaFX & SWT 10
F JScrollPane ruckelt/flackert AWT, Swing, JavaFX & SWT 5
S [Swing] Tabelle flackert AWT, Swing, JavaFX & SWT 8

Ähnliche Java Themen

Neue Themen


Oben