2013-05-09 2 views
0

Я новичок в Java, в настоящее время изучаю GUI. Я создаю простую игру «Лабиринт». В настоящее время у меня есть макет лабиринта с использованием массива String, преобразованного в 2D-массив, и размещения изображения для стен и пространства с помощью «W» и «S» в массиве String.Java-перемещение BufferedImage на JFrame

Проблема, с которой я сейчас сталкиваюсь, - это мое изображение персонажа, перемещающееся с помощью ключей массива, я создал BufferedImage, нарисовал его в форме и у меня есть мой слушатель, и я просто не могу найти, где я ошибаюсь.

Это мой код;

public class Maze extends JFrame implements KeyListener { 

    private Container contain; 
    private JPanel pEast, pNorth, pSouth, pCenter, pWest; 
    private JButton btnStart, btnReset, btnExit; 
    private JLabel lblTitle, lblmazewall; 
    private JTextArea txtArea; 
    //private String s; 
    //private FileInputStream in; 
    //private int no; 
    //private char ch; 
    private ImageIcon mazewall; 
    private BufferedImage player; 
    private int xpos = 100, ypos = 100; 
    private String [] mazeLayout; 
    private String [][] mazeLayout2d; 



    Maze(){ 

     loadImage(); 
     mazeLayout = new String[10]; 
     mazeLayout2d = new String[10][10]; 

     contain = getContentPane(); 
     pEast = new JPanel(); 
     pNorth = new JPanel(); 
     pSouth = new JPanel(); 
     pCenter = new JPanel(); 
     pWest = new JPanel(); 



     //pCenter.setBackground(Color.BLUE); 

     pCenter.setLayout(new FlowLayout (FlowLayout.CENTER,0,0)); 

     pWest.setLayout(new FlowLayout (FlowLayout.CENTER, 10, 10)); 

     btnStart = new JButton("Start"); 
     btnStart.setFont(new Font("Dialog", Font.BOLD, 18)); 
     btnReset = new JButton("Reset"); 
     btnReset.setFont(new Font("Dialog",Font.BOLD,18)); 
     pEast.setLayout(new FlowLayout (FlowLayout.CENTER,10,10)); 
     pEast.add(btnStart); 
     pEast.add(btnReset); 

     btnExit = new JButton("Exit"); 
     btnExit.setFont(new Font("Dialog",Font.BOLD,18)); 
     pSouth.setLayout(new FlowLayout (FlowLayout.CENTER, 20,10)); 
     pSouth.add(btnExit); 

     lblTitle = new JLabel("Maze Game"); 
     lblTitle.setFont(new Font("Dialog",Font.BOLD,24)); 
     lblTitle.setHorizontalAlignment(SwingConstants.CENTER); 
     pNorth.setLayout(new FlowLayout(FlowLayout.CENTER, 20, 10)); 
     pNorth.add(lblTitle); 

     txtArea = new JTextArea(20,70); 
     txtArea.setFont(new Font("dialog",Font.BOLD,16)); 

     mazewall = new ImageIcon("mazewall.png"); 

//  Read in from a text file, needed later   
//  try{ 
//   in = new FileInputStream("maze.txt"); 
//   while((no = in.read()) != -1){ 
//    ch = (char)no; 
//    s+=ch; 
//   } 
//   txtArea.setText(s); 
//  }catch(FileNotFoundException ef){ 
//   JOptionPane.showMessageDialog(null, "File not found - maze.txt"); 
//   }catch(IOException e){ 
//    JOptionPane.showMessageDialog(null, "Unable to read file maze.txt"); 
//   } 

     contain.add(pEast, BorderLayout.EAST); 
     contain.add(pNorth, BorderLayout.NORTH); 
     contain.add(pSouth, BorderLayout.SOUTH); 
     contain.add(pCenter, BorderLayout.CENTER); 
     contain.add(pWest, BorderLayout.WEST); 

     //Array for maze 
     mazeLayout[0] = "WWWWWWWWWW"; 
     mazeLayout[1] = "WSSSWWSWWW"; 
     mazeLayout[2] = "WSWSWWSSSW"; 
     mazeLayout[3] = "WSWSWWWWSW"; 
     mazeLayout[4] = "WSWSWWWWSW"; 
     mazeLayout[5] = "WSWSWSSSSW"; 
     mazeLayout[6] = "WSWSWSWWWW"; 
     mazeLayout[7] = "WSWSWSWWWW"; 
     mazeLayout[8] = "WSWSSSWWWW"; 
     mazeLayout[9] = "WWWWWWWWWW"; 


     //Converting array into 2d array 
     for(int y = 0; y < 10; y++){ 
      for(int x = 0; x < 10; x++){ 
       mazeLayout2d[y][x] = mazeLayout[y].substring(x, x+1); 
       if (mazeLayout2d[y][x].equals("W")){ 
        lblmazewall = new JLabel(); 
        mazewall = new ImageIcon("mazewall.png"); 
        lblmazewall.setIcon(mazewall); 
        pCenter.add(lblmazewall); 
       } 
       if (mazeLayout2d[y][x].equals("S")){ 
        lblmazewall = new JLabel(); 
        mazewall = new ImageIcon("mazefloor.png"); 
        lblmazewall.setIcon(mazewall); 
        pCenter.add(lblmazewall); 
       } 
      } 
     }  
    } 

    public void loadImage(){ 
     try{ 
      String playerPath = "player.png"; 
      player = ImageIO.read(new File(playerPath)); 
     }catch(IOException ex){ 
      ex.printStackTrace(); 
     } 
     addKeyListener(this); 
    } 

    @Override 
    public void paint(Graphics g){ 
     super.paint(g); 
     g.drawImage(player, xpos, ypos,50,80, this);  
    } 


    public void keyPressed(KeyEvent ke){ 
     switch(ke.getKeyCode()){ 
     case KeyEvent.VK_RIGHT:{ 
      xpos+=3; 
     } 
     break; 
     case KeyEvent.VK_LEFT:{ 
      xpos-=3; 
     } 
     break; 
     case KeyEvent.VK_DOWN:{ 
      ypos+=3; 
     } 
     break; 
     case KeyEvent.VK_UP:{ 
      ypos-=3; 
     } 
     break; 
    } 
    repaint(); 
} 
    public void keyTyped(KeyEvent ke){} 
    public void keyReleased(KeyEvent ke){} 


} 

Надеюсь, кто-то может сказать мне, где моя проблема, спасибо.

+0

Что это такое? Вы видите игрока? Он вообще движется? Если вы добавите println в манипулятор клавиатуры, выполните ли нажатия клавиш? –

+0

Я вижу изображение игрока в позиции xpos и ypos. Я добавил в System.out.println («RIGHT»); слева, вверх и вниз при нажатии клавиш и ничего не отображается – Sqoh

ответ

1

Не переопределяйте метод paint() контейнера верхнего уровня (т.е. JFrame).

Пользовательская покраска выполняется путем переопределения метода paintComponent() JPanel (или JComponent). Поэтому в вашем случае вы переопределите центральную панель, так как именно там вы создаете лабиринт.

KeyEvent генерируется только для компонента с фокусом. Таким образом, вам нужно будет сделать центральную панель фокусной.

Кроме того, не рекомендуется использовать KeyListener. Вы только что нашли одно из ограничений этого старого подхода, который использовался для приложений AWT. Для приложений Swing вы должны использовать привязки клавиш. Поиск в форуме, этот совет предоставляется ежедневно.

Кроме того, не создавайте новые ImageIcons при создании лабиринта. Вам нужно только один значок для каждого изображения, затем вы можете повторно использовать значок.

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