gui/src/main/java/com/github/kuangcp/tank/util/HoldingKeyEventMgr.java
package com.github.kuangcp.tank.util;
import com.github.kuangcp.tank.panel.TankGroundPanel;
import java.awt.event.KeyEvent;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
/**
* @author https://github.com/kuangcp on 2021-09-06 02:58
* @see TankGroundPanel#keyPressed
*/
public class HoldingKeyEventMgr {
public static HoldingKeyEventMgr instance = new HoldingKeyEventMgr();
// 允许多键同时被触发
private volatile boolean up;
private volatile boolean down;
private volatile boolean left;
private volatile boolean right;
private volatile boolean shot;
private volatile boolean ctrl;
private final Map<Integer, Runnable> releaseMap = new HashMap<>();
private final Map<Integer, Runnable> pressMap = new HashMap<>();
public HoldingKeyEventMgr() {
releaseMap.put(KeyEvent.VK_A, () -> this.left = false);
releaseMap.put(KeyEvent.VK_D, () -> this.right = false);
releaseMap.put(KeyEvent.VK_S, () -> this.down = false);
releaseMap.put(KeyEvent.VK_W, () -> this.up = false);
releaseMap.put(KeyEvent.VK_J, () -> this.shot = false);
releaseMap.put(KeyEvent.VK_CONTROL, () -> this.ctrl = false);
pressMap.put(KeyEvent.VK_A, () -> this.left = true);
pressMap.put(KeyEvent.VK_D, () -> this.right = true);
pressMap.put(KeyEvent.VK_S, () -> this.down = true);
pressMap.put(KeyEvent.VK_W, () -> this.up = true);
pressMap.put(KeyEvent.VK_CONTROL, () -> this.ctrl = true);
}
public void handleDirectPress(KeyEvent re) {
Optional.ofNullable(pressMap.get(re.getKeyCode())).ifPresent(Runnable::run);
}
public void handleRelease(KeyEvent re) {
Optional.ofNullable(releaseMap.get(re.getKeyCode())).ifPresent(Runnable::run);
}
public boolean isUp() {
return up;
}
public void setUp(boolean up) {
this.up = up;
}
public boolean isDown() {
return down;
}
public void setDown(boolean down) {
this.down = down;
}
public boolean isLeft() {
return left;
}
public void setLeft(boolean left) {
this.left = left;
}
public boolean isRight() {
return right;
}
public void setRight(boolean right) {
this.right = right;
}
public boolean isShot() {
return shot;
}
public void setShot(boolean shot) {
this.shot = shot;
}
public boolean isCtrl() {
return ctrl;
}
public void setCtrl(boolean ctrl) {
this.ctrl = ctrl;
}
public boolean hasPressMoveEvent() {
return up || down || left || right;
}
@Override
public String toString() {
return "ListenEventGroup{" +
"up=" + up +
", down=" + down +
", left=" + left +
", right=" + right +
", shot=" + shot +
'}';
}
}