# [OpenGL] Spiel in der Art von Age of Empires



## Death_Vader97 (19. Mrz 2014)

Hi,
momentan probier ich so als Hobbyprojekt nen 3D game in der Art von Age of Empires zu schreiben, auch inspiriert von RimWorld und Banished, also mit Kästcheneinteilung. Dazu programmiere ich grade meine eigene Engine auf der Basis von OpenGL und lwjgl.

Ich weiß wie Programmierung in Grunde abläuft, ich habe schon ein paar Minecraft-Plugins programmiert.

Momentan teste ich so, wie ich das mit der "Fläche" machen kann. Logischerweise kann man nicht pro Kästchen nen eigenes Mesh nehmen, da bekomme ich auf ner 500x500er Testmap, wenn ich alles rendern lasse, 9fps. Dann hab ich mal probiert, nen mesh für 16x16 blöcke (die map dann 512x512) zu nehmen, allerdings bekomme ich das grad mit dem uv mapping iwie nicht wirklich hin und die fps sind auch nur bei 39 :noe: Weiß jemand, wie man das ressourcenschonender Umsetzen kann (mal abgesehen von dem zielgerichteten rendern von nur dem gebiet, wo man grad hinschaut)?


----------



## Highchiller (19. Mrz 2014)

Eventuell musst du deine Prioritäten etwas anders setzen. Magst du eine eigene Engine schreiben oder willst du ein Spiel programmieren? Beides ist sehr... seeeeeehr umfangreich, vor allem alleine.

Heutzutage programmiert man Engines vor allem zu lern zwecken. Oder man gehört einer großen Firma oder einer großen Gruppe von enthusiastischen Codern an, die ein Ziel vor Augen haben. Wenn man dagegen ein Spiel programmieren will ist man deutlich besser bedient vorhandene Engines zu nutzen.

Wie dem auch sei, zurück zu deiner eigentlichen Frage. Wenn du den Grund renderst nutzt du meistens aus, das dieser sich nicht ändert. Will heißen, für eine total ebene Fläche (keine Berge, Täler, Wasser) brauchst du genau 1 Rechteck, sprich 4 Kanten mit 4 Ecken. Und die verschiedenen Untergründe erstellst du mit Hilfe von Textures/Bildern.
Die Rasterteilung unternimmst du dann hinter den Kulissen in der Programmlogik.

Als Spieleprogrammierer musst du an allen Enden trixen... Statt ne Milliarde Vertices nimmste nur wenige 100, den Rest der Illusion übernehmen Bump-Maps/Normal-Maps, AO, Specularity etc.

Vertices sind tödlich für den Rechner. Je weniger desto besser


----------



## Death_Vader97 (20. Mrz 2014)

Es ist beides zu mehr oder weniger Übungszwecken. Ich möchte halt mal wissen wie man das von Grund auf macht. Ich wollte jetzt erstmal testen, wie das läuft wenn ich für jeden "block" 2 triangles habe. Es wird wohl besser sein von Anfang an das ganze zu optimieren. Aber mir gefällt irgendwie nicht, dass die Performance bei einer relativ simplen "plane" so schlecht wird. Wenn später viele Unregelmäßigkeiten in der Landschaft durch Gameplayelemente entstehen und dann noch Gebäude rumstehen wirds ja im laufenen Game vielleicht sogar auf so eine Performance hinauslaufen. Naja, mal schauen.


----------



## Highchiller (20. Mrz 2014)

Im Endeffekt bleibt natürlich noch die Möglichkeit das dein Code bis jetzt schon deutlich optimierungspotential liefert. Aber ohne Code lässt sich das natürlich nicht sagen.


----------



## Death_Vader97 (24. Mrz 2014)

Hm, erstmal hab ich ein anderes großes Problem: ich bekomme es nicht hin, 2D sachen zu rendern. also 3d objekte gehen schon, aber 2d fürs gui nicht  hab versucht Text über verschiedene Wege darzustellen, dann auch nur ein viereck, aber nichts von dem wird gerendert.
das ist meine temporäre render-methode zum testen, wenn mehr code benötigt wird bescheid sagen, möchte jetzt nicht gleich alles posten obwohls vielleicht gar nicht gebraucht wird.


Spoiler: public void render()





```
public void render(){
		shader.bind();
		shader.updateUniforms(transform.getTransformation(), transform.getProjectedTransformation(), material);
		//3D
		w.drawMeshes(camera);
		//end 3D
		shader.unbind();
		
        glMatrixMode(GL_PROJECTION);
        glPushMatrix();
        glLoadIdentity();
        glOrtho(0,Main.width,Main.height,0,-1,1);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
 
        //2D
        glColor3f(1, 0, 0);
        glBegin(GL_QUADS);
        glVertex2f(200, 200);
        glVertex2f(264, 200);
        glVertex2f(264, 264);
        glVertex2f(200, 264);
        glEnd();
		BitmapHandler.drawString(0, 100, 100, "test");
		fonts.get(0).drawString(100, 50, "test", Color.yellow);
		Fonter.font.drawString(100, 100, "test", Color.black);
		TextureImpl.bindNone();
        //end 2D
        
        glMatrixMode(GL_PROJECTION);
        glPopMatrix();
        glMatrixMode(GL_MODELVIEW);
	}
```


----------

