KeyListener和JOGL的问题

时间:2013-12-30 19:24:36

标签: input 2d keylistener jogl translate-animation

我正在尝试绑定一个键来在屏幕上翻译GL_QUAD。我创建了一个类,如下所示,它实现了KeyListener,在其中我有一个方法,在'd'的按键时,将四个顶点的x坐标加0.1。现在,我有两个与此相关的问题。

  1. 首先,它似乎没有做任何事情。按键时,对象没有任何反应。

  2. 有没有更好的方法来实现我想做的事情?我的最终目标是最终得到一个专注于相机的精灵,它可以在一个视觉上的2D游戏世界中移动。

  3. 感谢您的时间。

    代码:

    SpriteTest.java

    package com.mangostudios.spritetest;
    
    import java.awt.Frame;
    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 com.jogamp.opengl.util.FPSAnimator;
    
    public class SpriteTest 
    {
    
    
        public static void main(String[] args) {
            GLProfile glp = GLProfile.getDefault();
            GLCapabilities caps = new GLCapabilities(glp);
            GLCanvas canvas = new GLCanvas(caps);
    
            Frame frame = new Frame("AWT Window Test");
            frame.setSize(300, 300);
            frame.add(canvas);
            frame.setVisible(true);
    
            frame.addWindowListener(new WindowAdapter() {
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            });
    
            canvas.addGLEventListener(new Renderer());
    
            FPSAnimator animator = new FPSAnimator(canvas, 60);
            //animator.add(canvas);
            animator.start();
        }
    }
    

    Renderer.java

    package com.mangostudios.spritetest;
    
    import javax.media.opengl.GL2;
    import javax.media.opengl.GLAutoDrawable;
    import javax.media.opengl.GLEventListener;
    
    public class Renderer implements GLEventListener {
        InputListener input = new InputListener();
    
        @Override
        public void display(GLAutoDrawable drawable) {
            update();
            render(drawable);
        }
    
        @Override
        public void dispose(GLAutoDrawable drawable) {
        }
    
        @Override
        public void init(GLAutoDrawable drawable) {
        }
    
        @Override
        public void reshape(GLAutoDrawable drawable, int x, int y, int w, int h) {
        }
    
        private void update() {
        }
    
        private void render(GLAutoDrawable drawable) {
            GL2 gl = drawable.getGL().getGL2();
    
            // draw a triangle filling the window
            gl.glBegin(GL2.GL_QUADS);
            gl.glVertex2f( input.xTran, 0.1f);
            gl.glVertex2f( input.xTran,-0.1f); 
            gl.glVertex2f( -input.xTran, -0.1f);
            gl.glVertex2f( -input.xTran, 0.1f);
            gl.glEnd();
        }
    }
    

    InputListener.java

    package com.mangostudios.spritetest;
    
    import com.jogamp.newt.event.KeyEvent;
    import com.jogamp.newt.event.KeyListener;
    
    public class InputListener implements KeyListener{
        boolean loopBool = false;
        float xTran = 0.1f;
        float yTran = 0.1f;
        @Override
        public void keyPressed(KeyEvent d) {
            loopBool = true;
            while (loopBool = true) {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
    
        }
    
        @Override
        public void keyReleased(KeyEvent d) {
        }
    }
    

1 个答案:

答案 0 :(得分:1)

首先,你永远不会调用addKeyListener()。其次,你不应该在keyPressed()中加入无限循环。第三,使用NEWT KeyListener,而使用AWT GLCanvas:s使用GLWindow和NEWT KeyListener,或者使用带有AWT KeyListener的AWT GLCanvas或使用NewtCanvasAWT。最后,在编写自己的示例之前,请尝试mine on Wikipedia以了解其工作原理。