gpt4 book ai didi

java - 吃 bean 游戏 KeyListener

转载 作者:行者123 更新时间:2023-12-02 06:19:36 28 4
gpt4 key购买 nike

我有 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com