# JOGL - 2D Sprite richtig platzieren



## Xoric (10. Apr 2011)

Hi,

ich hab schon mit Direct3D in C++ gearbeitet und versuche gerade OpenGL in Java zu programmieren. Da es leider nicht viele Tutorials zu 2D Spieleprogrammierung für JOGL gibt versuche ich mein Glück mal hier.

Ich suche nach einer Möglichkeit, ein Sprite möglichst einfach an eine X,Y Position auf den Bildschirm zu platzieren. Mein JFrame hat zum Beispiel die Auflösung 640x480 und ich möchte ein kleines 32x32 Sprite an die Position X=320, Y=240 zeichnen.

Bisher hab ich das mit einem Quad versucht:


```
private void render(GLAutoDrawable drawable)
	{
		// Clear the color buffer
		GL2 gl = drawable.getGL().getGL2();
		gl.glClear(GL.GL_COLOR_BUFFER_BIT);

		// store the current model matrix
		gl.glPushMatrix();

		// bind texture
		tex.bind();
		gl.glTranslatef(320, 240, 0); // funktioniert so natürlich nicht, als Parameter werden floats erwartet
		
		// draw the texture using a quad
		gl.glBegin( GL2.GL_QUADS );
		gl.glTexCoord2d(0.0,0.0); gl.glVertex2d(0.0,0.0);
		gl.glTexCoord2d(1.0,0.0); gl.glVertex2d(1.0,0.0);
		gl.glTexCoord2d(1.0,1.0); gl.glVertex2d(1.0,1.0);
		gl.glTexCoord2d(0.0,1.0); gl.glVertex2d(0.0,1.0);
		gl.glEnd();
		
		// pop matrix
		gl.glPopMatrix();
	}
```

Mit diesem Code passiert natürlich nicht was ich will. Mein Sprite erscheint wenn ich als Position X=0, Y=0 übergebe irgendwo in der rechten oberen Ecke des Frames. Ich will mit dem Codeausschnitt eher andeuten was ich vorhabe: *Ich hätte gerne, dass das Sprite mit seiner linken oberen Ecke an die Position X=320, Y=240 auf mein Fenster gezeichnet wird.*

Kann mir vielleicht jemand der schon einmal was in die Richtung gemacht hat einen Tipp oder einen Link geben? Ich hab auf Google schon mehrere Seiten Suchergebnisse durchgeschaut, aber komme nicht weiter.

Vielen Dank schonmal im Voraus,
Gruß Xoric


----------



## Marco13 (10. Apr 2011)

Mit der alten fixed-Function Pipeline könnte mal auch glWritePixels machen (und da im Beispiel auch die alte Pipeline verwendet wird, dürfte das nicht viel Unterschied machen), aber wenn man es als "Textur" auf ein Quad irgendwo hinmalen will, hängt die Frage, wo dieses Quad erscheint, auch vom glViewport und der aktuellen Projection zusammen - kommt in deinem Code irgendwo ein glOrtho vor?


----------



## Xoric (10. Apr 2011)

Hi Marco13,

nein Einstellungen wie glViewport etc. habe ich noch nicht angefasst, die sind alle auf default. Die einzigen Initialisierungen mit denen ich bisher vertraut bin, hab ich aus ein paar Tutorials übernommen:


```
/* Initialisierungen: */

		GLProfile.initSingleton(true);

		// enable textures
		GL2 gl = drawable.getGL().getGL2();
		gl.glEnable(GL.GL_TEXTURE_2D);

		glProfile = GLProfile.getDefault();
		GLCapabilities caps = new GLCapabilities(glProfile);
		GLCanvas canvas = new GLCanvas(caps);

		// create JFrame
		final JFrame frame = new JFrame("OpenGL Test");
		frame.setSize(640, 480);
		frame.add(canvas);
		frame.setVisible(true);
```

Immerhin hab ich durch deinen Post jetzt ein paar Begriffe mit denen ich weitersuchen kann. Danke dir für die Antwort!

Viele Grüße
Xoric


----------



## Marco13 (10. Apr 2011)

Die glViewport und glOrtho (oder gluPerspective) - Aufrufe sind i.A. in der "reshape"-Methode vom GLEventListener.


----------



## Xoric (13. Apr 2011)

Hier die Lösung:


```
// Orthographic projection mode for 2D
gl.glMatrixMode(GL2.GL_PROJECTION);
gl.glLoadIdentity();
gl.glOrtho(0, 640, 480, 0, 0, 1);
```


----------

