quixotic project blog

Roguelike Programmierung

with one comment

Seit einiger Zeit nun versuche ich mich selbst daran ein kleines roguelike zu schreiben. Noch gibt es nicht viel zu sehen, deswegen keine Screenshots. Nebenbei lese ich auch die entsprechende Newsgroup rec.games.roguelike.development um einen Überblick zu erhalten und Links zu Tutorials und so weiter zu finden. Eine Seite fand ich dabei besonders gut: Ascii Dreams. Der Autor entwickelt, soweit ich das richtig mitbekommen habe, ein altes Roguelike (Angband) weiter und dokumentiert dabei die wichtigsten Schritte und was ihm wichtig ist. Erst kürzlich hat er eine Reihe von Artikeln über die Levelgenerierung veröffentlicht, die sehr interessant waren.

Ich habe den ersten Schritt hinter mir und mich für eine Darstellung entschieden. Klassischerweise würde man wohl farbige Konsolenausgabe für die Grafik wählen, doch da ich mich für Java als Programmiersprache entschlossen habe fällt das flach. Java kennt keine Farbe in der Konsole und dies durch Tricks zu umgehen war mir zu aufwendig. Die zweite Möglichkeit ist eine der vielen Curses Bibliotheken zu benutzen die es so gibt. Da die meisten aber für C++ sind und ich nur eine für Java gefunden habe (JCurses) und mit dieser auch nicht besonders gut zurechtgekommen bin habe ich auch dies wieder verworfen. Entschieden habe ich mich dann für Alternative drei: Mit Hilfe von OpenGL zeichne ich einfach Quads auf den Bildschirm die die Ascii-Zeichen als Textur haben und habe somit auch gleich die volle Kontrolle über die Auflösung, verschiedene Zeichensätze usw.
Zeichnen lasse ich dann alles über VertexArrays, wobei sich nur die Arrays für die Farbe und die Textur ändern, die Geometrie ist statisch. Gerendert wird in zwei Schritten: Zuerst wird der Hintergrund ohne Textur mit Hintergrundfarbe gerendert und danach kommt nochmal ein Durchgang mit angeschalteten Texturen. In Code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//render background
//fill color buffer
colorBuffer.position(0);
colorBuffer.put(colorArrayBackground);
colorBuffer.flip();
 
GL11.glDisable(GL11.GL_TEXTURE_2D);
GL11.glEnableClientState(GL11.GL_VERTEX_ARRAY);
GL11.glEnableClientState(GL11.GL_COLOR_ARRAY);
GL11.glVertexPointer(3, 0, vertexBuffer);
GL11.glColorPointer(3, 0, colorBuffer);
 
GL11.glDrawArrays(GL11.GL_TRIANGLES, 0, resX * resY * 6);
 
//render foreground
//fill colorbuffer
colorBuffer.position(0);
colorBuffer.put(colorArrayForeground);
colorBuffer.flip();
 
texCoordBuffer.position(0);
texCoordBuffer.put(texCoordArray);
texCoordBuffer.flip();
 
GL11.glEnable(GL11.GL_TEXTURE_2D);
GL11.glEnableClientState(GL11.GL_TEXTURE_COORD_ARRAY);
 
GL11.glTexCoordPointer(2, 0, texCoordBuffer);
 
GL11.glDrawArrays(GL11.GL_TRIANGLES, 0, resX * resY * 6);
 
GL11.glDisableClientState(GL11.GL_TEXTURE_COORD_ARRAY);
GL11.glDisableClientState(GL11.GL_VERTEX_ARRAY);
GL11.glDisableClientState(GL11.GL_COLOR_ARRAY);

Die Klasse die für das Rendern zuständig ist merkt sich die Farben und Texturen der einzelnen Tiles (also die Positionen an denen ein Buchstabe oder Zeichen stehen soll), sodass nicht in jedem Durchlauf alles erneut ausgelesen werden muss.

Sobald man mal mehr als nur ein paar Debugausgaben sehen kann werde ich auch einen Screenshot posten.

Written by michi

December 4th, 2007 at 10:30 pm

Posted in Development, Games, Java

Tagged with , , ,

One Response to 'Roguelike Programmierung'

Subscribe to comments with RSS or TrackBack to 'Roguelike Programmierung'.

  1. English translation, please.

    Konton

    11 Jan 08 at 19:58

Leave a Reply

*
To prove you're a person (not a spam script), type the security word shown in the picture. Click on the picture to hear an audio file of the word.
Click to hear an audio file of the anti-spam word