Karte wird falsch gezeichnet

mavinatic

Bekanntes Mitglied
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.

Java:
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!


Java:
	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?
 
S

SlaterB

Gast
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

Bekanntes Mitglied
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
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
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!
 
Zuletzt bearbeitet:

Fu3L

Top Contributor
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

Bekanntes Mitglied
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 ;-)
 
S

SlaterB

Gast
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
 
Zuletzt bearbeitet von einem Moderator:

Fu3L

Top Contributor
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

Bekanntes Mitglied
@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?
 
Zuletzt bearbeitet:
S

SlaterB

Gast
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

Top Contributor
@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?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
E relevanter bereich einer isometrischen karte zeichnen (AffineTransform) Spiele- und Multimedia-Programmierung 0
R Einfärben von Gemeinden auf einer Karte Spiele- und Multimedia-Programmierung 14
X Minecraft Wie kann ich eine Karte erstellen wie zb:(Bei Minecraft) Spiele- und Multimedia-Programmierung 1
D scrollbare Karte per JScrollPane? Spiele- und Multimedia-Programmierung 5
A [2D] Karte neuzeichnen Spiele- und Multimedia-Programmierung 6
B 1 Karte von 63 Karten ziehen Spiele- und Multimedia-Programmierung 6
Z 2d Karte Spiele- und Multimedia-Programmierung 5
E 2d Karte aus einzelnen tiles Spiele- und Multimedia-Programmierung 8
M Karte mit statistischer Auswertung Spiele- und Multimedia-Programmierung 4
TobiasN Wer Wird Millionär Spiele- und Multimedia-Programmierung 4
B Bild wird nicht geladen Spiele- und Multimedia-Programmierung 4
R JPanel wird erst im Fullscreen angezeigt Spiele- und Multimedia-Programmierung 1
K Das Leerzeichen der Tastatur wird nicht gleichgesetzt mit dem Leerzeichen aus der Text Datei Spiele- und Multimedia-Programmierung 5
B Programmieren wie der Befehl /ban in Minecraft geblockt wird aber nicht /ban mit einem Argument Spiele- und Multimedia-Programmierung 1
J OpenGL Bild wird nicht richtig angezeigt Spiele- und Multimedia-Programmierung 2
S GetBufferStrategy-Methode wird nicht angezeigt Spiele- und Multimedia-Programmierung 6
G Wer wird Millionär / Fragefenster Spiele- und Multimedia-Programmierung 6
L Transparenz wird magenta Spiele- und Multimedia-Programmierung 3
Polarfuchs Status von Midi Datei(wird gerade abgespielt oder nicht) Spiele- und Multimedia-Programmierung 0
A Bild(sequenz) wird nicht geladen Spiele- und Multimedia-Programmierung 1
F 4 Gewinnt - Code wird ignoriert Spiele- und Multimedia-Programmierung 7
C Mein Programm wird sofort terminated Spiele- und Multimedia-Programmierung 8
A [LWJGL] BMP Textur wird nicht richtig dargestellt Spiele- und Multimedia-Programmierung 8
S LWJGL Rechteck wird nicht gezeichnet Spiele- und Multimedia-Programmierung 6
J Versch. Pfeiltasten angezeigt obwohl nur 1 gedrückt wird Spiele- und Multimedia-Programmierung 2
Creylon [LWJGL] Textur wird falsch angezeigt Spiele- und Multimedia-Programmierung 12
S Nur den Bereich des JPanels zeichen der im Viewport des JScrollPane angezeigt wird Spiele- und Multimedia-Programmierung 8
Q BufferedImage vs. Heap Space ‒ Warum wird der Speicher nicht freigegeben? Spiele- und Multimedia-Programmierung 6
H Skalierung eines Polygons ohne das es verschoben wird Spiele- und Multimedia-Programmierung 3
C Alles hängt, wenn ein Sound abgespielt wird Spiele- und Multimedia-Programmierung 9
K Transformation wird nicht angewendet Spiele- und Multimedia-Programmierung 3
A Wie wird die Person im Game animiert, dass sie ihre Körperteile bewegen? Spiele- und Multimedia-Programmierung 3
A Shape Geometry, wird nicht angezeigt Spiele- und Multimedia-Programmierung 6
L Progress Bar wird erst zu spät ganz angezeigt Spiele- und Multimedia-Programmierung 5
D Jogl:Textur auf GLUquadric wird vertikal spiegelverkehrt dargestellt Spiele- und Multimedia-Programmierung 2
M Java Textadventure HashMap wird nicht befüllt? Spiele- und Multimedia-Programmierung 7
P [JMF] Webcam wird nicht gefunden Spiele- und Multimedia-Programmierung 3
P Erkennen auf welche Objekte gezeigt wird in JoGL Spiele- und Multimedia-Programmierung 6
Steev KeyPressed:Tab wird nicht mehr weitergeleitet Spiele- und Multimedia-Programmierung 2
J JOGL - Bild wird immer wieder weiß Spiele- und Multimedia-Programmierung 2
0x7F800000 weiß einer wozu ANTLR beim build von JOGL verwendet wird? Spiele- und Multimedia-Programmierung 3
J MenuBar wird bei Spiel nicht angezeigt Spiele- und Multimedia-Programmierung 5
L Frame wird geöffnet es wird aber nix angezeigt Spiele- und Multimedia-Programmierung 2
R Die korrekte Breite/Höhe eines Bildes wird nicht erkannt. Spiele- und Multimedia-Programmierung 2
P JOGL: mit glTranslated wird nichts gezeichnet Spiele- und Multimedia-Programmierung 3
F Szene wird nicht komplett angezeigt (Tiefenproblem?) Spiele- und Multimedia-Programmierung 2
G Fragespiel, Hilfe ! like Wer wird Millinär Spiele- und Multimedia-Programmierung 12
M 1. Menüleiste wird doppelt gezeichnet 2. awt auf ein jpanel Spiele- und Multimedia-Programmierung 4
F WakeupOnAWTEvent wird ignoriert! Spiele- und Multimedia-Programmierung 2
C BackgroundSound wird nicht abgespielt Spiele- und Multimedia-Programmierung 3
O Libgdx - Wiedergabe von Bildschirmgröße ist falsch Spiele- und Multimedia-Programmierung 0
A Spielball bewegt sich nicht richtig, prallt falsch ab Spiele- und Multimedia-Programmierung 7
B Game of Life: Was mache ich falsch? Spiele- und Multimedia-Programmierung 3
O OpenGL - Texture falsch herum Spiele- und Multimedia-Programmierung 3
K Bewegung falsch Spiele- und Multimedia-Programmierung 6
H image.setRGB() zeichnet falsch Spiele- und Multimedia-Programmierung 3
R Tutorial falsch?! Spiele- und Multimedia-Programmierung 22

Ähnliche Java Themen

Neue Themen


Oben