2014-01-15 2 views
0

У меня есть 2 класса для начала игры pacman, и я действительно смущен тем, как работают слушатели клавиш или keybindings. У меня есть методы перемещения вверх, вниз, вправо и влево. Я потратил часы, пытаясь понять, что у меня есть, и это не вызовет регулярных методов, и компоненты меня смущают. Может кто-нибудь, пожалуйста, помогите мне показать, как получить конечный результат вызова методов со стрелками? У меня есть код ниже, но я взял все мои ключевые тесты.Pacman Game KeyListener

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); 



    } 


} 
+0

Оба ключевых привязок и 'KeyListener' являются контекстными. Они должны быть зарегистрированы в отношении компонента, который вы хотите получить в уведомлении о событиях – MadProgrammer

ответ

2

В основном, 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 доступен для этих методов в любом случае, но это только мне ...

Убедитесь, что вы прочитанный через How to Use Key Bindings для более подробной информации

Смежные вопросы