# LWJGL - 2D Texturen werden nicht dargestellt



## darman96 (5. Sep 2011)

Hallo,
ich bin neu in java und hab mich jetzt was mit LWJGL befasst und versuche grad ein kleines spiel(2D) zu schreiben. bis jetzt hat auch alles geklappt. nur als ich neben dem Hintergrund noch weitere Texturen rendern wollte werden diese nicht angezeigt ( aber geladen werden sie, daran liegts nicht. ).

Hier ist mal der Code: 

```
package spieleworkshop;

import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.*;

import com.sun.org.apache.bcel.internal.generic.Select;

public class Game {

	private boolean running = true;
	private TextureStore textureStore = new TextureStore();
	private float fieldWidth;
	private float backgroundWidth;
	public String title;
	
	public Game(String strTitle) {
		title = strTitle;
	}
	
	public static void main(String[] args) throws LWJGLException {
		Game game = new Game("Brettspiel");
		game.run();
	}

	public void init(int width, int height) throws LWJGLException {
		DisplayMode[] dm = Display.getAvailableDisplayModes();
		
		for(DisplayMode mode : dm) {
			if (mode.getWidth() == width && mode.getHeight() == height ) {
				Display.setDisplayMode(mode);
			} else {
				Display.setDisplayMode(dm[0]);
			}
		}
		
		Display.setTitle(title);
		Display.create();
		
		GL11.glMatrixMode(GL11.GL_PROJECTION);
		GL11.glLoadIdentity();
		
		GL11.glOrtho(0, Display.getDisplayMode().getWidth(), Display.getDisplayMode().getHeight(), 0, -1, 1);
		
		GL11.glMatrixMode(GL11.GL_MODELVIEW);
		GL11.glLoadIdentity();
		
		GL11.glEnable(GL11.GL_ALPHA_TEST);
		GL11.glAlphaFunc(GL11.GL_GREATER, 0.4f);
		
		GL11.glEnable(GL11.GL_TEXTURE_2D);
		
		GL11.glClearColor(0.1f, 0.5f, 1.0f, 1.0f);
		
		LoadTextures();
	}
	
	public void run() {
		
		try {
			init(800,600);
		} catch (LWJGLException e) {
			e.printStackTrace();
		}
		
		while(running) {
			if (Display.isCloseRequested()) {
				running = false;
			}
			Display.update();
			input();
			update();
			render();
		}
		
		cleanup();
		
	}
	
	public void input() {
		
	}
	
	public void update() {
		
	}
	
	public void render() {
		GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);
		GL11.glLoadIdentity();
		
		drawBackground(50, 100, "Background");
		drawFields(17, 17);
	}
	
	
	private void LoadTextures() {
		textureStore.LoadTexture("img/Fields/bg.png", "Background");
		textureStore.LoadTexture("img/Fields/feld_blau.png", "fieldBlue");
		textureStore.LoadTexture("img/Fields/playerZone.png", "playerZone");
	}
	
	private void drawBackground(float borderTop, float borderRight, String textureName) {
		
		backgroundWidth = Display.getDisplayMode().getWidth() - (borderRight * 2);
		
		float borderLeft = Display.getDisplayMode().getWidth() - borderRight;
		float borderBottom = Display.getDisplayMode().getHeight() - borderTop;
		
		textureStore.getTexture(textureName).bind();
		
		GL11.glBegin(GL11.GL_QUADS);
			GL11.glTexCoord2f(0.0f, 0.0f);
			GL11.glVertex3f(borderRight, borderTop, 0.0f);
			
			GL11.glTexCoord2f(1.0f, 0.0f);
			GL11.glVertex3f(borderLeft, borderTop, 0.0f);
			
			GL11.glTexCoord2f(1.0f, 1.0f);
			GL11.glVertex3f(borderLeft, borderBottom, 0.0f);
			
			GL11.glTexCoord2f(0.0f, 1.0f);
			GL11.glVertex3f(borderRight, borderBottom, 0.0f);
		GL11.glEnd();
		
	}
	
	private void drawFields(int fieldsX, int fieldsY) {
		
		fieldWidth = backgroundWidth / fieldsX;
		
		for (int i = 1; i < fieldsY; i++) {
			for(int j = 1; i < fieldsX; i++) {
				switch (i) {
				case 1:
					if(j >=1 && j <=3 || j >= 15 && j <= 17) {
						drawPlayerZone(fieldWidth, j, i);
					} else {
						drawFieldBlue(fieldWidth, j, i);
					}
				case 2:
					if (j == 1 || j == 2 || j == 16 || j == 17) {
						drawPlayerZone(fieldWidth, j, i);
					} else {
						drawFieldBlue(fieldWidth, j, i);
					}
				case 3:
					if (j == 1 || j == 17) {
						drawPlayerZone(fieldWidth, j, i);
					} else {
						drawFieldBlue(fieldWidth, j, i);
					}
				case 15:
					if (j == 1 || j == 17) {
						drawPlayerZone(fieldWidth, j, i);
					} else {
						drawFieldBlue(fieldWidth, j, i);
					}
				case 16:
					if (j == 1 || j == 2 || j == 16 || j == 17) {
						drawPlayerZone(fieldWidth, j, i);
					} else {
						drawFieldBlue(fieldWidth, j, i);
					}
				case 17:
					if(j >=1 && j <=3 || j >= 15 && j <= 17) {
						drawPlayerZone(fieldWidth, j, i);
					} else {
						drawFieldBlue(fieldWidth, j, i);
					}
				default:
					drawFieldBlue(fieldWidth, j, i);
				}
			}
		}
	}
	
	private void drawPlayerZone(float width, int offsetX, int offsetY) {
		
		float startPosX = Display.getDisplayMode().getWidth() - backgroundWidth;		// berechenet und speichert die start Position des Spielfeldes auf der X-achse
		float startPosY = Display.getDisplayMode().getHeight() - backgroundWidth;		// berechenet und speichert die start Position des Spielfeldes auf der Y-achse
		
		GL11.glBindTexture(GL11.GL_TEXTURE_2D, textureStore.getTexture("playerZone").getTextureID());
		
		GL11.glBegin(GL11.GL_QUADS);
			GL11.glTexCoord2f(0.0f, 0.0f);
			GL11.glVertex3f(startPosX + (offsetX - 1) * fieldWidth, startPosY + (offsetY - 1) * fieldWidth, 1.0f);
			
			GL11.glTexCoord2f(1.0f, 0.0f);
			GL11.glVertex3f(startPosX + (offsetX - 1) * fieldWidth, startPosY + (offsetY - 1) * fieldWidth, 1.0f);
			
			GL11.glTexCoord2f(1.0f, 1.0f);
			GL11.glVertex3f(startPosX + (offsetX - 1) * fieldWidth, startPosY + (offsetY - 1) * fieldWidth, 1.0f);
			
			GL11.glTexCoord2f(0.0f, 1.0f);
			GL11.glVertex3f(startPosX + (offsetX - 1) * fieldWidth, startPosY + (offsetY - 1) * fieldWidth, 1.0f);
		GL11.glEnd();
	}
	
	private void drawFieldBlue(float width, int offsetX, int offsetY) {
		
		float startPosX = Display.getDisplayMode().getWidth() - backgroundWidth;		// berechenet und speichert die start Position des Spielfeldes auf der X-achse
		float startPosY = Display.getDisplayMode().getHeight() - backgroundWidth;		// berechenet und speichert die start Position des Spielfeldes auf der Y-achse
		
		textureStore.getTexture("fieldBlue").bind();
		
		GL11.glBegin(GL11.GL_QUADS);
		GL11.glTexCoord2f(0.0f, 0.0f);
		GL11.glVertex3f(startPosX + (offsetX - 1) * fieldWidth, startPosY + (offsetY - 1) * fieldWidth, 1.0f);
		
		GL11.glTexCoord2f(1.0f, 0.0f);
		GL11.glVertex3f(startPosX + (offsetX - 1) * fieldWidth, startPosY + (offsetY - 1) * fieldWidth, 1.0f);
		
		GL11.glTexCoord2f(1.0f, 1.0f);
		GL11.glVertex3f(startPosX + (offsetX - 1) * fieldWidth, startPosY + (offsetY - 1) * fieldWidth, 1.0f);
		
		GL11.glTexCoord2f(0.0f, 1.0f);
		GL11.glVertex3f(startPosX + (offsetX - 1) * fieldWidth, startPosY + (offsetY - 1) * fieldWidth, 1.0f);
	GL11.glEnd();
	}
	
	public void cleanup() {
		Display.destroy();
	}
	
}
```

