Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.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_Swing_Jpanel_Paintcomponent_Keylistener - Fatal编程技术网

Java 移动圆的滞后问题

Java 移动圆的滞后问题,java,swing,jpanel,paintcomponent,keylistener,Java,Swing,Jpanel,Paintcomponent,Keylistener,所以我为我的计算机科学课做了一个游戏,几乎是做了一个青蛙游戏的修改版本,我首先在JPanel上画了一个圆圈来模拟青蛙的运动,我意识到在与按钮的交互之间有一个非常恼人的延迟。有没有人知道如何完全消除或减少滞后?任何提示或帮助都将不胜感激!这是迄今为止仅针对圆圈运动的代码,如果您看到可以做的任何改进,请随时留下您的评论 import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.awt.geom.*;

所以我为我的计算机科学课做了一个游戏,几乎是做了一个青蛙游戏的修改版本,我首先在JPanel上画了一个圆圈来模拟青蛙的运动,我意识到在与按钮的交互之间有一个非常恼人的延迟。有没有人知道如何完全消除或减少滞后?任何提示或帮助都将不胜感激!这是迄今为止仅针对圆圈运动的代码,如果您看到可以做的任何改进,请随时留下您的评论

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;

public class second extends JPanel implements ActionListener, KeyListener 
{
Timer t = new Timer (5, this);
double x = 0, y = 0, velx = 0, vely = 0;

public second()
{
    t.start();
    addKeyListener(this);
    setFocusable(true);
    setFocusTraversalKeysEnabled(false);
}

public void paintComponent (Graphics g)
{
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D) g;
    g2.fill(new Ellipse2D.Double(x, y, 10, 10));
}

public void actionPerformed (ActionEvent e)
{
    repaint();
    x += velx;
    y += vely;
}

public void up()
{
    vely = -5;
    velx = 0;
}

public void down()
{
    vely = 5;
    velx = 0;
}

public void left()
{
    velx = -5;
    vely = 0;
}

public void right()
{
    velx = 5;
    vely = 0;
}

public void upEnd()
{
    velx = 0;
    vely = 0;
}

public void downEnd()
{
    velx = 0;
    vely = 0;
}

public void leftEnd()
{
    velx = 0;
    vely = 0;
}

public void rightEnd()
{
    velx = 0;
    vely = 0;
}

public void keyPressed (KeyEvent e)
{
    int code = e.getKeyCode();
    if (code == KeyEvent.VK_UP)
    {
        up();
    }
    if (code == KeyEvent.VK_DOWN)
    {
        down();
    }
    if (code == KeyEvent.VK_RIGHT)
    {
        right();
    }
    if (code == KeyEvent.VK_LEFT)
    {
        left();
    }
}

public void keyTyped (KeyEvent e) {}

public void keyReleased (KeyEvent e) 
{
    int code = e.getKeyCode();
    if (code == KeyEvent.VK_UP)
    {
        upEnd();
    }
    if (code == KeyEvent.VK_DOWN)
    {
        downEnd();
    }
    if (code == KeyEvent.VK_RIGHT)
    {
        rightEnd();
    }
    if (code == KeyEvent.VK_LEFT)
    {
        leftEnd();
    }
}
}
这是主文件:

import javax.swing.JFrame;

public class Macheads
{
public static void main (String[] args)
{
    JFrame f = new JFrame();
    second s = new second();
    f.add(s);
    f.setVisible(true);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setSize(800,600);
}
}

尝试只使用keyListener而不使用计时器和actionlistener

public void keyPressed (KeyEvent e)
{
    int code = e.getKeyCode();
    if (code == KeyEvent.VK_UP)
    {
        up();
    }
    if (code == KeyEvent.VK_DOWN)
    {
        down();
    }
    if (code == KeyEvent.VK_RIGHT)
    {
        right();
    }
    if (code == KeyEvent.VK_LEFT)
    {
        left();
    }
     x += velx;
     y += vely;
    repaint(); //added and will repaint everytime key is pressed
}

//no need to place arguments in keyTyped and keyReleased because JPanel is repainted on keypressed...

不要使用KeyListener。相反,您应该使用键绑定


键盘具有重复事件的延迟。使用摆动计时器来安排动画,而不是依赖于要生成的关键点事件。有关更多信息和示例,请参阅。

您所说的是什么样的滞后?这可能是因为当你松开一个按钮时,你将x和y速度都设置为零?如果我向上向右,然后放开向右,但保持向上?当我按下箭头键时,它会向键的方向移动5,然后暂停大约2秒,然后继续移动,每次按下另一个键时都会发生这种情况。这段代码导致这种情况发生?我真的没想到会这样。你确定你没有从你的KeyListener中进行递增吗?是的,这很奇怪。它不会在某些时刻落后,而在其他时刻,当你改变方向时,它总是会发生