# Logikfehler drawImage()



## kaoZ (16. Jul 2014)

Wie der Titel schon sagt sehe ich grade den Wald vor lauter bäumen nicht 

ich möchte ein Image Zeichen, wenn eine Bestimmte koordinate überschritten ist soll ein Extra image gezeichnet werden, *das funktioniert auch, allerdings nur ein mal* logischer weise.....:lol:

hier mal der Code:


```
public void draw(Graphics2D g){
	
		g.drawImage(image, (int)x, (int)y, null);
		
		if (x < 0) {
	        g.drawImage(image, (int) x + GamePanel.WIDTH, (int) y, null);
        }
		if (x > 0) {
	        g.drawImage(image, (int) x - GamePanel.WIDTH, (int) y, null);
        }
		
	}
```

soweit so gut, 

wenn ich nun allerdings hergehe und in der draw methode die in einem gameloop aufgerufen wird, eine Schleife hinzufüge die mir das Zeichenen wiederholt, passiert logischerweise nichts mehr, vielleicht sollte ich auch einfach nur mal eine pause machen , aber ggf. kann mir ja jemand schnell einen Denkanstoß geben :idea:

Normalerweise müsste ich ja hier auch mit deiner while schleife arbeiten, sonst wird, wie es ja der fall ist , das image nur einmal wiederholt, ich checks grad wie gesagt nicht :toll:

Vielen Dank schonmal vorab.


----------



## eMmiE (16. Jul 2014)

Ich weiß jetzt nicht genau, wo du jetzt die zweite Schleife in die draw-Methode reinpacken willst
Das hört sich aber schonmal soweit falsch an, da du ja eigentlich in einem gameloop pro durchlauf die Variablen änderst und dann renderst

Das heißt, dass dann, wenn du statt dem if(...) ein while(...) schreibst, der gameloop nicht weiter ausgeführt wird
So wie du es gerade hast, sollte das nach deiner Beschreibung (Position.x > 0 | < 0 => ein weiters Bild wird gezeichnet)

Falls es das nicht ist, beschreibe nochmal genauer, dass wir das hier ein bisschen auseinander nehmen können

Gruß eMmiE

P.S.: Schlafen ist immer gut


----------



## kaoZ (16. Jul 2014)

Ich poste hier einfach mal die Klasse Background welche ein Image lädt und dieses dann in der draw() methode zeichnen soll,


```
public class Background {
	
	private double x;
	private double y;
	
	private double dx;
	private double dy;
	
	private double moveScale;
	
	private BufferedImage image;
	
	public Background(String path, double moveScale) {
		try {
	        image = ImageIO.read(getClass().getResourceAsStream(path));
        } catch (Exception e) {
        	e.printStackTrace();
        }
		this.moveScale = moveScale;
    }
	
	public void setPosition(double x , double y){
		this.x = x;
		this.y = y;
	}
	
	public void setVector(double dx, double dy){
		this.dx = dx;
		this.dy = dy;
	}
	
	public void update(){
		x += (dx * moveScale) % GamePanel.WIDTH;
		x += (dy * moveScale) % GamePanel.HEIGHT;
	}
	
	public void draw(Graphics2D g){
	
		g.drawImage(image, (int)x, (int)y, null);
		
		if (x < 0) {
	        g.drawImage(image, (int) x + GamePanel.WIDTH, (int) y, null);
        }
		if (x > 0) {
	        g.drawImage(image, (int) x - GamePanel.WIDTH, (int) y, null);
        }
		
	}
	
	public double getX()		{return this.x;}
	public double getY() 		{return this.y;}

}
```

ich denke der Fehler liegt irgendwo zwischen update() und draw() und eben der Anweisung wann weitere Images gezeichnet werden sollen.

Aber ich komm grade nicht drauf......

update() erfasst einfach die aktuelle position errechnet aus der Richtung in welches sich das image bewegen soll * die schrittlänge % die länge des Panels,

dann damit dieses Image durchgehend scrollt ist es nötig dieses image wiederholt zu zeichnen solange wie der Gameloop läuft, 

Sinn dahinter ist ich will einfach in einem Menü ein in schleife laufendes image gezeichnet bekommen, aber wie gesagt wird hier logischerweise nur ein neues image nachgelegt

in der aufrufenden Klasse wird dann erst alles auf das Image gezeichnet (gerendert) und dann auf den Panel




> Das heißt, dass dann, wenn du statt dem if(...) ein while(...) schreibst, der gameloop nicht weiter ausgeführt wird



genau da ist grade das problem, es soll halt in dauerschleife scrollen  und sich nicht nur einmal wiederholen, ich komme nur grade nicht drauf, vielleicht sollte ich wirklich erstmal pennen gehen


----------



## Bananabert (16. Jul 2014)

Hm, wenn du die Positionen beider Images separat berechnest und die Positionen updatest sobald eines der Bilder außerhalb des Sichtbereiches ist, könnte es klappen. 
Z.b. Wenn Image1 komplett nach Links raus ist, setzt du die X Position auf PANEL_WIDTH und andersherum.


----------



## kaoZ (16. Jul 2014)

Ich werd mir das morgen nochmal in ruhe anschauen 

heute werd ich glaube ich da keine gescheite lösung mehr finden , too much code ^^


----------



## kaoZ (17. Jul 2014)

Habs gelöst :


```
public void update(){
		x += (dx * moveScale) % GamePanel.WIDTH;
		x += (dy * moveScale) % GamePanel.HEIGHT;
		
		//invert the panelwidth
		int negX = 0 - GamePanel.WIDTH;
		
		//resets the x Position of the image to zero 
		if (x <= negX) {
            x = 0;
        }
	}
	
	public void draw(Graphics2D g){
	
		g.drawImage(image, (int)x, (int)y, null);
		
		if (x < GamePanel.WIDTH) {
	        g.drawImage(image, (int) x + GamePanel.WIDTH, (int) y, null);
		}
		if (x > GamePanel.WIDTH) {
	        g.drawImage(image, (int) x - GamePanel.WIDTH, (int) y, null);
        }
 
		//prints x value to screen
        g.drawString(String.valueOf(x), 100, 100);
	}
```


----------

