LWJGL - 2D Texturen werden nicht dargestellt

darman96

Aktives Mitglied
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:
Java:
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
 
Zuletzt bearbeitet:
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?
 
Zuletzt bearbeitet:
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?
 
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?
 
ne eigene klasse kann ich auch noch posten

Hier:
Java:
/*
 * 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;
	}
}
 
Nochmal ganz suggestiv alle vier vertices untereinander:
Java:
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
 

Zurück
Oben