繁体   English   中英

吃豆子游戏KeyListener

[英]Pacman Game KeyListener

我有两个类用于pacman游戏的开始,我真的很困惑关键的监听器或键绑定如何工作。 我有向上,向下,向右和向左移动的方法。 我花了好几个小时试图找出来,它不会调用常规方法,组件让我感到困惑。 有人可以请帮助告诉我如何获得箭头键调用方法的最终结果? 我有下面的代码,但我拿出了所有的关键测试。

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充当游戏的核心容器。

这可能是将键绑定注册到...的最佳候选者。

GUI类创建构造函数。 在此构造函数中,您需要注册密钥绑定,例如......

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都可以访问这些方法,但那只是我......

请确保您已阅读如何使用键绑定以获取更多详细信息

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM