Хорошо, я все еще думаю, что полная перестройка логики вашей игры в порядке, но я думаю, что могу пролить свет на то, что происходит.Давайте посмотрим на различные места, где что-то происходит:
- PAINT: В потоке Swing, когда вызывается
paint()
, вы увидите, были ли столкновения, и если да, обнулите скорости (если предположить, что выисправить это, если заблокировать). - КЛЮЧ: В Swing-потоке, когда нажата клавиша, вы устанавливаете скорость в соответствии с нажатой клавишей.
- ПРОВЕРКА: В каком-то неизвестном месте вы проверяетедля столкновений и запишите, был ли он.
- MOVE: В какой-то неизвестный момент вы обновляете позицию своего "парня" со скоростью.
Так вот проблема: в Java,Как и любая другая программа, вы получаете несколько нажатий клавиш, когда вы удерживаете клавишу.Между первым и вторым будет небольшая задержка, а затем они будут быстро повторяться.Попробуйте в текстовом поле в вашем браузере, там происходит то же самое.
Так как это влияет на вас?Ну, вы, вероятно, попадаете в такой сценарий:
PAINT -> speed set to zero
KEY -> speed set back to -2
MOVE -> guy is moved -2
CHECK -> border = false
PAINT -> speed set to zero again
Действительно, если вы реструктурируете код так, чтобы получить игровой цикл, который выглядит примерно так:
public void runGame() {
while(true) {
updateSpeeds();
updatePositionFromSpeed();
repaint();
}
}
Где updateSpeeds()
вместо этого запросит, нажата ли клавиша или нет, а также вычислит, может ли парень двигаться в этом направлении, а updatePositionFromSpeed()
обновит позицию парня.Тогда paint()
будет полагаться только на координаты x
и y
этого парня, не будет писать им и не будет нуждаться в информации о скорости.