Как я могу заставить KeyListener правильно работать с JOGL? - PullRequest
1 голос
/ 02 мая 2019

Я пытаюсь использовать KeyListener, чтобы конкретно изменить значение rtri и, следовательно, изменить работу моей анимации. Мой код вроде как во всем, так что заранее извините!

Я попытался создать экземпляр KeyListener внутри setup () и использовать .addKeyListener (), чтобы добавить его на холст.

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import javax.swing.JFrame;
import com.jogamp.opengl.GL2;
import com.jogamp.opengl.GLEventListener;
import com.jogamp.opengl.GLAutoDrawable;
import com.jogamp.opengl.GLCapabilities;
import com.jogamp.opengl.GLProfile;
import com.jogamp.opengl.awt.GLCanvas;
import com.jogamp.opengl.glu.GLU;
import com.jogamp.opengl.util.FPSAnimator;

public class Frame implements GLEventListener, KeyListener {

    public final double pi2 = (2 * Math.PI);
    private GLU glu = new GLU();
    private float rtri = 0.0f;
    private static ArrayList<Star> stars = new ArrayList<Star>();
    private static float zFloat = 1.0f;

    @Override
    public void keyPressed(KeyEvent e) {
        if (e.getKeyChar() == KeyEvent.VK_UP) {
            rtri += 0.5f;
            System.out.println(rtri);
            System.out.println("Increase");
        }
        else if (e.getKeyChar() == KeyEvent.VK_DOWN) {
            rtri -= 0.5f;
            System.out.println(rtri);
            System.out.println("Decrease");
        }
    }


    @Override
    public void keyReleased(KeyEvent e) {
    }

    @Override
    public void keyTyped(KeyEvent e) {  
    }

    @Override
    public void display(GLAutoDrawable drawable) {
            final GL2 gl = drawable.getGL().getGL2();

        gl.glClear( GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT );
        gl.glLoadIdentity(); // Reset The View
        gl.glTranslatef( 0.0f, 0.0f, -2.0f ); // Move the plane of stars

        gl.glRotatef( rtri, 0.0f, -2.0f, zFloat ); // Rotate the plane

        for (int sNum = 0; sNum < stars.size(); sNum++) {
            drawStar(stars.get(sNum), gl);
            }

        gl.glFlush();
            rtri+= 5.0f;

    }

    @Override
    public void dispose(GLAutoDrawable drawable) {

    }

    @Override
    public void init(GLAutoDrawable drawable) {
    }

    @Override
    public void reshape(GLAutoDrawable drawable, int x, int y, int width, 
        int height) {
        final GL2 gl = drawable.getGL().getGL2(); 
           // get the OpenGL 2 graphics object  
        if(height <=0)
        height =1;
           //preventing divided by 0 exception height =1;
        final float h = (float) width / (float) height;
           // display area to cover the entire window
        gl.glViewport(0, 0, width, height);
           //Transforms projection matrix
            gl.glMatrixMode(GL2.GL_PROJECTION);
            gl.glLoadIdentity();
            glu.gluPerspective( 45.0f, h, 1.0, 20.0 );
           //transforming model view gl.glLoadIdentity();
            gl.glMatrixMode(GL2.GL_MODELVIEW);
        gl.glLoadIdentity();
    }

    public void setup() {
        final GLProfile profile = GLProfile.get(GLProfile.GL2);
        GLCapabilities capabilities = new GLCapabilities(profile);


        final GLCanvas canvas = new GLCanvas(capabilities);
        Frame bFrame = new Frame();

        canvas.addGLEventListener(bFrame);
        canvas.addKeyListener(this);
        canvas.setSize(900, 900);

        final JFrame frame = new JFrame("Test Window");

        frame.add(canvas);
        frame.setSize(900, 900);
        frame.setVisible(true);

        final FPSAnimator animator = new FPSAnimator(canvas, 60,true);
        animator.start();
    }

    public static void main(String[] args) {
        new Frame().setup();

    }

}

В моем keyPressed я установил его так, чтобы, если бы я нажал стрелку вверх, он увеличил бы rtri, распечатал его значение и напечатал слово "Increase". Когда я запускаю программу, анимация работает нормально, но нажатие любой из клавиш не влияет на мою программу, и при этом они не печатают нужные элементы в консоли.

...