Support Forums

Full Version: First JOGL Application
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Last night I decided to download JOGL, so this app is more of an experimentation of how it works. Not too hard when you get help from a resource, but nonetheless very cool to work with. Next im planning on adding shapes through an ArrayList and individually giving them actions via a KeyHandler.

Src

Code:
package org.yourorghere;

import com.sun.opengl.util.Animator;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.*;
import javax.media.opengl.*;
import javax.media.opengl.glu.GLU;

public class JOGLApp extends JFrame implements KeyListener, GLEventListener {

    // Causes our JOGL app to be animated- that is, it keeps calling display()
    static Animator anim = null;
        static final JOGLApp app = new JOGLApp();
        boolean rotateOn = false;
        float shapeSpeed, rotate = 0f;

    public static void main(String[] args) {
        // Creates the window in another thread
        SwingUtilities.invokeLater (
                new Runnable() {
                    public void run() {
                        // Removes the normal title bar. Most games do this.
                        app.setUndecorated(true);
                        app.setVisible(true);
                                                // Fullscreen mode
                                                Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
                                                app.setSize(screen.width, screen.height);
                    }
                }
        );

        // Starts the Animator in a new thread.
        SwingUtilities.invokeLater (
                new Runnable() {
                    public void run() {
                        anim.start();
                    }
                }
        );
    }

    public JOGLApp() {
        // Set the JFrame title
        super("JOGL Application");

        // Kill the process when the JFrame is closed
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        GLCapabilities glCaps = new GLCapabilities();
        GLCanvas glCanvas = new GLCanvas(glCaps);
        glCanvas.addGLEventListener(this);

        // Add the GLCanvas just like we would any Component
        getContentPane().add(glCanvas, BorderLayout.CENTER);
                addKeyListener(this);
        anim = new Animator(glCanvas);
    }

    public void keyTyped(KeyEvent e) {
    }

    public void keyPressed(KeyEvent e) {
        char keyChar = e.getKeyChar();
        if (keyChar == KeyEvent.VK_ENTER)
            destruct();
        if (keyChar == KeyEvent.VK_SPACE)
            if (rotateOn == false)
                rotateOn = true;
            else
                rotateOn = false;
        if (keyChar == KeyEvent.VK_BACK_SPACE)
            shapeSpeed += .1;
    }

    public void keyReleased(KeyEvent e) {
    }

    // Only put stuff here that should happen once, at the beginning of the program
    public void init(GLAutoDrawable gld) {
        GL gl = gld.getGL();
        GLU glu = new GLU();

        gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

        gl.glViewport(0,0,500,300);
        gl.glMatrixMode(GL.GL_PROJECTION);
        gl.glLoadIdentity();
        glu.gluPerspective(45.0f, 800.0f / 600.0f, 1.0f, 500.0f);
        gl.glMatrixMode(GL.GL_MODELVIEW);
    }

    GL createShape1(GL gl) {
           gl.glBegin(GL.GL_TRIANGLES);
           gl.glColor3f(1.0f, 0.0f, 0.0f);
           gl.glVertex3f( 0.0f, 1.5f,0.0f);
           gl.glVertex3f(-1.0f,-1.0f,0.0f);
           gl.glVertex3f( 1.0f,-1.0f,0.0f);
           return gl;
    }

    GL createShape2(GL gl) {
           gl.glBegin(GL.GL_TRIANGLES);
           // Right Side Facing Front
           gl.glColor3f(0.0f, 1.0f, 1.0f);
           gl.glVertex3f(0.0f, 1.0f, 0.0f);
           gl.glColor3f(0.0f, 0.0f, 1.0f);
           gl.glVertex3f(1.0f, -1.0f, 1.0f);
           gl.glColor3f(0.0f, 0.0f, 0.0f);
           gl.glVertex3f(0.0f, -1.0f, -1.0f);
           // Left Side Facing Front
           gl.glColor3f(0.0f, 1.0f, 1.0f);
           gl.glVertex3f(0.0f, 1.0f, 0.0f);
           gl.glColor3f(0.0f, 0.0f, 1.0f);
           gl.glVertex3f(0.0f, -1.0f, -1.0f);
           gl.glColor3f(0.0f, 0.0f, 0.0f);
           gl.glVertex3f(-1.0f, -1.0f, 1.0f);
           // Bottom
           gl.glColor3f(0.0f, 1.0f, 1.0f);
           gl.glVertex3f(-1.0f, -1.0f, 1.0f);
           gl.glColor3f(0.0f, 0.0f, 1.0f);
           gl.glVertex3f(1.0f, -1.0f, 1.0f);
           gl.glColor3f(0.0f, 0.0f, 0.0f);
           gl.glVertex3f(0.0f, -1.0f, -1.0f);
           return gl;
    }

    // This function will get called repeatedly by the Animator. Think of it as your game loop.
    public void display(GLAutoDrawable gld) {
           GL gl = gld.getGL();
           gl.glLoadIdentity();
           gl.glTranslatef(0.0f,0.0f,-5f);
           gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
           if (!rotateOn) {
               gl.glRotatef(rotate, 1.0f, 0.0f, 0.0f);
               gl.glRotatef(rotate, 0.0f, 1.0f, 0.0f);
               gl.glRotatef(rotate, 0.0f, 0.0f, 1.0f);
               gl.glRotatef(rotate, 0.0f, 1.0f, 0.0f);
               rotate = rotate + 0;
           } else if (rotateOn && shapeSpeed == 0) {
               gl.glRotatef(rotate, 1.0f, 0.0f, 0.0f);
               gl.glRotatef(rotate, 0.0f, 1.0f, 0.0f);
               gl.glRotatef(rotate, 0.0f, 0.0f, 1.0f);
               gl.glRotatef(rotate, 0.0f, 1.0f, 0.0f);
               rotate = rotate + shapeSpeed + .1f;
           } else if (rotateOn && shapeSpeed > 0) {
               gl.glRotatef(rotate, 1.0f, 0.0f, 0.0f);
               gl.glRotatef(rotate, 0.0f, 1.0f, 0.0f);
               gl.glRotatef(rotate, 0.0f, 0.0f, 1.0f);
               gl.glRotatef(rotate, 0.0f, 1.0f, 0.0f);
               rotate = rotate + shapeSpeed;
           }

           createShape1(gl);
           createShape2(gl);

           gl.glEnd();
    }

    public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) {
    }

    public void displayChanged(GLAutoDrawable drawable, boolean modeChanged, boolean deviceChanged) {
    }

    static void destruct() {
           anim.stop();
    app.dispose();
    System.exit(0);
    }
        
}

How it works is you start it up, and it will go into fullscreen mode. Two shapes will appear. Use the spacebar to begin/stop rotating of the two shapes. The backspace will slightly increase the speed of the rotation everytime. Enter closes the app.

[Image: rtartwery.png]

You MUST have JOGL to run this!
Have fun. Smile
Neat, hope you turn it into something epic!
As do I, soon enough.