Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 多边形变化的实时响应_Java_Opengl_Jogl - Fatal编程技术网

Java 多边形变化的实时响应

Java 多边形变化的实时响应,java,opengl,jogl,Java,Opengl,Jogl,我对重绘函数或我的实现有问题 一个KeyListener(awt)连接到我的画布上,我想立即更新多边形的位置,但当我按下按钮半秒钟左右时,它会出现问题。所以它的反应不是很快 @Override public void keyPressed(KeyEvent e) { int keyCode = e.getKeyCode(); if (keyCode == KeyEvent.VK_W) { testBox.goVertical(1); }

我对重绘函数或我的实现有问题

一个KeyListener(awt)连接到我的画布上,我想立即更新多边形的位置,但当我按下按钮半秒钟左右时,它会出现问题。所以它的反应不是很快

    @Override
public void keyPressed(KeyEvent e)
{
    int keyCode = e.getKeyCode();
    if (keyCode == KeyEvent.VK_W)
    {
        testBox.goVertical(1);
    }
    if (keyCode == KeyEvent.VK_S)
    {
        testBox.goVertical(-1);
    }
    if (keyCode == KeyEvent.VK_A)
    {
        testBox.goHorizontal(-1);
    }
    if (keyCode == KeyEvent.VK_D)
    {
        testBox.goHorizontal(1);
    }
    testBox.calculatePosition();
    canvas.repaint(1);
}
这是我按键的方法。它更新一个名为TestBox的类的实例。 在此方法中,我希望重新计算多边形的位置:

[..]    
private float vertical_speed;
    private float horizontal_speed;
    private long lastTimestamp;

    public void calculatePosition()
    {
        if (lastTimestamp != 0)
        {
            long newTimestamp = System.nanoTime();
            position_y += (newTimestamp - lastTimestamp) * 0.1 / 1000 * vertical_speed;
            position_x += (newTimestamp - lastTimestamp) * 0.1 / 1000 * horizontal_speed;
            System.out.println(newTimestamp - lastTimestamp);
        }
        lastTimestamp = System.nanoTime();
    }

    public void goVertical(float speed)
    {
        vertical_speed = speed;
        lastTimestamp = System.nanoTime();
    }

    public void goHorizontal(float speed)
    {
        horizontal_speed = speed;
        lastTimestamp = System.nanoTime();
    }
[..]
System.print显示此信息列表:

3687 527 527 527

为什么会出现3687纳米级

我在维护画布的类的构造函数中将动画设置为每秒60帧:

canvas.getAnimator().setUpdateFPSFrames(60, null);

你能帮我吗?

只需观察一下,对底层的本机资源和画布进行重新绘制(1)我应该用什么来代替awt keyListener?但是如果你需要一个gui,它可能会有问题,是吗?那么我会说,现在就坚持使用awt。通过调用
gl.glSetSwapInterval(0)
,设置
animator.runasfastasposable(true)
禁用
init()
中的vsync,并检查在按住按钮一秒钟或不调用repaint()时调用函数
calculatePosition()
的频率,请使用最简单的animator(不要使用FPSAnimator)。无需立即更新多边形,因为动画师已经定期调用GLAutoDrawable.display()。您应该学习一些3D引擎中如何管理关键事件,特别是JogAmp的Ardor3D延续(我维护的).Input和rendering是分开的。只需对底层本机资源和
画布进行一次观察。如果您有动画师,则不需要重新绘制(1);
,我应该使用什么来代替awt keyListener?,但如果您需要gui,则可能会出现问题,是吗?然后我会说暂时使用awt。在
init()中禁用vsync
通过调用
gl.glSetSwapInterval(0)
,设置
animator.runasfastasposable(true)
并检查当您按住按钮一秒钟或不调用repaint()时调用函数
calculatePosition()
的频率,请使用最简单的animator(不要使用FPSAnimator)。无需立即更新多边形,因为动画师已经定期调用GLAutoDrawable.display()。您应该学习一些3D引擎中如何管理关键事件,特别是JogAmp的Ardor3D延续(我维护)。输入和渲染是分开的。