有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java KeyBinding可用于多箭头按键

此代码是否适用于多次按箭头键。它现在正在工作。向左向右走。然而,如果我同时按下左箭头键和右箭头键,我希望这个桨停止。我该怎么做

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();        
}
}

共 (1) 个答案

  1. # 1 楼答案

    如果链接方向只处于“无”状态,或者应该处于“无”状态,该怎么办

    如果按左键,则将显示:

    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 of movements,它包含所有活动的移动,因此如果它包含两个移动(右+左),将同时使用这两个移动,从而导致:

    if ( movements.contains(HorizontalMovement.RIGHT) )
        x = x + 2;
    if ( movements.contains(HorizontalMovement.LEFT) )
        x = x - 2;
    

    这两个条件都将得到满足,并且x保持x=(x+2)-2

    这里的全部代码(类GamePanel,无需编辑的大型机):

    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);
                }
            }
        }   
    }
    

    不要害怕询问有关此代码的问题