1

Im working on making a simple Java game and had the great idea of separating my input handling to a separate class then the main game. I am having trouble getting my InputHandler class to actually receive input.

Main Game Class (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;
}

}
4

2 回答 2

2

You seem to be passing null handlers into your GUI. Where for instance do you instantiate the inputHandler variable before using it?

For example:

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
  }

In the code above I don't see anywhere you have inputHandler = new InputHandler() before using it. Your line where you appear to create a new InputHandler, you don't assign the object to any variable or use it, and so it seems a futile line of code, hence my comment on how I'm not sure what that line is supposed to achieve. Note that these problems have nothing to do with Swing and all to do with basic core Java.

Also:

  • Your handler classes should not extend Swing components such as JPanels. They should implement listener interfaces only.
  • You should avoid use of KeyListeners with Swing GUI's and instead use Key Bindings if possible. Please Google for and check the Key Bindings tutorial for more on this.
  • The use of handlers is well explained in the Oracle Swing tutorials. Again, please Google these and study them. I can attest to their usefulness as they are where I learned my Swing coding.
于 2013-01-03T23:58:48.217 回答
2

At least, you have forgotten to create instance of the inputHandler before binding. Your DrawPanel constructor should start like:

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

Let us know if it doesn't work after fixing this issue and I'll take a deeper look.

于 2013-01-03T23:58:59.513 回答