package de.bplaced.mtgxyz.cavegame;
import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.util.Random;
import org.newdawn.slick.*;
import org.newdawn.slick.opengl.*;
import org.newdawn.slick.util.*;
import org.lwjgl.*;
import org.lwjgl.opengl.*;
public class MainClass {
long lastFrame;
int fps;
long lastFPS;
long frame;
private Texture texture;
/**
* Get the time in milliseconds
* @return The system Time in milliseconds
*/
public long getTime() {
return (Sys.getTime() * 1000) / Sys.getTimerResolution();
}
void createDisplay(int x, int y) {
try {
Display.setDisplayMode(new DisplayMode(x, y));
Display.create();
Display.setVSyncEnabled(true);
} catch (LWJGLException e) {
e.printStackTrace();
System.exit(-1);
}
try {
// load texture from GIF file
texture = TextureLoader.getTexture("PNG", ResourceLoader.getResourceAsStream("terrain.png"));
System.out.println("Texture loaded: "+texture);
System.out.println(">> Image width: "+texture.getImageWidth());
System.out.println(">> Image height: "+texture.getImageHeight());
System.out.println(">> Texture width: "+texture.getTextureWidth());
System.out.println(">> Texture height: "+texture.getTextureHeight());
System.out.println(">> Texture ID: "+texture.getTextureID());
} catch (IOException e) {
e.printStackTrace();
}
}
void initGL() {
GL11.glEnable(GL11.GL_TEXTURE_2D);
GL11.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
GL11.glEnable(GL11.GL_BLEND);
GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
GL11.glViewport(0,0,800, 600);
GL11.glMatrixMode(GL11.GL_MODELVIEW);
GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity();
GL11.glOrtho(0,800,600,0,1,-1);
GL11.glMatrixMode(GL11.GL_MODELVIEW);
}
void renderLoop() {
// TODO Write
int delta= getDelta();
frame++;
System.out.println("Frame: "+frame+", Delta: "+delta);
DrawBlockTo(0,0,1,texture,0.0f,0.0f);
DrawBlockTo(0,1,0,texture,0.0f,0.0f);
updateFPS();
Display.update();
}
public void start() {
createDisplay(800,600);
initGL();
getDelta();
lastFPS=getTime();
frame=0;
while(!Display.isCloseRequested()) {
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);
renderLoop();
}
Display.destroy();
}
public static void main(String[] args) {
MainClass mc = new MainClass();
mc.start();
}
public int getDelta() {
long time = getTime();
int delta=(int) (time-lastFrame);
lastFrame=time;
return delta;
}
public void updateFPS() {
if(getTime() - lastFPS > 1000) {
Display.setTitle("FPS: " + fps);
System.out.println("One Second Delay over: FPS: "+fps);
fps=0;
lastFPS += 1000;
}
fps++;
}
public void DrawBlockTo(int x, int y, int texpos, Texture texfile,float camx, float camy){
// 50*37 Blöcke können angezeigt werden.
// Camx ist die KLEINSTE Sichtbare X Position, CamY ist die Kleinste sichtbare Y-Position.
// Nicht sichtbare Blöcke Kommen hierher und werden nicht gerendert.
if(x<camx || x>camx+50) {
System.out.println("x not inside the Monitor");
return;
}
if(y<camy || y>camy+37) {
System.out.println("y not inside the Monitor");
return;
}
// Jetzt werden die Pixelpositionen Berechnet. Da auch nicht vollständige Blöcke gerendert werden müssen, muss camx UND Camy float sein!
// Texturen MÜSSEN 16*16 Pixel groß sein!
int absoluteX =(int) ((x-camx)*16);
int absoluteY = (int) ((y-camy)*16);
// Texturdateien sind 256*256 Pixel groß. Sollte also eine Textur größer als 255 genutzt werden, zeige den Block NICHT an!
if(texpos>=256) {
System.out.println("Not inside the File");
return;
}
int relTexX=texpos%16-1;
int relTexY=texpos/16-1;
// Jetzt müssen wir nur noch den Block Rendern.
texture.bind();
GL11.glBegin(GL11.GL_QUADS);
GL11.glTexCoord2f(relTexX/16, relTexY/16);
GL11.glVertex2f(absoluteX, absoluteY);
GL11.glTexCoord2f((relTexX+1)/16, relTexY/16);
GL11.glVertex2f(absoluteX+16, absoluteY);
GL11.glTexCoord2f((relTexX+1)/16, (relTexY+1)/16);
GL11.glVertex2f(absoluteX+16, absoluteY+16);
GL11.glTexCoord2f(relTexX/16, (relTexY+1)/16);
GL11.glEnd();
Display.update();
System.out.println(x+" "+y+" "+texpos+" "+texfile+" "+camx+" "+camy);
}
}