# Den Hintergrund loopen



## Feeder (25. Jul 2014)

Hey ch versuche den Hintergrund meines Spieles, wenn ich den rechten Pfeil drücke zu loopen, sobald man das Leere sehen kann. Ich weiß das dieses Thema schon einmal geschreiben wurde, aber den dortigen Code kann ich nicht auf sinngemess auf meinen übertragen 

Dieser Code ist meine Klasse die das zwar logischer weise, bewirken müsste, aber nicht so ganz macht. Ich meine die if - Abfrage 


```
if(X_Achse >= Old_XAchse + 640){
           x++;
           Old_XAchse+=640;
       }
```

wird nie ausgeführt.

Dies ist nun meine Klasse in der man alles ordenlichtst verstehen kann weil ich bestimmt sauber habe: 


```
package game2D;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.swing.Timer;

public class MiniGame extends JPanel implements ActionListener{
    int Old_XAchse;
    int anzahl = 0;
    Image img;
    int X_Achse;
    int lauf;
    int zaehler;
    int x;
    int z;
    
    public MiniGame(){
        Old_XAchse = X_Achse;
        X_Achse = 0;
        x = 1;
        lauf = 0;
        z = 0;
        setFocusable(true);
        ImageIcon icon = new 
        ImageIcon(this.getClass().getResource("background.jpg"));
        img = icon.getImage();
        addKeyListener(new AL());
        Timer time = new Timer(3, this);
        time.start();
    }
    
    @Override
    public void actionPerformed(ActionEvent e){
     X_Achse = X_Achse + lauf;
     repaint();
    
     
    }
    
    private class AL extends KeyAdapter {
        public AL() {
        
    }
       int taste = 0;
        @Override
       public void keyPressed(KeyEvent e){
       taste = e.getKeyCode();
       if(taste == KeyEvent.VK_LEFT){
           lauf = 1;
       }
       if(taste == KeyEvent.VK_RIGHT){
           lauf = -1;
       }
       }
       
        @Override
       public void keyReleased(KeyEvent e){
           taste = e.getKeyCode();
           if(taste == KeyEvent.VK_LEFT || taste == KeyEvent.VK_RIGHT){
               lauf = 0;
           }
       }
    }
    
    @Override
    public void paint(Graphics g){
       
       super.paint(g);
       Graphics2D fg = (Graphics2D) g;
       if(X_Achse >= Old_XAchse + 640){
           x++;
           Old_XAchse+=640;
       }
       
        
     
           fg.drawImage(img, X_Achse, 0, null);
           fg.drawImage(img, X_Achse + 640 * x, 0, null);
           

           
    }
       
    
    public int getX_Achse(){
        return X_Achse;
        
    }
    }
```



Danke für die Hilfe von euch


----------



## Joose (25. Jul 2014)

Feeder hat gesagt.:


> ```
> public MiniGame(){
> Old_XAchse = X_Achse;
> X_Achse = 0;
> ...



Abgesehen davon, dass die Formatierung des Codes das Lesen erschwert, eine Anregung zum Code:
Du setzt den Wert von 
	
	
	
	





```
X_Achse
```
 auf 
	
	
	
	





```
Old_XAchse
```
 und danach initialisierst du erst 
	
	
	
	





```
X_Achse
```
?
Worin liegt da die Logik? Bzw. alle 
	
	
	
	





```
= 0;
```
 Initialisierungen im Konstruktor kannst du auch weglassen, da 0 der Standard Wert eines Integers ist.

Nun zu deinem eigentlichen Probem:
Möglicherweise arbeitet etwas anders als von dir Gedacht, oder die Attribute haben falsche Werte. 
Hast du schon mal den Debugger angeworfen um zu schauen ob er die paint-Methode überhaupt aufruft?
Hast du Log-/Konsolenausgaben eingefügt um zu sehen, welche Wert die Attribute haben? Das sind die 2 Sachen die man bei Problemen als Erstes machen sollte! Meisten löst sich das Problem dadurch von alleine


----------



## Feeder (25. Jul 2014)

Hey, ja die Sauberkeit ist wirklich durch einander gerraten  Das mit der X Achse ist wahrscheinlich durch das tausend - malige Überschreiben passiert. 

Die X_Achse habe ich schon öfters abgefragt, werde es jetzt aber nochmal machen  Die Paint Methode wird durch repaint() aufgerufen und die methode die repaint aufruft durch den Timer 

Aber es heißt bei mir meistens nicht 

if(experiment.fail){

learn();
repeat();

}

sonder

if(true){

learn();
repeat();

}


----------



## Feeder (25. Jul 2014)

Ich habe gerade einen Fehler entdeckt und habe ich behoben, doch nach wie vor steht ich vor dem selben Problem inklusive Bug.



```
public void paint(Graphics g){
       
       super.paint(g);
       Graphics2D fg = (Graphics2D) g;
       if(X_Achse <= Old_XAchse - 640){
           x--;
           Old_XAchse = X_Achse;
       }
       
           fg.drawImage(img, X_Achse, 0, null);
           fg.drawImage(img, X_Achse + (640 * x), 0, null);
      
    }  
    
    public int getX_Achse(){
        return X_Achse;
        
    }
