Animation auf einem Hintergrundbild

Status
Nicht offen für weitere Antworten.

Marcel_Handball

Bekanntes Mitglied
Hallo zusammen,
ich sitze gerade an einem Projekt und möchte eine Animation auf einem Hintergrundbild laufen lassen.

Theoretisch kein Problem, aber wenn ich es folgendermaßen mache, flackert das bild die ganze zeit, da es ja immer wieder neu gezeichnet wird. (steht ja mit in der paint methode, die ja ununterbrochen aufgerufen wird).

Code:
import java.applet.*;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;


public class gradnetz extends Applet implements Runnable, ActionListener
{   Thread myThread;
    Image bild;
    int y=5;

    public void init()
    {  
        bild = getImage( getDocumentBase(), "hinter.jpg" );
    }

    
    
    public void start(){
        if(myThread==null){myThread=new Thread(this); 
        myThread.start();}
    }
    
    
    public void run(){
        Thread thisThread = Thread.currentThread();
        
        while(myThread == thisThread){
            y++;
        
            repaint();
            try{myThread.sleep(20);}catch(InterruptedException e){}
            if(y==295){stop(); y=5; lauf=false; halt.setLabel("Weiter 1");}
        }
    }
    
    
    public void stop(){
        myThread = null;
    }
    
        
    public void paint(Graphics g){   
            g.drawImage( bild, 0, 0, this ); 
            g.setColor(Color.red);
            g.drawLine(5,y,200,y);               
   }
          
}

Wie kann ich also auf einem Bild zeichnen ohne, dass dieses flackert (kann man ein Hintergrundbild auch außerhalb der paint methode erzeugen? Es soll auf jeden fall nur einmal gezeichnet werden?
Wie kann ich das umsetzen??

Schon im Voraus DANKE für eure Antwort.
Marcel
 
doctus hat gesagt.:
einfacher trick : Doppelpufferung.

Um das Hintergrund bild zu zeichnen, brauchst du ein Graphics-Object. daher muss das in die paint()-methode.

lg doctus

Warum :?: du kannst doch mit meinfenster.getGraphics() dir selbst ein Graphics objekt erzeugen
 
VdA hat gesagt.:
Warum :?: du kannst doch mit meinfenster.getGraphics() dir selbst ein Graphics objekt erzeugen
Kann man, ist aber in 99,9% aller Fälle völlig verkehrt. Warum? Ich erklär das jetzt nicht zum hundertsten mal :?
 
@VdA:

was hast du eigendlich mit deinem getGraphics()?^^

ich hab gerade schon nen thread gesehen, wo wildcard dir gesagt hat, das das nicht die optimale lösung ist.
 
aber warum ist es so schlecht?
Hab in nem malprogramm das angewendet damit wenn der User
mit dem Stift rübermalt sofort zu sehen ist was er gezeichnet hat
und nicht erst nach dem nächsten repaint in x sekunden.
 
muss ja nen tolles malprogramm sein, was meine kunst nach dem nächsten resizen des fensters wieder verwirft :roll:

> und nicht erst nach dem nächsten repaint in x sekunden.
repaint(); ?
 
ich hole mir mit BufferedImage#getGraphics() das Graphics objekt von dem Papier wo man drauf zeichnen kann
und zeichne das dann auf das Fenster mit
Code:
this.getGraphics().drawImage(meinbild, 0, 0);
obwohl mir fällt ein das ich das Programm vllt noch Performanter machen könnte wenn ich das in paintComponent setze
und repaint() immer in mouseDragged() aufrufe mg
aber ersma is mein PC im Arsch und bis der wieder heil is dauert das n bischen :x 🙁

PS: hat mittlerweile was alle funktionen wie in MS Paint und noch ein paar mehr die ich in MS Paint vermisst hab
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben