java - 吃 bean 游戏 KeyListener

标签 java keylistener pacman

我有 2 个用于 pacman 游戏开始的类(class),我对按键监听器或按键绑定(bind)的工作方式感到非常困惑。我有向上、向下、向右、向左移动的方法。我花了几个小时试图找出答案,但它不会调用常规方法,而且这些组件让我感到困惑。有人可以帮我展示如何获得箭头键调用方法的最终结果吗?我有下面的代码,但我删除了所有关键测试。

import java.awt.GridLayout;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;


public class GUI {
JPanel myPanel = new JPanel(new GridLayout(50, 50, 1, 1));
int[][] myLabels = new int[50][50];

//Set Game Black
public int[][] setBlack(int[][] arrayLabels){
    myLabels = arrayLabels;
    for (int i = 0; i < myLabels.length; i++) {
        for (int j = 0; j < myLabels[0].length; j++) {
            JLabel black = new JLabel(new ImageIcon("black-square.jpg"), JLabel.CENTER);
            myLabels[i][j] = 1;
        }
    }
    return myLabels;
}


//get panel any time changes are made to array
public JPanel getPanel(int[][] arrayLabels){
    myLabels = arrayLabels;
    for (int i = 0; i < myLabels.length; i++) {
        for (int j = 0; j < myLabels[0].length; j++) {
            JLabel black = new JLabel(new ImageIcon("black-square.jpg"), JLabel.CENTER);
            JLabel pacman = new JLabel(new ImageIcon("pacman.png"), JLabel.CENTER);
            if(myLabels[i][j] == 1){
                myPanel.add(black);
            }
            if(myLabels[i][j] == 2){
                myPanel.add(pacman);
            }
        }
    }
    return myPanel;
}

//moves pacman up
public int[][] moveUp(int[][] arrayLabels){
    myLabels = arrayLabels;

    for (int i = 0; i < myLabels.length; i++) {
        for (int j = 0; j < myLabels[0].length; j++) {
            if(myLabels[i][j] == 2){
                myLabels[i][j] = 1;
                myLabels[i-1][j] = 2;
            }
        }
        }
    return myLabels;
}

//=========
//moves pacman up

public void setLabel(int[][] arrayLabels){
    myLabels = arrayLabels;
}

public int[][] moveUpKey(){

    for (int i = 0; i < myLabels.length; i++) {
        for (int j = 0; j < myLabels[0].length; j++) {
            if(myLabels[i][j] == 2){
                myLabels[i][j] = 1;
                myLabels[i-1][j] = 2;
            }
        }
        }
    return myLabels;
}
//////===========================
//moves pacman down
public int[][] moveDown(int[][] arrayLabels){
    myLabels = arrayLabels;

    for (int i = 0; i < myLabels.length; i++) {
        for (int j = 0; j < myLabels[0].length; j++) {
            if(myLabels[i][j] == 2){
                myLabels[i][j] = 1;
                myLabels[i+1][j] = 2;
            }
        }
        }
    return myLabels;
}

//moves pacman right
    public int[][] moveRight(int[][] arrayLabels){
        myLabels = arrayLabels;

        for (int i = 0; i < myLabels.length; i++) {
            for (int j = 0; j < myLabels[0].length; j++) {
                if(myLabels[i][j] == 2){
                    myLabels[i][j] = 1;
                    myLabels[i][j+1] = 2;
                }
            }
            }
        return myLabels;
    }

    //moves pacman left
            public int[][] moveLeft(int[][] arrayLabels){
                myLabels = arrayLabels;

                for (int i = 0; i < myLabels.length; i++) {
                    for (int j = 0; j < myLabels[0].length; j++) {
                        if(myLabels[i][j] == 2){
                            myLabels[i][j] = 1;
                            myLabels[i][j-1] = 2;
                        }
                    }
                    }
                return myLabels;
            }



}

游戏类别:

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.AbstractAction;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import java.util.*;



public class Game {


   public static void main(String[] args) throws Exception {

        final GUI gui = new GUI();


        JFrame f = new JFrame("Frame Test");


        JPanel panel = new JPanel(new GridLayout(50, 50, 1, 1));

        int[][] labels = new int[50][50];



      JLabel black2 = new JLabel(new ImageIcon("black-square.jpg"), JLabel.CENTER);
      JLabel pacman2 = new JLabel(new ImageIcon("pacman.png"), JLabel.CENTER);
      panel.setLayout(new GridLayout(50, 50, 1, 1));

                labels = gui.setBlack(labels);
                panel = gui.getPanel(labels);




                labels[10][10] = 2;



                //labels = gui.moveUp(labels);

                panel.removeAll(); 
                panel = gui.getPanel(labels);
                panel.repaint();






                //labels[i][j]

       //.revalidate();


       //do the thing 
        f.setContentPane(panel);
        f.setSize(1000, 1000);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);



   }


}

最佳答案

基本上,myPanel 充当游戏的核心容器。

这可能是将按键绑定(bind)注册到...的最佳候选者

为您的GUI类创建一个构造函数。在此构造函数中,您需要注册您的键绑定(bind),例如...

public GUI() {

    InputMap im = myPanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
    ActionMap am = myPanel.getActionMap();

    im.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), "up");
    am.put("up", new AbstractAction() {

        @Override
        public void actionPerformed(ActionEvent e) {
            moveUp(myLabels);
        }
    });
    // Register other key strokes...

}

ps-我不知道为什么你的移动方法需要 JLabel[][] 参数,因为 myLables 无论如何都可以访问这些方法,但这只是我的...

确保您已通读 How to Use Key Bindings了解更多详情

关于java - 吃 bean 游戏 KeyListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21127252/

相关文章:

java - 在更大的文本中检索某些文本

java - 如何在同一方法中添加KeyPressed事件

graph - pacman 寻路的一些问题

java - 在java中编写文本文件的相对路径

java - 设置为更新时,Spring Boot mvc java 应用程序无法运行

java - KeyListener 不工作/没有被调用?

java - 在一个类中重写多个类的多个方法

java - 如何返回处理中矩形边界内的任意点?

java - 移动吃 bean 人

Java - 整数 vector 与整数数组 vector