Reputation: 33
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;
}
}
Upvotes: 1
Views: 1151
Reputation: 285402
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:
Upvotes: 2
Reputation: 3313
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.
Upvotes: 2