```


----------



## Joose (25. Jul 2014)

Wie gesagt baue Konsoleneingaben ein! 
Dadurch kannst du mitverfolgen wie sich die Werte ändern, bzw. welche Wert die Attribute bei der Prüfung haben. Dadurch solltest du erkennen wo das Problem liegt.

Meiner Meinung nach sollte es passen, man muss eben nur min 640x in eine Richtung drücken/laufen bis die Bedingung wahr wird.


----------



## Feeder (25. Jul 2014)

Nun klappt es. Danke dir !!!!


```
public void paint(Graphics g){
       
       super.paint(g);
       Graphics2D fg = (Graphics2D) g;
       if(X_Achse <= Old_XAchse - 640){
           x++;
           Old_XAchse = X_Achse;
       }
       
           fg.drawImage(img, X_Achse + (640 * x) - 640, 0, null);
           fg.drawImage(img, X_Achse + (640 * x), 0, null);
      
    }
```


----------



## Joose (25. Jul 2014)

Und wo lag das Problem nun? Andere könnten mal ein ähnliches Problem haben, da würde es natürlich helfen wenn man hier nun auch die Lösung inkl.(!) kurzer Erklärung hinschreibt


----------



## kaoZ (10. Aug 2014)

mal abgesehen davon würde ich einen Hintergrund , insofern er aus einem (Buffered)Image besteht so loopen ,

und dies auch *aktiv* und nicht passiv über repaint / überschreiben der paint/paintComponent() methoden, da sonst nur das toolkit veranlassen kann das dein Panel/Frame neu gezeichnet wird, und du keinen einfluss darauf hast wann dies passiert, und selbst mit repaint() nur ein neu zeichen anstößt, und auch nicht beeinflussen kannst wann das passiert.


```
@Override
	public void draw(Graphics g){
		g.drawImage(image, (int)x, (int)y, null);
		
		if(x < 0) {
			g.drawImage(image, (int)x + image.getWidth(), (int)y, null);
			if(x < -image.getWidth()) {
				x = -1;
			}
		}
		if(x > 0) {
			g.drawImage(image, (int)x - image.getWidth(), (int)y, null);
			if(x > image.getWidth()) {
				x = 1;
			}
		}
	}
```

Du zeichnest ein Image, und falls ein Vector gesetzt sein sollte, zeichnest du noch ein Image an der entsprechenden Stelle, dann prüftst du ob schon ein image gezeichnet wurde und setzt die entsprechende koordinate wieder auf einen wert , der veranlasst das wiederholt ein Image gezeichnet wird usw. usw.

Hier kannst du natürlich auch mit der Weite oder Höhe deines Frames/Panels arbeiten welches dein Spiel darstellt, anstatt mit der Größe des Bildes selbst, auch eine Verschiebung auf der y achse könnte man so umsetzen.


----------