Gruß darman96


----------



## Marco13 (5. Sep 2011)

Da läuft parallel eine ähnliche Frage: http://www.java-forum.org/spiele-mu...837-lwjgl-texturen-gezeichnet.html#post802253 vielleicht kommt aus Mutation und Crossover da was hilfreiches raus. 
So, wo war nochmal der Thread zu Genetischen Algorithmen...? :rtfm:


----------



## darman96 (6. Sep 2011)

hi ich hatte den Thread auch schon gefunden aber da geht es doch um 3D und bei mir 2D. ???:L

hat keiner ne ahnung woran´s liegen könnte?


----------



## darman96 (7. Sep 2011)

ah wenn ich debugge sagt der mir an der stelle in der drawPlayerZone() wo auf Display zugreife das die lwjgl.jar kein Source Attachement hat. was soll das heißen?


----------



## Marco13 (8. Sep 2011)

Hat nichts zu sagen, nur dass der LWJGL source halt nicht da ist. Genausowenig wie der von TextureStore. Was ist das für eine Klasse?


----------



## darman96 (8. Sep 2011)

ne eigene klasse kann ich auch noch posten

Hier:

```
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package brettspiel;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.HashMap;
import org.newdawn.slick.opengl.Texture;
import org.newdawn.slick.opengl.TextureLoader;

/**
 *
 * @author Erik
 */
public class TextureStore {
    private HashMap<String, Texture> textures = new HashMap<String, Texture>();
	
	public boolean LoadTexture(String path, String name) throws IOException {
		
		Texture texture = null;
		
		try {
			if((texture = TextureLoader.getTexture("PNG", new FileInputStream(path))) != null) {
				textures.put(name, texture);
				return true;
			}
		} 
		catch (FileNotFoundException e) 
		{
			e.printStackTrace();
		} 
		catch (IOException e) 
		{
			e.printStackTrace();
		}
		
		return false;
	}
	
	public Texture getTexture(String name) {
		
		if (textures.containsKey(name)) {
			return textures.get(name);
		}
		
		return null;
	}
}
```


