Möglichkeiten um eine einfache Animation darzustellen

kingpommes

Mitglied
Guten Tag liebe Community,
Habe mich vor ein paar Tagen ein wenig ins GUI eingearbeitet.
Bin nun dabei ein kleines Spiel für einen Geldspielautomaten zu basteln.

Ich möchte nun noch gerne eine Animation einarbeiten, in welcher es so aussieht als ob die Symbole von oben nach unten Rollen, wie auf einer Rolle eben. Als erstes hatte ich die Idee einfach für jedes Symbol ein gif zu erstellen, in welchem das Bild einmal von oben nach unten durchläuft. Das Problem war jedoch dann sobald ich schnell ein gif an das nächste hängen wollte, es anscheinend nicht schnell genug lädt und es somit nicht richtig angezeigt wird, bzw manchmal auch garnicht.
Ich tendiere deshalb darauf, dass es nicht schnell genug laden kann.
private Icon polizeiV;
private Icon tipV;

im Konstruktor:
polizeiV=new ImageIcon(getClass().getResource("polizeiV.gif"));
nieteV=new ImageIcon(getClass().getResource("nieteV.gif"));

und dann lass ich es aufrufen und alle 400ms ein neues.


Meine Fragen wären jetzt:
1. Gibt es eine Lösung, damit es beim Abruf schon vollständig geladen es?
2. Gibt es eine andere Lösung um ein Bild von oben nach unten durchlaufen zu lassen?
-> Kann man zB einfach ein Bild mit den Maßen 300x900 unterschiedlich in ein JLabel von 300x300 setzen?
 
So ungefähr dachte ich mir das ja auch, aber dennoch müsste ich das bild ja dann im JLabel unterschiedlich anordnen/zerschneiden, nur mit welcher Methode soll das funktionieren? Ich müsste dann ja bei einem JLabel von 300x300 das bild immer um 300 pixel nach unten/oben verschieben.
 
Du brauchst kein Label pro Bild.
Google mal nach "Sprite Programmierung" und/oder gucke dir Quaxlis Tutorial hier im Forum an. Vielleicht wirst du da fündig.
 
Danke für den Tip, aber da blick ich noch nicht so wirklich durch, ich habe mir jetzt nochmal ein Beispiel Programm geschrieben indem komischer Weiße es perfekt funktioniert
Java:
[/B][/COLOR]public class Gif extends JFrame {
    public
    Icon nieteV ;
    Icon polizeiV;
    Icon nieteT;
    JLabel gif;
    public Gif()
    {
        polizeiV=new ImageIcon(getClass().getResource("polizeiV.gif"));
        nieteV=new ImageIcon(getClass().getResource("nieteV.gif"));
        
        
        setSize(1280,1024);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setResizable(false);
        setLayout(null);
        
        
        gif= new JLabel(nieteV);
        gif.setBounds(490,300,300,300);
        
        add(gif);
        
        gif.setIcon(nieteV);
        
        setVisible(true);
        ausführen();
    }


    
    public void warten()
    {
        
        try { 
                Thread.sleep(500);
            }
            catch(Exception ex) {
                System.out.println(ex);
            }
    }
    
    public void ausführen() {
        for (int i=0; i<20;i++) {
            if (i%2==1) {
                gif.setIcon(nieteV);
            }
            else {
                gif.setIcon(polizeiV);
            }
            warten();
        }  
        
    }

}[COLOR=Red][B]

Aber wenn ich mein Richtiges Fenster übergebe, funktioniert es nicht, es bleibt einfach gefreezt das Bild (das gif) bewegt sich nciht mehr, und erst wenn es dann die 20x500ms geschlafen hat, ist das letzte Gif wieder zu sehen. Auch wenn ich den Code in die Klasse meines richtigen Fenster übergebe klappt es nicht mehr. Kann es sein, dass das JFrame nicht leistungsfähig genug ist, oder muss es ein Programmierfehler sein?
 
Habe herausgefunden, dass es wohl am Keylistener liegen muss, denn wenn ich es per Methode aufrufe funktioniert es, falls ich es per Keylistener über die Taste die Methode "ausführen" aufrufe hängt es wie oben beschrieben, wie kann man das vermeiden?
 
Habe mal nen Webdesigner befragt, er meinte ohne Threads würde das ganze nicht funktionieren, er hatte mir dann 2,3 Klassen geschrieben, das ganze funktioniert jetzt irgendwie, benutze jetzt die Klasse TimerTask, nehme mal an, dass sie eigenständig einen neuen Thread erstellt, ist auch gut so weil da habe ich auch überhaupt nicht durchgeblickt.

Naja soweit funktioniert mein kleines Spielchen jetzt, bin froh damit jetzt fertig zu sein 😉
Dennoch Danke für deine Hilfe
 

Zurück
Oben