Login  Register

addKeyListener cannot be added to GLAutoDrawable

Posted by Mohara on Apr 01, 2012; 6:01pm
URL: https://forum.jogamp.org/addKeyListener-cannot-be-added-to-GLAutoDrawable-tp3875604.html

Maze.java
MoveControl.java
Renderer.java
I can`t seem to be able to add a KeyListener to GLAutoDrawable. I read the this tutorial:
https://docs.google.com/file/d/0B9hhZie2D-fENGE3ZmZkOGItZGYzZC00ZDgzLTg0NTAtMTk1MTAwMzYxYzNk/edit?hl=en&pli=1
Also read the javadocs and it seems that GLAutoDrawable is indeed a component and should be able to receive a KeyListener.

I needed the GLAutoDrawable to receive key inputs so I can move things in my screen.
I am new here and with JOGL. Just learning everything as university homework and so, I would appreciate some help.

code:

package f091183.mohara.jogl.maze;

import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.media.opengl.GLCapabilities;
import javax.media.opengl.GLProfile;
import javax.media.opengl.awt.GLCanvas;
import javax.swing.JFrame;
import com.jogamp.opengl.util.*;
import f091183.mohara.jogl.maze.Renderer;

public class Maze{

        public static void main(String[] args)
    {
               
    // Setup OpenGL Default Version
    GLProfile profile = GLProfile.getDefault();
    GLCapabilities capabilities = new GLCapabilities(profile);
   
    // Setting canvas for the JFrame
    GLCanvas glcanvas = new GLCanvas();//capabilities);
    glcanvas.addGLEventListener(new Renderer());
    glcanvas.setSize( 800,600);// (1600, 900 );
   
    // Setting frame
        JFrame frame = new JFrame( "Labirinth" );
        frame.setSize( 800,600);// (1600, 900 );
        frame.add(glcanvas);
        //frame.setUndecorated(true); // hide window border
        frame.setVisible(true);
       
        // Close the program on windows close event
        frame.addWindowListener(new WindowAdapter()
        {
            public void windowClosing(WindowEvent ev)
            {
                System.exit(0);
            }
        });
       
        // Frame key listener
        frame.addKeyListener(new KeyAdapter()
        {

        public void keyPressed(KeyEvent e)
        {
        // Close on ESC key press
        if(e.getKeyCode()==KeyEvent.VK_ESCAPE)
        {
        new Thread(new Runnable()
        {
        public void run()
        {
        System.exit(0);
        }
        }).start();

        }
       
        if(e.getKeyCode()==KeyEvent.VK_S)
        {
        new Thread(new Runnable()
        {
        public void run()
        {
       
        double move=0.00833333333;
        //player.setPlayerY(Math.round( (player.getPlayerY()-move) * 10000.0 ) / 10000.0);
        }
        }).start();
       
        }
        }
                });
       
        // Animator to make game update loops
        FPSAnimator animator = new FPSAnimator(glcanvas, 1);
        animator.add(glcanvas);
        animator.start();
    }
}

// Maze class >> as in tutorials, it should process the data

package f091183.mohara.jogl.maze;

import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.media.opengl.GL2;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.awt;
 
class Renderer implements GLEventListener, KeyListener
{
        static final public char[] maze = {'w','w','w','w','w', 'w','w','w','w','w', 'w','w','w','w','w', 'w','w','w','w','w',
                                                                           'w',' ',' ',' ',' ', ' ',' ',' ',' ',' ', ' ',' ',' ',' ','w', ' ',' ',' ',' ','S',
                                                                           'w',' ','w','w','w', 'w','w','w','w',' ', 'w',' ','w',' ',' ', ' ','w',' ','w','w',
                                                                           'w',' ',' ','w',' ', ' ',' ',' ','w',' ', ' ',' ','w',' ','w', ' ','w','w','w','w',
                                                                           'w',' ','w','w','w', 'w',' ','w','w','w', 'w','w','w','w','w', 'w','w',' ',' ','w',  
                                                 /*ln 5*/   'w',' ',' ',' ',' ', ' ',' ',' ',' ',' ', ' ',' ',' ',' ',' ', ' ','w','w',' ','w',
                                                                           'w','w','w','w','w', 'w','w','w','w','w', 'w','w','w','w','w', ' ','w',' ',' ','w',
                                                                           'w',' ',' ',' ',' ', ' ',' ',' ',' ',' ', ' ',' ',' ',' ','w', ' ','w','w',' ','w',
                                                                           'w',' ','w',' ','w', 'w','w','w','w','w', 'w','w','w',' ',' ', ' ',' ','w',' ','w',
                                                                           'w',' ','w',' ',' ', ' ',' ',' ',' ',' ', ' ',' ','w','w','w', 'w','w','w',' ','w',
                                                        /*ln 10*/  'w',' ','w',' ','w', 'w','w','w','w','w', 'w',' ','w',' ',' ', ' ',' ',' ',' ','w',
                                                                           'w',' ','w','w','w', ' ',' ',' ',' ',' ', 'w',' ','w',' ','w', 'w','w','w','w','w',
                                                                           'w',' ',' ',' ',' ', ' ','w','w','w',' ', 'w',' ','w',' ',' ', ' ',' ',' ',' ','w',
                                                                           'w','w','w','w','w', 'w','w',' ','w',' ', 'w',' ','w','w','w', ' ','w','w',' ','w',
                                                                           'w',' ',' ',' ',' ', ' ',' ',' ','w',' ', 'w',' ','w',' ',' ', ' ','w',' ',' ','w',
                                              /*ln 15*/    'w',' ','w','w',' ', 'w','w','w','w',' ', 'w',' ','w',' ','w', 'w','w','w','w','w',
                                                                           'w',' ',' ','w',' ', 'w',' ',' ',' ',' ', 'w',' ','w',' ',' ', ' ','w',' ',' ','w',
                                                                           'w','w',' ','w',' ', 'w','w','w','w',' ', 'w',' ','w','w','w', ' ','w','w',' ','w',
                                                                           'w',' ',' ','w',' ', ' ',' ',' ',' ',' ', 'w',' ',' ',' ',' ', ' ',' ',' ',' ','w',
                                                                           'w','E','w','w','w', 'w','w','w','w','w', 'w','w','w','w','w', 'w','w','w','w','w',
                                                                                }; //      y 5  y 10 y 15
        public static MoveControl player = new MoveControl();
   
        // Canvas initialization
        public void init(GLAutoDrawable gLDrawable)
    {  
    System.out.println("init() called");
        GL2 gl = gLDrawable.getGL().getGL2();
        gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f );
        gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT);
       
    }
   
    // Canvas action
    public void display(GLAutoDrawable gLDrawable)
    {
    update(gLDrawable);
        render(gLDrawable);
    }
   
    // Reads the changes in the screen
    private void update(GLAutoDrawable gLDrawable)
    {
    double move = 0.00833333333;
    int mazeXY=0;
  /*
    player.setPlayerY(Math.round( (player.getPlayerY()-move) * 10000.0 ) / 10000.0);
     */
    System.out.println("pY: " + player.getPlayerY());
    // Position of player in maze. Checking for wall after >>move Y-<<
    for(double counterX=0.9; counterX >=-1; counterX=counterX-0.1)
    {
     
    for(double counterY=0.9; counterY >=-1; counterY=counterY-0.1, mazeXY++)
    {
      double XP = Math.round(player.getPlayerX()* 100.0 ) / 100.0;
      double XC = Math.round(counterX*100.0) / 100.0;
      double YP = Math.round(player.getPlayerY()* 100.0 ) / 100.0;
      double YC = Math.round(counterY*100.0) / 100.0;
      if( (XP == XC) && (YP == YC))
      {
      if(maze[mazeXY+20]== 'w')
      {
      player.setPlayerY(Math.round( (player.getPlayerY()+move) * 10000.0 ) / 10000.0);
      }
     
      }
 
    }
    }
    }

        // Rends the canvas
    private void render(GLAutoDrawable gLDrawable)
    {
        GL2 gl = gLDrawable.getGL().getGL2();
        int mazeXY=0;
       
        // CLear screen
        gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f );
        gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT);
        gl.glLoadIdentity();

        // Draw the maze with walls
        for(double counterX=0.9; counterX >=-1; counterX=counterX-0.1)
        {
       
        for(double counterY=0.9; counterY >=-1; counterY=counterY-0.1, mazeXY++)
            {
        // Check if position is a wall
        if(maze[mazeXY]=='w')
        {
                //The wall
                    gl.glTranslated(0.05, 0.05, 0);
                gl.glBegin(GL2.GL_QUADS);
                    gl.glColor3f(1, 0, 0);
                    gl.glVertex2d(counterX-0.05, counterY-0.05); // [ - ; - ]
                gl.glColor3f(0, 0, 1);
                gl.glVertex2d(counterX+0.05, counterY-0.05);   // [ + ; - ]
                                gl.glColor3f(1, 1, 0);
                                gl.glVertex2d(counterX+0.05, counterY+0.05);   // [ + ; + ]
                                gl.glColor3f(0, 1, 0);
                                gl.glVertex2d(counterX-0.05, counterY+0.05);   // [ - ; + ]
        }
            }      
        }
       
      //The wall
    gl.glTranslated(0.05, 0.05, 0);
                gl.glBegin(GL2.GL_QUADS);
    gl.glColor3f(1, 1, 1);
    gl.glVertex2d(player.getPlayerX()-0.033, player.getPlayerY()-0.033); // [ - ; - ]
                gl.glVertex2d(player.getPlayerX()+0.033, player.getPlayerY()-0.033);   // [ + ; - ]
        gl.glVertex2d(player.getPlayerX()+0.033, player.getPlayerY()+0.033);   // [ + ; + ]
        gl.glVertex2d(player.getPlayerX()-0.033, player.getPlayerY()+0.033);   // [ - ; + ]
       
        gl.glFlush();
        gl.glEnd();
    }
 
 
    public void displayChanged(GLAutoDrawable gLDrawable, boolean modeChanged, boolean deviceChanged)
    {}
 
    // Reshape canvas
    public void reshape(GLAutoDrawable gLDrawable, int x, int y, int width, int height)
    {
    /*System.out.println("reshape() called: x = "+x+", y = "+y+", width = "+width+", height = "+height);
        final GL2 gl = gLDrawable.getGL().getGL2();
 
        if (height <= 0) // avoid a divide by zero error!
        {
            height = 1;
        }
 
        final float h = (float) width / (float) height;
 
        gl.glViewport(0, 0, width, height);
        gl.glMatrixMode(GL2.GL_PROJECTION);
        gl.glLoadIdentity();
        gl.glPerspective(45.0f, h, 1.0, 20.0);
        gl.glMatrixMode(GL2.GL_MODELVIEW);
        gl.glLoadIdentity();*/
    }
 
        public void dispose(GLAutoDrawable arg0)
        {}

        @Override
        public void keyTyped(KeyEvent paramKeyEvent)
        { }

        @Override
        public void keyPressed(KeyEvent e)
        {
               
    if(e.getKeyCode()==KeyEvent.VK_S)
    {
    double move=0.00833333333;
   
                                player.setPlayerY(Math.round( (player.getPlayerY()-move) * 10000.0 ) / 10000.0);
    }
               
        }

        @Override
        public void keyReleased(KeyEvent paramKeyEvent) {
                // TODO Auto-generated method stub
               
        }

}

// Class to that works with the position of the "player"
public class MoveControl
{
        // Initial player position
        private double playerX=-0.9;
        private double playerY=0.8;
       
        // Return the playerX
        public double getPlayerX() {
                return playerX;
        }

        // Set playerX
        public void setPlayerX(double playerX) {
                this.playerX = playerX;
        }

    // Return the playerY
        public double getPlayerY() {
                return playerY;
        }
       
        // Set playerY
        public void setPlayerY(double playerY) {
                this.playerY = playerY;
        }
       
}