简体   繁体   中英

How to stop object from moving while key is still pressed

I'm a beginner in Java programming & I am making an application requiring an object to move around a grid filled with squares.

The object should only move one square at a time and if the user wants to move into another square, they must press the key again. My move method is the following:

public void move() {
    x += dx;
    y += dy;
}

I am using the KeyListener interface to implement the keyPressed, keyTyped and keyReleased methods and I have conditions like the one in the fragment below inside KeyPressed

//KeyPressed
int c = e.getKeyCode();

if (c == KeyEvent.VK_UP) {
    player.setDy(-5);
}

This allows the object to move freely. However, it will clearly continue to move as long as the UP arrow is pressed.

Is there any way to have to object move up by say -5 once and then stop even if the key is still pressed?

I am unsure whether I need to change my move method or the KeyListener methods to do this.

I hope that I have been clear enough as to what I'm asking and I'd highly appreciate any pointers.

easiest would be to add a boolean to indicate, that a moving key is pressed

class member : boolean movingKeyPressed = false

in key pressed :

if (movingKeyPressed) {
   return;
} else {
   // do stuff
   movingKeyPressed = true;
}

in key released method :

movingKeyPressed = false;

first of all : you should use Synchronization if you call class-methods from within listeners like keyPressed or keyReleased - thats because your listener-method can be called from multiple threads so your class-method ( player.setDy() ) can (and will) be called in parallel - you will need to make sure that each call to setDy happens before the next one.

Also : keyTyped is much better in many cases : https://stackoverflow.com/a/7071810/351861

An example could look like this:

public void keyTyped(KeyEvent arg0) {
   if(arg0.getKeyCode() == KeyEvent.VK_UP)
   {
       synchronized(player)
       {
          player.setDy(-5);
       }
   }
}

this will call setDy sequentially and reliably. Now all you need to do is to make sure that setDy works as intended, hence sets the position only once

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM