# Karte wird falsch gezeichnet



## mavinatic (12. Apr 2012)

Hallo Community,

ich orientiere mich an der performanten Version des "Programmierkönigs" Notch um mein Spiel flüssiger zu gestalten, welches ich am programmieren bin. SourceCode Minicraft-Source

Daran orientiere ich mich um ein performantes Spiel zu programmieren. Nun bin ich dabei mein Level zu erstellen um eine Map zu erstellen.


```
private void init() {
		
		try {
			s = new Sprite(ImageIO.read(new File("img/grass.png")));
			wa = new Sprite(ImageIO.read(new File("img/water.png")));
		} catch (IOException e) {
			e.printStackTrace();
		}
		t = new Tile("Grass", s);
		ts = new Tile("Water", wa);
		
		map = new Tile[w][h];
		for(int i=0;i<map.length;i++) {
			for(int j=0;j<map[i].length; j++) {
				map[i][j] = t;
			}
		}
		
		map[3][3]=ts;
	}
```

Wie ihr seht, erwecke ich 2 Tiles zum Leben und lasse ein Array mit dem "Grass" Tile beschreiben. Am Ende sehnt ihr das, das Element 3,3 mit dem Wasser-Tile überschrieben wird!



```
public void renderSprites(Display display) {
		for(int a=0;a<map.length;a++) {
			for(int b=0;b<map[a].length; b++) {
				map[a][b].render(a*Tile.SIZE, b*Tile.SIZE, display);
			}
		}
	}
```

Das ist die zeichen Methode in der selben Klasse. Die Schleifen durchgehen jedes Element und deshalb sollte auf meiner Karte ein blauer Fleck vom Wasser Tile sein. aber bei mir ist alles nur Grün, vom GrassTile.

Habt ihr eine Ahnung woran das liegen könnte?


----------



## SlaterB (12. Apr 2012)

am Code ist nichts zu erkennen, aber du könntest mit Logging vieles herausfinden, Fehler ausschließen,
gib in der renderSprites() alle Felder aus, vergleiche sie paarweise, ist 3,3 von den anderen abweichend?

lasse per Code 3,3 explizit aus, bleibt ein weißer Fleck auf dem Bildschirm?

unterscheiden sich die PNGs wirklich?


----------



## mavinatic (12. Apr 2012)

Wenn ich dieses 3,3 Element auslasse, dann ist immernoch alles Grün! Mir zeigt es aber im Array an, dass das Element ein Wasser Element ist!

Die PNG-files sind unterschiedlich!

Level.java

```
public class Level {
	private int w;
	private int h;
	private Tile[][] map = null;
	
	Sprite s = null;
	Sprite wa = null;
	
	Tile t = null;
	Tile ts = null;
	
	public Level(int width, int height) {
		this.w = width;
		this.h = height;
		this.init();
	}
	
	private void init() {
		
		try {
			s = new Sprite(ImageIO.read(new File("img/grass.png")));
			wa = new Sprite(ImageIO.read(new File("img/water.png")));
		} catch (IOException e) {
			e.printStackTrace();
		}
		t = new Tile("Grass", s);
		ts = new Tile("Water", wa);
		
		map = new Tile[w][h];
		for(int i=0;i<map.length;i++) {
			for(int j=0;j<map[i].length; j++) {
				map[i][j] = t;
			}
		}
		
		map[3][3]=ts;
	}
	
	public int getWidth() { return w; }
	public int getHeight() { return h; }
	
	public void renderBackground(Display display) {
		display.clear(127, 8);
	}
	
	public void renderSprites(Display display) {
		for(int a=0;a<map.length;a++) {
			for(int b=0;b<map[a].length; b++) {
				if(a==3 && b==3)
					System.out.println("ABC");
				else
					map[a][b].render(a*Tile.SIZE, b*Tile.SIZE, display);
			}
		}
	}
}
```

Display.java

```
package com.george.gfx;

import java.util.Random;

import com.george.level.Tile;

public class Display {
	private int[] pixels = null;
	private int w;
	private int h;
	private int xOffset;
	private int yOffset;
	
	public Display(int w, int h, int[] imagePixels) {
		this.pixels = imagePixels;
		this.w = w;
		this.h = h;
	}
	
	//Parameters known as pixel cords
	public void render(int x, int y, int[] px) {
		//MittelpointDraw
//		x += w/2;
//		y += h/2;
		
		int yo = y-yOffset;
		int xo = x-xOffset;
		
		if(yo<0)
			yo=0;
		if(xo<0)
			xo=0;
		
		int s = (yo * w) + (xo);
		for(int i=0;i<px.length; i++) {
			
			if((s+i) % Tile.SIZE == 0 && i!=0) {
				s+=(w-Tile.SIZE);
			}
			//FIX
			if(!((s+i)>479999))
				pixels[s+i] = px[i];
		}
	}
	
	public void clear(int color, int shift) {
		for(int i=0;i<pixels.length; i++) {
			pixels[i] = color<<shift;
		}
	}
	
	public void setOffset(int xOffset, int yOffset) {
		this.xOffset = xOffset;
		this.yOffset = yOffset;
	}
}
```

Beide relevanten klassen angehangen!


----------



## Fu3L (12. Apr 2012)

Slater hat schon recht, daran kann man nichts erkennen. Tile.SIZE kanns sein, die render Methode kanns sein, Display kann schuld sein... Man weiß es so nicht.

PS: Die Methode in dem was ich gepostet habe, funktioniert 
Man muss auch nicht alles wie Notch machen. Er ist ein großer Mann und ein Visionär, aber er war nie ein wirkliches Genie (das sagt er auch selbst^^)


----------



## mavinatic (12. Apr 2012)

Fu3L hat gesagt.:


> Slater hat schon recht, daran kann man nichts erkennen. Tile.SIZE kanns sein, die render Methode kanns sein, Display kann schuld sein... Man weiß es so nicht.
> 
> PS: Die Methode in dem was ich gepostet habe, funktioniert
> Man muss auch nicht alles wie Notch machen. Er ist ein großer Mann und ein Visionär, aber er war nie ein wirkliches Genie (das sagt er auch selbst^^)



Es wurde bei mir einfach zu langsam, wegen den vielen Images ;-)


----------



## SlaterB (12. Apr 2012)

vielleicht übermalt eine späteres Tile die vorherigen,
lasse eine größere Lücke, male nur den Rand und/ oder die Diagonalen,
setze gleich 3x3 Tiles auf Wasser usw.

vielleicht kommt ganz woanders noch eine paint-Methode dran die alles auf grün setzt,

notfalls die Display-Klasse im Detail debuggen, welche Pixel werden gesetzt..,
geht mit einer Tile-Breite + Höhe von 1 vielleicht leichter

edit:
die Methode render() scheint was mit Mittelpunkt zu machen, da kann man leicht nach oben und links drübermalen, wenn die Tiles zu dicht nebeneinander gemalt werden,

dass bei < 0 und vielleicht zu großen Positionen eher abgeschnitten wird als Exception fliegen,
begünstigt auch falsche Dimensionierungen, bleibt unbemerkt


----------



## Fu3L (12. Apr 2012)

> Es wurde bei mir einfach zu langsam, wegen den vielen Images



Wie willst du es optimieren? 
Bei meiner Methode werden NUR die Bilder gezeichnet die (teilweise) im Bild sind. Sie sieht vielleicht komplizierter aus, erfüllt aber ihren Zweck sehr effizient.


----------



## mavinatic (12. Apr 2012)

@Slater:

Ich habe das probiert und es wird absoluter Käse gezeichnet, was vielleciht auch an meiner Render Methode liegt!

Das komische ist, wenn ich ein Tile, einfach so zeichne, sagen wir 3,3 dann funktioniert das einwandfrei. Dann ist auf 3,3 ein Blauer Fleck tue ich das Dingen ins array, dann ist alles grün?!

Das Ergibt für mich keinen Sinn.

@Fuel:
Das Spiel ist absolut träge! Liegt es an der Tasteneingabe?


----------



## SlaterB (12. Apr 2012)

wie gesagt schaue dir an wie mehrere Tiles aussehen, etwa eine Diagonale,
oder zeichne die erste Reihe, die dritte, die sechste, die zehnte, 
ist ein Abstand von einer Reihe, dann von 2 und dann dann 3 zu sehen oder gar anfangs gar kein Abstand weil sich die 
erste und dritte so weit ausdehen dass dazwischen kein Platz bleibt?

allgemein kann ich dazu nicht mehr sagen,
wenn du ein komplett lauffähiges Testprogramm postest, kann ich es vielleicht testen,
Bilder müssen nicht dabei sein, da kann ich bestimmt im Programm irgendwelche Color-Pixel setzen,
aber Tile und Sprite fehlen, falls auch als Quellcode vorhanden und ein JFrame hoffentlich 
und vor allem die komplette Konfiguration, welche Längen, Breiten überall


----------



## Fu3L (12. Apr 2012)

> @Fuel:
> Das Spiel ist absolut träge! Liegt es an der Tasteneingabe?



Deine Variante lief bei mir auch immer total mau. Reagierte nicht immer. Aber meine Variante läuft super flüssig bei mir. 
Vielleicht liegts an deinem input handling?


----------

