Я использую убунту. Способ, которым Ubuntu обрабатывает ввод с клавиатуры, отличается от того, что используется в Windows. В ubuntu после запуска события нажатия клавиши сразу после этого запускается событие отпускания клавиши, даже если вы не отпускаете клавишу. Эти ложные события Key Release затрудняют программирование игр, особенно программирование обнаружения столкновений. Каким бы совершенным ни был мой код, я не могу решить проблему.
В качестве доказательства, если вы просто напишете программу, которая будет выводить независимо от того, нажата клавиша или отпущена, вы увидите, что вывод в ubuntu будет выглядеть так: keyPressed > keyReleased > keyPressed > keyReleased и т. д., даже если вы не отпускаете ключ. Тогда как в окнах - Нажата клавиша > Нажата клавиша > Нажата клавиша > Нажата клавиша и так далее.
Вы знаете какой-нибудь способ справиться с этим?
Вот простой код, который прояснит мою проблему, если вы запустите это на Ubuntu: -
import java.awt.Dimension;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Strange extends JPanel implements KeyListener{
public Strange(){
this.setPreferredSize(new Dimension(500, 500));
addKeyListener(this);
setFocusable(true);
JFrame frame=new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(this);
frame.pack();
frame.setVisible(true);
}
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode()==KeyEvent.VK_LEFT)
System.out.println("left is pressed");
}
@Override
public void keyReleased(KeyEvent e) {
if(e.getKeyCode()==KeyEvent.VK_LEFT)
System.out.println("left is released");
}
@Override
public void keyTyped(KeyEvent e) {}
public static void main(String[] args){
new Strange();
}
}