⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 renderer.java

📁 NeHe用java与OpenGL结合教程源码
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
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 + -