# Animation funktioniert icht wie sie soll



## NHI (6. Aug 2018)

Ich habe mich an das Thema der Animation gewagt, ich habe ein bzw. 2 Bilder mit einer grünen wiese und Blauem Himmel und ein paar Hügeln als 2D erstellt. Das Bild soll einfach nur von rechts nach links laufen, zu diesem Zweck habe ich das Bild sozusagen 2 ml ersellt kann mir bitte jemand helfen ?

Danke im Voraus


----------



## Javinner (6. Aug 2018)

@NHI
Was hat ein Fenster und ein Hintergrund gemeinsam? Die Position im Raum und die Größe. 
Was soll also passieren, wenn ein Bild, sagen wir, von Rechts nach Links gleiten soll? Richtig, seine Position muss sich  pro Zeiteinheit um ein Weg verändern. Nun hast du zwei Bilder, welche die Landschaft im Hintergrund simulieren sollen. Was soll also geschehen? Ganz genau, ein Bild soll genau hinter dem anderen aufgebaut werden, beide sollen mit gleicher Geschwindigkeit pro Zeiteinheit durch den Raum gleiten und wenn das erste Bild nicht mehr sichtbar ist, soll es sich, genauer gesagt die Position des Bildes, soweit verändern, dass es an das zweite Bild anschließt, um wieder in das Fenster hinein geschoben zu werden.

Dazu ein Bild, siehe unten.

Du hast also ein Zeichenbrett, welches beide Bilder als Objekte besitzt und diese horizontal von Rechts nach Links unermüdlich hintereinanderreiht und nachschiebt. Dazu ist, wie bereits erwähnt ein Weg und eine Zeiteinheit notwendig. Beide bekommst du durch die Klasse Timer(util). Mit der Methode `scheduleAtFixedRate(TimerTask, delay, period)` kannst du die Zeitachse bestimmen. Nun brauchst du noch den Weg. Jedes Bild hat eine eigene Weg-Variable und diese wird je nach Startposition des Bildes initialisiert. Dabei soll diese sich pro Zeiteinheit um ein Wert verändern und wenn das Bild ganz aus dem sichtbaren Fenster verschwunden ist, auf den Ursprungswert zurückgesetzt werden(hinten einreihen). Zeichnen kannst du es in der `paintComponent(Graphics g)`
Methode mit g.drawImage(image, positionX, positionY, ImageObserver);


----------



## NHI (6. Aug 2018)

Danke für deine Antwort aber du hast mich leider falsch verstanden das wusste ich alles bereits habe es berreits mit einem Timer und co. umgesetzt ich hatte leider vergessen meinen Quellcode zu posten tut mir Leid ich hatte wie gesagt es so gemacht und umgesetzt nur dass das Bild beim Ausführen wie beschrieben reagiert


----------



## NHI (6. Aug 2018)

Ich schicke dir meinen Quellcode:


----------



## NHI (6. Aug 2018)

```
package HindernisslaufPack;

import java.util.Timer;
import java.util.TimerTask;

public class Background {
Timer move;

Background() {
    move = new Timer();
    move.scheduleAtFixedRate(new TimerTask()  {

        @Override
        public void run() {
           
           
           
            if (Var.BackX1 > 9)   {
               
                Var.BackX1 -= 2;
            }
            else Var.BackX1 = 800;
           
           
           

            if (Var.BackX2  > 9)   {
               
                Var.BackX2 -= 2;
            }
            else {
            Var.BackX2 = 800;
            }
           
           
           
           
                       
        }
       
       
       
       
       
       
       
       
       
    }, 0,100);
   
   
   
   
   
}
}
```


----------



## NHI (6. Aug 2018)

```
package HindernisslaufPack;

import java.awt.*;
import javax.swing.*;

public class Draw extends JLabel{
protected void paintComponent(Graphics g) {
   
    super.paintComponent(g);
   
    Graphics2D g2D = (Graphics2D) g;
    g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
   
    g.drawImage(Var.Background1, 0, Var.BackX1, 800, 600,null);
    g.drawImage(Var.Background2, 0, Var.BackX2, 800, 600,null);
   
    repaint();
   
    Var.BackX1 = 0;
    Var.BackX2 = 800;
   
}
   

}
```


----------



## NHI (6. Aug 2018)

```
package HindernisslaufPack;

import java.awt.Window;

import javax.swing.JFrame;

public class GUI {

    public GUI() {
       
        Var.jf1.setSize(Var.Breite, Var.Höhe);
        Var.jf1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Var.jf1.setLocationRelativeTo(null);
        Var.jf1.setTitle("Hinddernisslauf");
        Var.jf1.requestFocus();
        Var.jf1.setVisible(true);
       
        Draw draw = new Draw();
        draw.setBounds(0,0,Var.Breite,Var.Höhe);
        draw.setVisible(true);
        Var.jf1.add(draw);
       
       
       
       
    }
   
   
   
   
}
```


----------



## NHI (6. Aug 2018)

```
package HindernisslaufPack;
import java.awt.image.*;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;

public class Var {

   
     static JFrame jf1 = new JFrame();
     static int Breite = 800;
    static int Höhe = 600;
   
    static BufferedImage Background1;
    static BufferedImage Background2;
   
    static int BackX1;
    static int BackX2;
   
   
   
   
       
        public Var() {
           
            try {
                Background1  = ImageIO.read(new File ("rsc/GameBackground.png"));
                Background2  = ImageIO.read(new File ("rsc/GameBackground.png"));
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                System.out.println("Datei nicht gefunden");
            }
           
           
        }
   

}
```


----------



## NHI (6. Aug 2018)

Die Main Klasse spare ich mir einmal, da in dieser nur die Main-Methode ist in der die einzelnen Klassen aufgerufen werden


----------



## Javinner (6. Aug 2018)

@NHI
Was funktioniert denn nicht? Ich verstehe nicht ganz


----------



## mkdrive2 (8. Aug 2018)

1) Draw.java sollte so aussehen:

```
// x und y waren vertauscht
     g.drawImage(Var.Background1, Var.BackX1, 0, 800, 600,null);
     g.drawImage(Var.Background2, Var.BackX2, 0, 800, 600,null);
   
     repaint();
   
     //Background.java macht gar nichts, wenn die Werte hier wieder gesetzt werden.
     //Var.BackX1 = 0;
     //Var.BackX2 = 800;
```

2) In Var.java sollte BackX1 = 0 und BackX2 = 800 gesetzt werden

3) Background.java sollte etwa so aussehen aussehen:

```
if (Var.BackX1 > -800)   {
                    Var.BackX1 -= 2;
                } else Var.BackX1 = -2;

                if (Var.BackX2  > 0)   {
                    Var.BackX2 -= 2;
                } else {
                    Var.BackX2 = 798;
                }
```


----------

