java - 协助关键事件

标签 java swing key coordinates keyevent

我正在为一个类(class)项目制作一款平台游戏,到目前为止我所能做的就是将鸡角色添加到游戏中。我需要能够让他按“D”或右箭头向前移动。我的代码是:

public class Main extends JFrame {
    public Main(){

        //Creates Title Image 
        JLabel title = new JLabel(" ");
        ImageIcon tl = new ImageIcon("title.gif");
        title.setIcon(tl);

        //Creates Start Image
        final JButton start = new JButton("");
        ImageIcon st = new ImageIcon("start.gif");
        start.setIcon(st);

        //Creates Options Image
        JButton options = new JButton("");
        ImageIcon opt = new ImageIcon("options.gif");
        options.setIcon(opt);
        options.setBackground(Color.BLACK);

        //Create first frame for "Start" button
        final JPanel p1 = new JPanel();
        p1.setLayout(new GridLayout(1, 1));
        p1.add(start, BorderLayout.CENTER);

        //Create second panel for title label
        final JPanel p2 = new JPanel(new BorderLayout());
        p2.setLayout(new GridLayout(1, 3));
        p2.add(title, BorderLayout.WEST);

        //Create third panel for "Options" button
        final JPanel p3 = new JPanel(new BorderLayout());
        p3.setLayout(new GridLayout(1, 1));
        p3.add(options, BorderLayout.SOUTH);

        //Creates fourth panel to organize all other primary
        final JPanel p4 = new JPanel(new BorderLayout());
        p4.setLayout(new GridLayout(1, 3));
        p4.add(p1, BorderLayout.WEST);
        p4.add(p2, BorderLayout.CENTER);
        p4.add(p3, BorderLayout.EAST);


        //When button is clicked, it changes the level
        start.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if(start.isEnabled()) {
                    remove(p4);
                    setSize(1440, 500);
                    add(new ContentPanel1());
                    validate();
                }
                else {
                    return;
                }
            }
        });

        //Adds fourth panel to frame
        add(p4, BorderLayout.CENTER);
    }

    public static void main(String arg[]) {
        Main frame = new Main();

        //Finds screen size of monitor
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();

        //Creates the frame
        frame.setTitle("Cockadoodle Duty: Awakening");
        frame.setSize(screenSize);
        frame.setLocale(null); 
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        String background = "#000000";
        frame.setBackground(Color.decode(background));
    }
}

class coordinate {
    public static int x;
    public static int y;
}

class ContentPanel1 extends JPanel{
    Image back = Toolkit.getDefaultToolkit().getImage("level0.gif");
    Image chick = Toolkit.getDefaultToolkit().getImage("chicken.gif");

    ContentPanel1() {
        MediaTracker mt = new MediaTracker(this);

        mt.addImage(back, 0);
        try {
            mt.waitForAll();
        } catch (InterruptedException e){
            e.printStackTrace();
        }
    }

    public void paintComponent(Graphics g){
        coordinate.x = 20;
        coordinate.y = 321;

        super.paintComponent(g);
        int imwidth = back.getWidth(null);
        int imheight = back.getHeight(null);
        g.drawImage(back, 1, 1, null);
        g.drawImage(chick, coordinate.x, coordinate.y, null);
    }

    public void MoveDirection(KeyEvent e, Graphics g) {
          coordinate.x = 20;
          coordinate.y = 321;

          super.paintComponent(g);
          int key = e.getKeyCode();

          if(key == 68) {
              coordinate.x += 1;
              g.drawImage(chick, coordinate.x, coordinate.y, null);
          }
      } 
}

我的代码遇到的主要问题是 MoveDirection 方法末尾的部分。我的方法是在框架中添加一只新鸡(这主要是因为我只是测试代码是否有效)。还有更好的方法吗?

最佳答案

首先查看 How to Use Key Bindings

  • 切勿直接从 paintComponent 方法的上下文外部调用 super.paintComponent(g); (或 paintComponent(g);) ,除了绘制组件背景之外,还有很多工作要做。请参阅Painting in AWT and SwingPerforming Custom Painting更多细节。相反,当您想要重新绘制组件时,只需调用 repaint 即可。
  • 使用 MediaTracker 已经过时,您应该改用 ImageIO API,它会在读取图像时自动阻塞。请参阅Reading/Loading an Image了解更多详情
  • 请勿将 Toolkit.getDefaultToolkit().getScreenSize()JFrame#setSize 结合使用,getScreenSize 方法不会占用考虑到某些操作系统的任务栏或停靠栏等内容,请使用 JFrame#setExtendedState 并传递它 JFrame.MAXIMIZED_BOTH
  • frame.setLocale(null); 没有按照您的想法进行

关于java - 协助关键事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30065515/

相关文章:

java - 在几行 java 代码中将 url 读取为字符串

java - 意外的 Java 功能接口(interface)转换

java - 最长公共(public)子序列算法讲解

java - Android谷歌地图添加标记时出现空指针异常

java - 使用静态类或此引用将数据从一个 Jframe 传输到另一个 Jframe?

java - 在java JPanel中对齐文本

Java Swing 文本在文本区域内困惑

带有 chrome 驱动程序的 python selenium "send_keys"会掉落字符

ruby-on-rails - 在路径助手中使用非默认属性,而不是 :id

php - HTTP 请求失败! HTTP/1.0 403 禁止