2013-01-03 78 views
1

我正致力于制作一个简单的Java游戏,并将我的输入处理分离为一个单独的类,然后是主游戏。我无法让我的InputHandler类实际接收输入。KeyListener和MouseListener无法正常工作

主要游戏类(DrawPanel.java)

package com.eriksaulnier.DesignedToFail; 

import java.awt.*; 
import java.awt.image.*; 
import com.eriksaulnier.DesignedToFail.InputHandler; 

import javax.swing.*; 

public class DrawPanel extends JPanel { 
private static final long serialVersionUID = 1L; 
BufferedImage buffer; 
InputHandler inputHandler; 
Entity player; 
Entity enemy; 
public boolean spawnBullet = false; 

public DrawPanel() { 
    setIgnoreRepaint(true); 
    setVisible(true); 
    setFocusable(true); 
    addKeyListener(inputHandler); 
    addMouseListener(inputHandler); 
    new InputHandler(); 
} 

public void initialize() { 
    buffer = new BufferedImage(800,600,BufferedImage.TYPE_INT_RGB); 
    player = new Entity(370, 270); 
    enemy = new Entity(100, 100); 
} 

public void update() { 
    player.move(); 
} 

public void checkCollisions() { 
    if (player.getBounds().intersects(enemy.getBounds())) 
     player.collision = true; 
    else 
     player.collision = false; 
} 

public void drawBuffer() { 
    Graphics2D b = buffer.createGraphics(); 
    b.setColor(Color.white); 
    b.fillRect(0, 0, 800, 600); 
    if (player.collision == false) { 
     b.setColor(Color.blue); 
     b.fillRect(player.getX(), player.getY(), player.getWidth(), player.getHeight()); 
     b.setColor(Color.red); 
     b.fillRect(enemy.getX(), enemy.getY(), enemy.getWidth(), enemy.getHeight()); 
     b.dispose(); 
    } 
    else { 
     b.setColor(Color.black); 
     b.drawString("Collision!", 350, 300); 
     b.dispose(); 
    } 
} 

public void drawScreen() { 
    Graphics2D g = (Graphics2D)this.getGraphics(); 
    g.drawImage(buffer, 0, 0, this); 
    Toolkit.getDefaultToolkit().sync(); 
    g.dispose(); 
} 

public void startGame() { 
    initialize(); 
    while(true) { 
     try { 
      update(); 
      checkCollisions(); 
      drawBuffer(); 
      drawScreen(); 
      Thread.sleep(15); 
     } 
     catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 

} 

} 

InputHandler(InputHandler.java)

package com.eriksaulnier.DesignedToFail; 

import java.awt.event.KeyListener; 
import java.awt.event.MouseListener; 
import java.awt.event.KeyEvent; 
import java.awt.event.MouseEvent; 

import javax.swing.JPanel; 

public class InputHandler extends JPanel implements KeyListener, MouseListener { 
public boolean isShooting = false; 
Entity player; 

public InputHandler() { 
    System.out.println("Listener Works!"); 
} 

public void mouseClicked(MouseEvent e) { 

} 

public void mousePressed(MouseEvent e) { 
    int button = e.getButton(); 
    if (button == MouseEvent.BUTTON1) 
     isShooting = true; 
     System.out.println("Shooting!"); 
} 

public void mouseReleased(MouseEvent e) { 
    int button = e.getButton(); 
    if (button == MouseEvent.BUTTON1) 
     isShooting = false; 
     System.out.println("Not Shooting!"); 
} 

public void mouseEntered(MouseEvent e) { 

} 

public void mouseExited(MouseEvent e) { 

} 

public void keyTyped(KeyEvent e) { 

} 

public void keyPressed(KeyEvent e) { 
    int key = e.getKeyCode(); 
    if (key == KeyEvent.VK_W) 
     player.up = true; 
    if (key == KeyEvent.VK_S) 
     player.down = true; 
    if (key == KeyEvent.VK_A) 
     player.left = true; 
    if (key == KeyEvent.VK_D) 
     player.right = true; 
} 

public void keyReleased(KeyEvent e) { 
    int key = e.getKeyCode(); 
    if (key == KeyEvent.VK_W) 
     player.up = false; 
    if (key == KeyEvent.VK_S) 
     player.down = false; 
    if (key == KeyEvent.VK_A) 
     player.left = false; 
    if (key == KeyEvent.VK_D) 
     player.right = false; 
} 

} 

回答

2

你似乎在传递null处理程序到您的GUI。例如,你在使用它之前是否实例化了inputHandler变量?

例如:

public class DrawPanel extends JPanel { 
    //... 

    InputHandler inputHandler; // here you declare the variable 

    //... 

    public DrawPanel() { 
    setIgnoreRepaint(true); // why this line? 
    setVisible(true); // not needed in a JPanel's code 
    setFocusable(true); 
    addKeyListener(inputHandler); // here you use a null variable 
    addMouseListener(inputHandler); // ditto, here you use a null variable 
    new InputHandler(); // I don't know what you're doing here 
    } 

在上面的代码我没有看到你有inputHandler = new InputHandler()任何地方使用它之前。你看起来像创建一个新的InputHandler的那一行,你不会将该对象赋值给任何变量或使用它,因此它看起来是一段无用的代码行,因此我对我如何不确定该行应该如何处理实现。请注意,这些问题与Swing无关,并且与基本的核心Java无关。

另外:

  • 你处理类不应该延长Swing组件如JPanels。他们应该只实现侦听器接口。
  • 您应该避免在Swing GUI中使用KeyListeners,如果可能的话应该使用Key Bindings。请Google检查关键绑定教程以获取更多信息。
  • 使用处理程序在Oracle Swing教程中有很好的解释。再次,请谷歌这些并研究它们。我可以证明他们的用处,因为他们是我学习Swing编码的地方。
+0

感谢您的帮助! –

+0

@ErikSaulnier:不客气! –

2

至少,您忘记了在绑定之前创建inputHandler的实例。 你DrawPanel构造应该这样开始:

public DrawPanel() { 
    inputHander=new InputHandler(); 
    ... 
} 

让我们知道,如果不解决这个问题后,工作,我会采取更深入的了解。