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
Post a Comment