2014-01-15 6 views
1

Итак, я делал игру для своего класса 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); 
} 
} 
+0

О каком запасе вы говорите? Может быть, из-за того, что когда вы отпускаете одну кнопку, вы устанавливаете обе скорости x и y равными нулю? Что делать, если я держусь вверх и направо, а затем отпустил право, но держись за собой? –

+0

Когда я нажимаю клавишу со стрелкой, он перемещает его 5 в направлении клавиши, а затем паузу около 2 секунд, затем он продолжает двигаться, и это происходит каждый раз, когда нажимается другая клавиша. –

+0

И этот код вызывает это? Я действительно этого не ожидал. Вы уверены, что не делаете прирост с вашего KeyListener? –

ответ

1

Не используйте KeyListener. Вместо этого вы должны использовать привязки клавиш.

Клавиатура имеет задержку для повторения событий. Используйте таймер Swing для планирования анимации вместо того, чтобы полагаться на генерируемые ключевые события. См. Motion Using the Keyboard для получения дополнительной информации и примеров.

0

Попробуйте использовать только 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... 
Смежные вопросы