此代码是否适用于多箭头按键。它现在正在运作。左右走。但是,如果我同时按下左右箭头键,我希望此拨片停止。我怎样才能做到这一点 ?
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class GamePanel extends JPanel {
// ENUM
public enum HorizontalMovement {
NONE,
LEFT,
RIGHT
}
// CONSTANTS
private static final int WIDTH = 600;
private static final int HEIGHT = 500;
private static final int PADDLE_Y = 475;
private static final int PADDLE_W = 80;
private static final int PADDLE_H = 20;
private static final int PADDLE_ARC = 15;
// PROPERTIES
int x = 0;
private HorizontalMovement horizontalMovement = HorizontalMovement.NONE;
private Timer timer;
// CONSTRUCTOR
public GamePanel() {
setSize(WIDTH, HEIGHT);
setBackground(new Color(240, 255, 255));
// right pressed
KeyStroke ks1 = KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0, false);
InputMap im1 = getInputMap(WHEN_IN_FOCUSED_WINDOW);
ActionMap am1 = getActionMap();
im1.put(ks1, "right.pressed");
am1.put("right.pressed", new MoveHorizontialAction(HorizontalMovement.RIGHT));
// right released
KeyStroke ks2 = KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0, true);
InputMap im2 = getInputMap(WHEN_IN_FOCUSED_WINDOW);
ActionMap am2 = getActionMap();
im2.put(ks2, "right.relesed");
am2.put("right.relesed", new MoveHorizontialAction(HorizontalMovement.NONE));
// left pressed
KeyStroke ks3 = KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0, false);
InputMap im3 = getInputMap(WHEN_IN_FOCUSED_WINDOW);
ActionMap am3 = getActionMap();
im3.put(ks3, "left.pressed");
am3.put("left.pressed", new MoveHorizontialAction(HorizontalMovement.LEFT));
// left released
KeyStroke ks4 = KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0, true);
InputMap im4 = getInputMap(WHEN_IN_FOCUSED_WINDOW);
ActionMap am4 = getActionMap();
im4.put(ks4, "left.relesed");
am4.put("left.relesed", new MoveHorizontialAction(HorizontalMovement.NONE));
// each 15 ms
timer = new Timer(15, new TimeListener());
timer.start();
}
// PADDLE
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g.setColor(new Color(201, 51, 51));
g.fillRoundRect(x, PADDLE_Y, PADDLE_W, PADDLE_H, PADDLE_ARC, PADDLE_ARC);
}
// Time Listener
protected class TimeListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
if ( horizontalMovement == HorizontalMovement.RIGHT )
x = x + 2;
if ( horizontalMovement == HorizontalMovement.LEFT )
x = x - 2;
if ( x < 0 )
x = 0;
else if ( x > 520 )
x = 520;
repaint();
}
}
// ACTION FOR ActionMap
protected class MoveHorizontialAction extends AbstractAction {
private HorizontalMovement movement;
public MoveHorizontialAction(HorizontalMovement movement) {
this.movement = movement;
}
@Override
public void actionPerformed(ActionEvent e) {
horizontalMovement = movement;
}
}
}
主要代码:
import java.awt.*;
import javax.swing.*;
public class MainFrame extends JFrame{
public MainFrame() {
// size
setSize(600, 500);
setLocationRelativeTo(null);
setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE);
// remove borders
setUndecorated(true);
getRootPane().setBorder(BorderFactory.createMatteBorder(2, 2, 2, 2, new Color(63, 134, 145)));
getContentPane().add( new GamePanel());
setVisible(true);
}
public static void main(String[] args) {
new MainFrame();
}
}
答案 0 :(得分:1)
仅在其中的chainging方向处于NONE状态,或者它应该处于NONE状态
如果按向左键,则为:
NONE->LEFT, LEFT
然后你按下右键:
LEFT->NONE, RIGHT
所以它会停止
@Override
public void actionPerformed(ActionEvent e) {
if(horizontalMovement==HorizontalMovement.NONE ||
movement==HorizontalMovement.NONE){
horizontalMovement = movement;
}else{
horizontalMovement = HorizontalMovement.NONE;
}
}
未经测试,只是一个想法
编辑修复顺利
为了平滑移动,我使用了包含所有活动动作的HashSet动作,因此如果它包含两个动作(右+左),则两者都会被使用,这会导致:
if ( movements.contains(HorizontalMovement.RIGHT) )
x = x + 2;
if ( movements.contains(HorizontalMovement.LEFT) )
x = x - 2;
两个条件都将满足,x保持x=(x+2)-2
这里的整个代码(类GamePanel,没有编辑的MainFrame):
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.HashSet;
public class GamePanel extends JPanel {
// ENUM
public enum HorizontalMovement {
NONE,
LEFT,
RIGHT
}
// CONSTANTS
private static final int WIDTH = 600;
private static final int HEIGHT = 500;
private static final int PADDLE_Y = 475;
private static final int PADDLE_W = 80;
private static final int PADDLE_H = 20;
private static final int PADDLE_ARC = 15;
private HashSet<HorizontalMovement> movements = new HashSet<HorizontalMovement>();
// PROPERTIES
int x = 0;
private Timer timer;
// CONSTRUCTOR
public GamePanel() {
setSize(WIDTH, HEIGHT);
setBackground(new Color(240, 255, 255));
// right pressed
KeyStroke ks1 = KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0, false);
InputMap im1 = getInputMap(WHEN_IN_FOCUSED_WINDOW);
ActionMap am1 = getActionMap();
im1.put(ks1, "right.pressed");
am1.put("right.pressed", new MoveHorizontialAction(true,HorizontalMovement.RIGHT));
// right released
KeyStroke ks2 = KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0, true);
InputMap im2 = getInputMap(WHEN_IN_FOCUSED_WINDOW);
ActionMap am2 = getActionMap();
im2.put(ks2, "right.relesed");
am2.put("right.relesed", new MoveHorizontialAction(false,HorizontalMovement.RIGHT));
// left pressed
KeyStroke ks3 = KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0, false);
InputMap im3 = getInputMap(WHEN_IN_FOCUSED_WINDOW);
ActionMap am3 = getActionMap();
im3.put(ks3, "left.pressed");
am3.put("left.pressed", new MoveHorizontialAction(true,HorizontalMovement.LEFT));
// left released
KeyStroke ks4 = KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0, true);
InputMap im4 = getInputMap(WHEN_IN_FOCUSED_WINDOW);
ActionMap am4 = getActionMap();
im4.put(ks4, "left.relesed");
am4.put("left.relesed", new MoveHorizontialAction(false,HorizontalMovement.LEFT));
// each 15 ms
timer = new Timer(15, new TimeListener());
timer.start();
}
// PADDLE
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g.setColor(new Color(201, 51, 51));
g.fillRoundRect(x, PADDLE_Y, PADDLE_W, PADDLE_H, PADDLE_ARC, PADDLE_ARC);
}
// Time Listener
protected class TimeListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
if ( movements.contains(HorizontalMovement.RIGHT) )
x = x + 2;
if ( movements.contains(HorizontalMovement.LEFT) )
x = x - 2;
if ( x < 0 )
x = 0;
else if ( x > 520 )
x = 520;
repaint();
}
}
// ACTION FOR ActionMap
protected class MoveHorizontialAction extends AbstractAction {
private HorizontalMovement movement;
private boolean add=true;
public MoveHorizontialAction(boolean add,HorizontalMovement movement) {
this.movement = movement;
this.add = add;
}
@Override
public void actionPerformed(ActionEvent e) {
if(add){
//System.out.println("Add: "+movement.name());
movements.add(movement);
}else{
//System.out.println("Rem: "+movement.name());
movements.remove(movement);
}
}
}
}
不要害怕询问有关此代码的内容