java - 获取键盘输入并用于变量事件

标签 java swing keyboard user-input key-bindings

我有一个游戏,其中有一艘可以在所有 6 个维度上移动的船。所有的物理工作都有效,但我无法将键盘输入转换为可变输出。我希望 4 个引擎具有可变功率。有没有人有任何好的想法/方法来捕获可用于轻松设置变量输出的键盘输入?到目前为止,我已经尝试让引擎加速用户按住键的时间越长,但它似乎工作得不是很好......

最佳答案

这是一个“真正”的基本示例。

概念是如果你按下1,它会增加第一个推进器的功率,如果你按下Shift+1,它会减少它。

23 同样控制其他推进器...

enter image description here

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Thrust {

    public static void main(String[] args) {
        new Thrust();
    }

    public Thrust() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private BufferedImage viper;
        private BufferedImage thrust;
        private BufferedImage maxThrust;

        private float[] power = new float[]{0f, 0f, 0f};

        public TestPane() {
            try {
                viper = ImageIO.read(getClass().getResource("/Viper01.png"));
                thrust = ImageIO.read(getClass().getResource("/ThrusterBurn01.png"));
                maxThrust = ImageIO.read(getClass().getResource("/MaxBurn01.png"));

                InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW);
                ActionMap am = getActionMap();

                im.put(KeyStroke.getKeyStroke(KeyEvent.VK_1, 0), "Thruster1Up");
                im.put(KeyStroke.getKeyStroke(KeyEvent.VK_1, KeyEvent.SHIFT_DOWN_MASK), "Thruster1Down");
                im.put(KeyStroke.getKeyStroke(KeyEvent.VK_2, 0), "Thruster2Up");
                im.put(KeyStroke.getKeyStroke(KeyEvent.VK_2, KeyEvent.SHIFT_DOWN_MASK), "Thruster2Down");
                im.put(KeyStroke.getKeyStroke(KeyEvent.VK_3, 0), "Thruster3Up");
                im.put(KeyStroke.getKeyStroke(KeyEvent.VK_3, KeyEvent.SHIFT_DOWN_MASK), "Thruster3Down");

                am.put("Thruster1Up", new ThrustAction(0, 0.1f));
                am.put("Thruster1Down", new ThrustAction(0, -0.1f));
                am.put("Thruster2Up", new ThrustAction(1, 0.1f));
                am.put("Thruster2Down", new ThrustAction(1, -0.1f));
                am.put("Thruster3Up", new ThrustAction(2, 0.1f));
                am.put("Thruster3Down", new ThrustAction(2, -0.1f));

            } catch (IOException exp) {
                exp.printStackTrace();
            }
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(1000, 400);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            if (viper != null && thrust != null && maxThrust != null) {
                Graphics2D g2d = (Graphics2D) g.create();

                int yOffset = (getHeight() - viper.getHeight()) / 2;

                Point port[] = new Point[]{new Point(574, 111), new Point(576, 159), new Point(574, 210)};
                for (int index = 0; index < 3; index++) {
                    BufferedImage image = thrust;
                    if (power[index] >= 1f) {
                        image = maxThrust;
                    }
                    float progress = Math.min(Math.max(0, power[index]), 1f);
                    int width = image.getWidth();
                    int minWidth = (int)(width * 0.1f);
                    width -= minWidth;
                    width = (int)(width - (width * (1f - progress)));
                    width = Math.max(minWidth, width);
                    int x = port[index].x;
                    int y = yOffset + port[index].y - (image.getHeight()/ 2);
                    image = image.getSubimage(image.getWidth() - width, 0, width, image.getHeight());
                    g2d.drawImage(image, x, y, this);
                }

                int x = 0;
                g2d.drawImage(viper, x, yOffset, this);
                g2d.dispose();
            }
        }

        public class ThrustAction extends AbstractAction {

            private int thruster;
            private float modifer;

            public ThrustAction(int thruster, float modifier) {
                this.thruster = thruster;
                this.modifer = modifier;
            }

            @Override
            public void actionPerformed(ActionEvent e) {
                power[thruster] += modifer;
                power[thruster] = Math.min(Math.max(power[thruster], 0f), 1f);
                repaint();
            }

        }

    }
}

关于java - 获取键盘输入并用于变量事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16158511/

相关文章:

java - 在调整小程序大小之前,JFrame 不会显示在 JApplet 中

java - 如果我打算打印非英文字符,我应该在编辑器 (NetBeans) 中使用什么编码

ios - 有没有办法在 iOS 7 中禁用键盘上的透明度?

Windows 10 Linux 子系统 : Can't type Pipe (|) Symbol in Bash

java - 如何在不使用 split 和 stringtokenizer 的情况下反转 java 字符串中的单词

java - 如何使用Gson库解析错误的JSON

java - 防止文本位于边框对象后面

java - 自定义最大化、最小化按钮

java - JButton 未显示在滚动 Pane 中

c++ - 检测一个键是否被按下,而不是它是否总是按下