Java 移动圆的滞后问题
所以我为我的计算机科学课做了一个游戏,几乎是做了一个青蛙游戏的修改版本,我首先在JPanel上画了一个圆圈来模拟青蛙的运动,我意识到在与按钮的交互之间有一个非常恼人的延迟。有没有人知道如何完全消除或减少滞后?任何提示或帮助都将不胜感激!这是迄今为止仅针对圆圈运动的代码,如果您看到可以做的任何改进,请随时留下您的评论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.*;
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中进行递增吗?是的,这很奇怪。它不会在某些时刻落后,而在其他时刻,当你改变方向时,它总是会发生