Java 如何让KeyListener正确使用JOGL?
我试图使用KeyListener来更改一个值,特别是rtri,从而更改动画的工作方式。我的密码有点满了,所以提前道歉 我尝试在setup()中创建一个KeyListener实例,并使用.addKeyListener()将其添加到画布中Java 如何让KeyListener正确使用JOGL?,java,opengl,keylistener,jogl,Java,Opengl,Keylistener,Jogl,我试图使用KeyListener来更改一个值,特别是rtri,从而更改动画的工作方式。我的密码有点满了,所以提前道歉 我尝试在setup()中创建一个KeyListener实例,并使用.addKeyListener()将其添加到画布中 import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.util.ArrayList; import javax.swing.JFrame; import com
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();
}
}
import java.awt.event.KeyEvent;
导入java.awt.event.KeyListener;
导入java.util.ArrayList;
导入javax.swing.JFrame;
导入com.jogamp.opengl.GL2;
导入com.jogamp.opengl.GLEventListener;
导入com.jogamp.opengl.GLAutoDrawable;
导入com.jogamp.opengl.gl功能;
导入com.jogamp.opengl.GLProfile;
导入com.jogamp.opengl.awt.GLCanvas;
导入com.jogamp.opengl.glu.glu;
导入com.jogamp.opengl.util.FPSAnimator;
公共类框架实现了GLEventListener、KeyListener{
公开期末双pi2=(2*Math.PI);
私有GLU GLU=新GLU();
专用浮点数rtri=0.0f;
私有静态ArrayList stars=新ArrayList();
专用静态浮动zFloat=1.0f;
@凌驾
按下公共无效键(按键事件e){
if(e.getKeyChar()==KeyEvent.VK_UP){
rtri+=0.5f;
系统输出打印LN(rtri);
系统输出打印项次(“增加”);
}
else if(e.getKeyChar()==KeyEvent.VK_DOWN){
rtri-=0.5f;
系统输出打印LN(rtri);
系统输出打印项次(“减少”);
}
}
@凌驾
公共无效密钥已释放(密钥事件e){
}
@凌驾
public void keyTyped(KeyEvent e){
}
@凌驾
公共空白显示(GLAutoDrawable){
最终GL2 gl=drawable.getGL().getGL2();
gl.glClear(GL2.gl_颜色_缓冲_位| GL2.gl_深度_缓冲_位);
gl.glLoadIdentity();//重置视图
gl.glTranslatef(0.0f,0.0f,-2.0f);//移动恒星平面
gl.glRotatef(rtri,0.0f,-2.0f,zFloat);//旋转平面
对于(int sNum=0;sNum 如果(高度),则将关键侦听器添加到帧中。