java - AWT KeyListener slow reaction -


i creating simple game java swing. have problem - keylistener seems react bit choppy/slow. character moves using code:

// player control     public void keypressed(keyevent e) {         int key = e.getkeycode();         switch(key){         case(keyevent.vk_left): dx = -speed; break;         case(keyevent.vk_right): dx = speed; break;         case(keyevent.vk_up): dy = -speed; break;         case(keyevent.vk_down): dy = speed; break;         }     }  public void keyreleased(keyevent e) {     int key = e.getkeycode();     switch(key){     case(keyevent.vk_left): dx = 0; break;     case(keyevent.vk_right): dx = 0; break;     case(keyevent.vk_up): dy = 0; break;     case(keyevent.vk_down): dy = 0; break;     } }  // method performed each time before redrawing screen public void step() {     x += dx;     y += dy; } 

most of time fine, character stops while before reacting keyboard. how make keyboard input more smooth?

thanks answers! helped me on right track.

whats happening here, said in comment, following: if example holding right key - character moving right, press left key , starts moving left. if release right key xspeed reset 0 , keylistener has wait until keypressed() fired again, still holding left key. 'key repeat speed' set default , far understand can not adjusted.

so solution keep track of keys pressed, don't have drop character's speed 0 when right key released if still holding left key.

sorry bit cryptic example, trying keep code small:

// define keys: up, right, down, left // 0 - not pressed, 1 - pressed private int[] keys = {0, 0, 0, 0};  // player control public void keypressed(keyevent e) {     int key = e.getkeycode();     // set corresponding 'key indicator' 1 when pressed     switch(key){         case(keyevent.vk_left): dx = -speed; keys[3] = 1; break;          case(keyevent.vk_right): dx = speed; keys[1] = 1; break;         case(keyevent.vk_up): dy = -speed; keys[0] = 1; break;         case(keyevent.vk_down): dy = speed; keys[2] = 1; break;         case(keyevent.vk_space): fireon = true; break;     } }  public void keyreleased(keyevent e) {     int key = e.getkeycode();     // before resetting speed check if opposite key     // still pressed     switch(key){         case(keyevent.vk_left): if(keys[1]==0){dx = 0;} keys[3] = 0; break;         case(keyevent.vk_right): if(keys[3]==0){dx = 0;} keys[1] = 0; break;         case(keyevent.vk_up): if(keys[2]==0){dy = 0;} keys[0] = 0; break;         case(keyevent.vk_down): if(keys[0]==0){dy = 0;} keys[2] = 0; break;         case(keyevent.vk_space): fireon = false; break;     } } 

Comments