Итак, я делал игру для своего класса Computer Science, в значительной степени делая модифицированную версию игры Frogger, и я сначала начал с простого перемещения круга через 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);
}
}
О каком запасе вы говорите? Может быть, из-за того, что когда вы отпускаете одну кнопку, вы устанавливаете обе скорости x и y равными нулю? Что делать, если я держусь вверх и направо, а затем отпустил право, но держись за собой? –
Когда я нажимаю клавишу со стрелкой, он перемещает его 5 в направлении клавиши, а затем паузу около 2 секунд, затем он продолжает двигаться, и это происходит каждый раз, когда нажимается другая клавиша. –
И этот код вызывает это? Я действительно этого не ожидал. Вы уверены, что не делаете прирост с вашего KeyListener? –