----------



## Marco13 (8. Sep 2011)

Hmja, dann kann man das ja (morgen) vielleicht sogar mal testen


----------



## Marco13 (9. Sep 2011)

*seuf*... schau dir mal die Koordinaten der Vertices an, die in drawPlayerZone and drawDasAndereDing stehen...


----------



## darman96 (15. Sep 2011)

was ist denn mit den koordinaten??


----------



## Marco13 (15. Sep 2011)

Nochmal ganz suggestiv alle vier vertices untereinander:

```
GL11.glVertex3f(startPosX + (offsetX - 1) * fieldWidth, startPosY + (offsetY - 1) * fieldWidth, 1.0f);
GL11.glVertex3f(startPosX + (offsetX - 1) * fieldWidth, startPosY + (offsetY - 1) * fieldWidth, 1.0f);
GL11.glVertex3f(startPosX + (offsetX - 1) * fieldWidth, startPosY + (offsetY - 1) * fieldWidth, 1.0f);
GL11.glVertex3f(startPosX + (offsetX - 1) * fieldWidth, startPosY + (offsetY - 1) * fieldWidth, 1.0f);
```

Mustererkennung ? Wikipedia


----------



## darman96 (16. Sep 2011)

wäre das richtig:


```
startposX + ((offsetX - 1) * fieldwidth)
```


----------



## Marco13 (16. Sep 2011)

DIE VERTEX-KOORDINATEN SIND ALLE GLEICH. Caps Lock wieder aus.


----------



## darman96 (16. Sep 2011)

oh okay danke.


----------

