?? renderer.java
字號:
package demos.nehe.lesson32;import com.sun.opengl.util.BufferUtil;import javax.media.opengl.GL;import javax.media.opengl.GLAutoDrawable;import javax.media.opengl.GLEventListener;import javax.media.opengl.glu.GLU;import java.awt.*;import java.awt.geom.Rectangle2D;import java.io.IOException;import java.nio.ByteBuffer;import java.nio.IntBuffer;import java.util.ArrayList;import java.util.Collections;class Renderer implements GLEventListener { private GLU glu = new GLU(); private long previousTime = System.currentTimeMillis(); private ArrayList targets = new ArrayList(); private TextureImage[] textures; // Storage For 10 Textures private Rectangle2D.Float[] size = { new Rectangle2D.Float(0, 0, 1.0f, 1.0f), new Rectangle2D.Float(0, 0, 1.0f, 1.0f), new Rectangle2D.Float(0, 0, 1.0f, 1.0f), new Rectangle2D.Float(0, 0, 0.5f, 1.0f), new Rectangle2D.Float(0, 0, 0.75f, 1.5f) }; // User Defined Variables private int base; // Font Display List private float roll = 0.0f; // Rolling Clouds private int level = 1; // Current Level private int miss; // Missed Targets private int kills; // Level Kill Counter private int score; // Current Score private boolean isGameOver = true; // Game Over? private int mouseX; private int mouseY; private boolean isClicked = false; private boolean restart; private TargetType[] targetTypes; private void BuildFont(GL gl) { base = gl.glGenLists(95); // Creating 95 Display Lists gl.glBindTexture(GL.GL_TEXTURE_2D, textures[9].getTexID()); // Bind Our Font Texture for (int loop = 0; loop < 95; loop++) { float cx = (loop % 16) / 16.0f; // X Position Of Current Character float cy = (loop / 16) / 16.0f; // Y Position Of Current Character gl.glNewList(base + loop, GL.GL_COMPILE); // Start Building A List gl.glBegin(GL.GL_QUADS); // Use A Quad For Each Character { gl.glTexCoord2f(cx, 1.0f - cy - 0.0625f); gl.glVertex2i(0, 0); // Texture / Vertex Coord (Bottom Left) gl.glTexCoord2f(cx + 0.0625f, 1.0f - cy - 0.0625f); gl.glVertex2i(16, 0); // Texutre / Vertex Coord (Bottom Right) gl.glTexCoord2f(cx + 0.0625f, 1.0f - cy); gl.glVertex2i(16, 16); // Texture / Vertex Coord (Top Right) gl.glTexCoord2f(cx, 1.0f - cy); gl.glVertex2i(0, 16); // Texture / Vertex Coord (Top Left) } gl.glEnd(); // Done Building Our Quad (Character) gl.glTranslated(10, 0, 0); // Move To The Right Of The Character gl.glEndList(); // Done Building The Display List } // Loop Until All 95 Are Built } public Renderer() { } private ByteBuffer stringBuffer = BufferUtil.newByteBuffer(256); private void glPrint(GL gl, int x, int y, String string) // Where The Printing Happens { gl.glBindTexture(GL.GL_TEXTURE_2D, textures[9].getTexID()); // Select Our Font Texture gl.glDisable(GL.GL_DEPTH_TEST); // Disables Depth Testing gl.glMatrixMode(GL.GL_PROJECTION); // Select The Projection Matrix gl.glPushMatrix(); // Store The Projection Matrix gl.glLoadIdentity(); // Reset The Projection Matrix gl.glOrtho(0, 640, 0, 480, -1, 1); // Set Up An Ortho Screen gl.glMatrixMode(GL.GL_MODELVIEW); // Select The Modelview Matrix gl.glPushMatrix(); // Store The Modelview Matrix gl.glLoadIdentity(); // Reset The Modelview Matrix gl.glTranslated(x, y, 0); // Position The Text (0,0 - Bottom Left) gl.glListBase(base - 32);// + (128 * set)); // Choose The Font Set (0 or 1) if (stringBuffer.capacity() < string.length()) { stringBuffer = BufferUtil.newByteBuffer(string.length()); } stringBuffer.clear(); stringBuffer.put(string.getBytes()); stringBuffer.flip(); gl.glCallLists(string.length(), GL.GL_BYTE, stringBuffer); // Write The Text To The Screen gl.glMatrixMode(GL.GL_PROJECTION); // Select The Projection Matrix gl.glPopMatrix(); // Restore The Old Projection Matrix gl.glMatrixMode(GL.GL_MODELVIEW); // Select The Modelview Matrix gl.glPopMatrix(); // Restore The Old Projection Matrix gl.glEnable(GL.GL_DEPTH_TEST); // Enables Depth Testing } public void init(GLAutoDrawable drawable) { // gl.glAlphaFunc(GL_GREATER,0.1f); // Set Alpha Testing (disable blending) // gl.glEnable(GL_ALPHA_TEST); // Enable Alpha Testing (disable blending) GL gl = drawable.getGL(); targetTypes = new TargetType[]{ TargetType.FACE, TargetType.BUCKET, TargetType.TARGET, TargetType.COKE, TargetType.VASE }; textures = new TextureImage[10]; try { textures[0] = TGALoader.loadTGA(gl, "demos/data/images/BlueFace.tga"); // Load The BlueFace Texture textures[1] = TGALoader.loadTGA(gl, "demos/data/images/Bucket.tga"); // Load The Bucket Texture textures[2] = TGALoader.loadTGA(gl, "demos/data/images/Target.tga"); // Load The Target Texture textures[3] = TGALoader.loadTGA(gl, "demos/data/images/Coke.tga"); // Load The Coke Texture textures[4] = TGALoader.loadTGA(gl, "demos/data/images/Vase.tga"); // Load The Vase Texture textures[5] = TGALoader.loadTGA(gl, "demos/data/images/Explode.tga"); // Load The Explosion Texture textures[6] = TGALoader.loadTGA(gl, "demos/data/images/Ground.tga"); // Load The Ground Texture textures[7] = TGALoader.loadTGA(gl, "demos/data/images/Sky.tga"); // Load The Sky Texture textures[8] = TGALoader.loadTGA(gl, "demos/data/images/Crosshair.tga"); // Load The Crosshair Texture textures[9] = TGALoader.loadTGA(gl, "demos/data/images/Font.tga"); // Load The Font Texture } catch (IOException ex) { throw new RuntimeException(ex); } BuildFont(gl); // Build Our Font Display List gl.glClearColor(0.0F, 0.0F, 0.0F, 0.0F); // Black Background gl.glClearDepth(1.0F); // Depth Buffer Setup gl.glDepthFunc(GL.GL_LEQUAL); // Type Of Depth Testing gl.glEnable(GL.GL_DEPTH_TEST); // Enable Depth Testing gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA); // Enable Alpha Blending (disable alpha testing) gl.glEnable(GL.GL_BLEND); // Enable Blending (disable alpha testing) // gl.glAlphaFunc(GL_GREATER,0.1f); // Set Alpha Testing (disable blending) // gl.glEnable(GL_ALPHA_TEST); // Enable Alpha Testing (disable blending) gl.glEnable(GL.GL_TEXTURE_2D); // Enable Texture Mapping gl.glEnable(GL.GL_CULL_FACE); // Remove Back Face resetGame(); } public void display(GLAutoDrawable drawable) { long currentTime = System.currentTimeMillis(); update(currentTime - previousTime); previousTime = currentTime; GL gl = drawable.getGL(); gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer gl.glLoadIdentity(); // Reset The Modelview Matrix gl.glPushMatrix(); // Push The Modelview Matrix gl.glBindTexture(GL.GL_TEXTURE_2D, textures[7].getTexID()); // Select The Sky Texture gl.glBegin(GL.GL_QUADS); // Begin Drawing Quads { gl.glTexCoord2f(1.0f, roll / 1.5f + 1.0f); gl.glVertex3f(28.0f, +7.0f, -50.0f); // Top Right gl.glTexCoord2f(0.0f, roll / 1.5f + 1.0f); gl.glVertex3f(-28.0f, +7.0f, -50.0f); // Top Left gl.glTexCoord2f(0.0f, roll / 1.5f + 0.0f); gl.glVertex3f(-28.0f, -3.0f, -50.0f); // Bottom Left gl.glTexCoord2f(1.0f, roll / 1.5f + 0.0f); gl.glVertex3f(28.0f, -3.0f, -50.0f); // Bottom Right gl.glTexCoord2f(1.5f, roll + 1.0f); gl.glVertex3f(28.0f, +7.0f, -50.0f); // Top Right gl.glTexCoord2f(0.5f, roll + 1.0f); gl.glVertex3f(-28.0f, +7.0f, -50.0f); // Top Left gl.glTexCoord2f(0.5f, roll + 0.0f); gl.glVertex3f(-28.0f, -3.0f, -50.0f); // Bottom Left gl.glTexCoord2f(1.5f, roll + 0.0f); gl.glVertex3f(28.0f, -3.0f, -50.0f); // Bottom Right gl.glTexCoord2f(1.0f, roll / 1.5f + 1.0f); gl.glVertex3f(28.0f, +7.0f, 0.0f); // Top Right gl.glTexCoord2f(0.0f, roll / 1.5f + 1.0f); gl.glVertex3f(-28.0f, +7.0f, 0.0f); // Top Left gl.glTexCoord2f(0.0f, roll / 1.5f + 0.0f); gl.glVertex3f(-28.0f, +7.0f, -50.0f); // Bottom Left gl.glTexCoord2f(1.0f, roll / 1.5f + 0.0f); gl.glVertex3f(28.0f, +7.0f, -50.0f); // Bottom Right gl.glTexCoord2f(1.5f, roll + 1.0f); gl.glVertex3f(28.0f, +7.0f, 0.0f); // Top Right gl.glTexCoord2f(0.5f, roll + 1.0f); gl.glVertex3f(-28.0f, +7.0f, 0.0f); // Top Left gl.glTexCoord2f(0.5f, roll + 0.0f); gl.glVertex3f(-28.0f, +7.0f, -50.0f); // Bottom Left gl.glTexCoord2f(1.5f, roll + 0.0f); gl.glVertex3f(28.0f, +7.0f, -50.0f); // Bottom Right } gl.glEnd(); // Done Drawing Quads gl.glBindTexture(GL.GL_TEXTURE_2D, textures[6].getTexID()); // Select The Ground Texture gl.glBegin(GL.GL_QUADS); // Draw A Quad { gl.glTexCoord2f(7.0f, 4.0f - roll); gl.glVertex3f(27.0f, -3.0f, -50.0f); // Top Right gl.glTexCoord2f(0.0f, 4.0f - roll); gl.glVertex3f(-27.0f, -3.0f, -50.0f); // Top Left gl.glTexCoord2f(0.0f, 0.0f - roll); gl.glVertex3f(-27.0f, -3.0f, 0.0f); // Bottom Left gl.glTexCoord2f(7.0f, 0.0f - roll); gl.glVertex3f(27.0f, -3.0f, 0.0f); // Bottom Right } gl.glEnd(); // Done Drawing Quad drawTargets(gl); // Draw Our Targets gl.glPopMatrix(); // Pop The Modelview Matrix // Crosshair (In Ortho View) gl.glMatrixMode(GL.GL_PROJECTION); // Select The Projection Matrix gl.glPushMatrix(); // Store The Projection Matrix gl.glLoadIdentity(); // Reset The Projection Matrix gl.glOrtho(0, drawable.getWidth(), 0, drawable.getHeight(), -1, 1); // Set Up An Ortho Screen gl.glMatrixMode(GL.GL_MODELVIEW); // Select The Modelview Matrix gl.glTranslated(mouseX, drawable.getHeight() - mouseY, 0.0f); // Move To The Current Mouse Position drawObject(gl, 16, 16, textures[8].getTexID()); // Draw The Crosshair if (isClicked) { doSelection(gl); }
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -