Note that there are some explanatory texts on larger screens.

plurals
  1. POkeyPressed event slow on first repeat
    primarykey
    data
    text
    <p>Okay so I am sorry for this being a really weird question but it is driving me insane.</p> <p>I handle my WASD movement for my game via:</p> <pre><code>Action ClassWASDKeyPressed = new ClassWASDKeyPressed(); Action ClassWASDKeyReleased = new ClassWASDKeyReleased(); BitKeys movementBitKeys = new BitKeys(); //for WASD movement key pressed/releases //pressed theDesktop.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("W"), "wButtonPress"); theDesktop.getActionMap().put("wButtonPress", ClassWASDKeyPressed); theDesktop.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("A"), "aButtonPress"); theDesktop.getActionMap().put("aButtonPress", ClassWASDKeyPressed); theDesktop.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("S"), "sButtonPress"); theDesktop.getActionMap().put("sButtonPress", ClassWASDKeyPressed); theDesktop.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("D"), "dButtonPress"); theDesktop.getActionMap().put("dButtonPress", ClassWASDKeyPressed); //released theDesktop.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("released W"), "wButtonRelease"); theDesktop.getActionMap().put("wButtonRelease", ClassWASDKeyReleased); theDesktop.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("released A"), "aButtonRelease"); theDesktop.getActionMap().put("aButtonRelease", ClassWASDKeyReleased); theDesktop.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("released S"), "sButtonRelease"); theDesktop.getActionMap().put("sButtonRelease", ClassWASDKeyReleased); theDesktop.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("released D"), "dButtonRelease"); theDesktop.getActionMap().put("dButtonRelease", ClassWASDKeyReleased); </code></pre> <p>Here are the two Action classes:</p> <pre><code>class ClassWASDKeyPressed extends AbstractAction { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { if (chatTextField.isFocusOwner() == false){ if (e.getActionCommand().equals("w")){ keyPressed(87); } else if(e.getActionCommand().equals("a")){ keyPressed(65); } else if(e.getActionCommand().equals("s")){ keyPressed(83); } else if(e.getActionCommand().equals("d")){ keyPressed(68); } } } } class ClassWASDKeyReleased extends AbstractAction { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { if (chatTextField.isFocusOwner() == false){ if (e.getActionCommand().equals("w")){ keyReleased(87); } else if(e.getActionCommand().equals("a")){ keyReleased(65); } else if(e.getActionCommand().equals("s")){ keyReleased(83); } else if(e.getActionCommand().equals("d")){ keyReleased(68); } } } } </code></pre> <p>And here is the logic for this:</p> <pre><code>public void keyPressed(int e) { long endTime = System.nanoTime(); long elapsedTime = endTime - startTime; double elapsedTimeSeconds = (double)elapsedTime / 1000000000.0; if (elapsedTimeSeconds &lt; .125){ //let them move 8 times a second logger.info("KeyPressed (QUICK): " + elapsedTimeSeconds); } else { logger.info("KeyPressed (VALID): " + elapsedTimeSeconds); //logger.debug("Key Pressed: " + e.getKeyChar()); //FOR TROUBLESHOOTING movementBitKeys.keyPressed(e); //movementBitKeys.showKeyList(); //FOR TROUBLESHOOTING if (movementBitKeys.isKeyPressed(87) &amp;&amp; !movementBitKeys.isKeyPressed(68) &amp;&amp; !movementBitKeys.isKeyPressed(83) &amp;&amp; !movementBitKeys.isKeyPressed(65)){ requestCharacterMove("North"); } if (movementBitKeys.isKeyPressed(87) &amp;&amp; movementBitKeys.isKeyPressed(68) &amp;&amp; !movementBitKeys.isKeyPressed(83) &amp;&amp; !movementBitKeys.isKeyPressed(65)){ requestCharacterMove("NorthEast"); } if (movementBitKeys.isKeyPressed(87) &amp;&amp; !movementBitKeys.isKeyPressed(68) &amp;&amp; !movementBitKeys.isKeyPressed(83) &amp;&amp; movementBitKeys.isKeyPressed(65)){ requestCharacterMove("NorthWest"); } if (!movementBitKeys.isKeyPressed(87) &amp;&amp; movementBitKeys.isKeyPressed(68) &amp;&amp; !movementBitKeys.isKeyPressed(83) &amp;&amp; !movementBitKeys.isKeyPressed(65)){ requestCharacterMove("East"); } if (!movementBitKeys.isKeyPressed(87) &amp;&amp; !movementBitKeys.isKeyPressed(68) &amp;&amp; movementBitKeys.isKeyPressed(83) &amp;&amp; !movementBitKeys.isKeyPressed(65)){ requestCharacterMove("South"); } if (!movementBitKeys.isKeyPressed(87) &amp;&amp; movementBitKeys.isKeyPressed(68) &amp;&amp; movementBitKeys.isKeyPressed(83) &amp;&amp; !movementBitKeys.isKeyPressed(65)){ requestCharacterMove("SouthEast"); } if (!movementBitKeys.isKeyPressed(87) &amp;&amp; !movementBitKeys.isKeyPressed(68) &amp;&amp; movementBitKeys.isKeyPressed(83) &amp;&amp; movementBitKeys.isKeyPressed(65)){ requestCharacterMove("SouthWest"); } if (!movementBitKeys.isKeyPressed(87) &amp;&amp; !movementBitKeys.isKeyPressed(68) &amp;&amp; !movementBitKeys.isKeyPressed(83) &amp;&amp; movementBitKeys.isKeyPressed(65)){ requestCharacterMove("West"); } startTime = endTime; } } public void keyReleased(int e) { //logger.debug("Key Released: " + e.getKeyChar()); //FOR TROUBLESHOOTING movementBitKeys.keyReleased(e); //movementBitKeys.showKeyList(); //FOR TROUBLESHOOTING } public void keyTyped(int e) { // not used - but in case I ever want it } </code></pre> <p>Also the BitSet class:</p> <pre><code>package com.jayavon.game.helper; import java.util.BitSet; public class BitKeys{ private BitSet keyBits = new BitSet(256); public void keyPressed(final int keyCode) { keyBits.set(keyCode); } public void keyReleased(final int keyCode) { keyBits.clear(keyCode); } public void keyTyped(final int keyCode) { // don't care } public boolean isKeyPressed(final int keyCode) { return keyBits.get(keyCode); } public void showKeyList(){ System.out.println(keyBits.toString()); } } </code></pre> <p>My problem is when you hold down one of the movement keys between the first and second 'movement' is much longer than the required .125 millisecond wait. Here is some sample data:</p> <p>Set 1:</p> <p>6059 [AWT-EventQueue-0] INFO com.jayavon.game.client.MyClient - KeyPressed (VALID): 2.567790275</p> <p>6620 [AWT-EventQueue-0] INFO com.jayavon.game.client.MyClient - KeyPressed (VALID): 0.560479937</p> <p>6670 [AWT-EventQueue-0] INFO com.jayavon.game.client.MyClient - KeyPressed (QUICK): 0.0504469 6710 [AWT-EventQueue-0] INFO com.jayavon.game.client.MyClient - KeyPressed (QUICK): 0.09360516 6750 [AWT-EventQueue-0] INFO com.jayavon.game.client.MyClient - KeyPressed (VALID): 0.129943376</p> <p>6791 [AWT-EventQueue-0] INFO com.jayavon.game.client.MyClient - KeyPressed (QUICK): 0.04009505 6821 [AWT-EventQueue-0] INFO com.jayavon.game.client.MyClient - KeyPressed (QUICK): 0.07098997 6851 [AWT-EventQueue-0] INFO com.jayavon.game.client.MyClient - KeyPressed (QUICK): 0.102378686 6902 [AWT-EventQueue-0] INFO com.jayavon.game.client.MyClient - KeyPressed (VALID): 0.152006677</p> <p>Set 2:</p> <p>9690 [AWT-EventQueue-0] INFO com.jayavon.game.client.MyClient - KeyPressed (VALID): 2.03802468</p> <p>10272 [AWT-EventQueue-0] INFO com.jayavon.game.client.MyClient - KeyPressed (VALID): 0.582025645</p> <p>10322 [AWT-EventQueue-0] INFO com.jayavon.game.client.MyClient - KeyPressed (QUICK): 0.054749323 10342 [AWT-EventQueue-0] INFO com.jayavon.game.client.MyClient - KeyPressed (QUICK): 0.069890042 10372 [AWT-EventQueue-0] INFO com.jayavon.game.client.MyClient - KeyPressed (QUICK): 0.100790212 10412 [AWT-EventQueue-0] INFO com.jayavon.game.client.MyClient - KeyPressed (VALID): 0.141337411</p> <p>10462 [AWT-EventQueue-0] INFO com.jayavon.game.client.MyClient - KeyPressed (QUICK): 0.049483458 10462 [AWT-EventQueue-0] INFO com.jayavon.game.client.MyClient - KeyPressed (QUICK): 0.049720381 10512 [AWT-EventQueue-0] INFO com.jayavon.game.client.MyClient - KeyPressed (QUICK): 0.098888524 10542 [AWT-EventQueue-0] INFO com.jayavon.game.client.MyClient - KeyPressed (VALID): 0.128729361</p> <p>And now time for the question. Obviously the first time you move the elapsed time is huge depending on how long, so that makes sense. What I dont get is why the second 'movement' is around .5 instead of closer to .125. As you can see from the data the third and fourth steps are firing so fast while holding down the key that they are less than .125.</p> <p>Can anyone help me out with this in any way? Any suggestions to improve my code in any way would be tremendous help indeed. Milliseconds count.</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload