Reputation: 29
I'm writing Tower Defence game and right now I've stuck on some issues connected with MouseListener. I've created class Mouse Hanlder (which implements Mouse Listener) and a second class with whole screen made by paint(Graphics g).I want to check if player pressed tower to buy it. The thing that isn't working is, that getX() and getY() are returning 0 instead of right coordinates from my screen. What should I change?
public class MouseHandler implements MouseListener, MouseMotionListener {
private GameScreen screen;
private GameScreen.MouseHeld mouseHeld;
public MouseHandler(GameScreen screen){
this.screen = screen;
this.mouseHeld = this.screen.new MouseHeld();
}
public void mouseClicked(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
this.mouseHeld.mouseDown(e);
}
public void mouseReleased(MouseEvent e) {
}
public void mouseDragged(MouseEvent e) {
this.mouseHeld.mouseMove(e);
}
public void mouseMoved(MouseEvent e) {
this.mouseHeld.mouseMove(e);
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
}
And class with the screen:
public class GameScreen extends JPanel implements Runnable {
private static final long serialVersionUID = 1L;
public Thread thread = new Thread(this)
public GameScreen(GameFrame frame) {
this.frame = frame;
this.setSize(1280, 800);
this.addMouseListener(new MouseHandler(this));
thread.start();
}
public void paint(Graphics g) {
// Code with my painted screen
}
// Some code with running game
public class MouseHeld {
boolean mouseDown = false;
int hand = 0;
int handXPos;
int handYPos;
public void mouseDown(MouseEvent e) {
mouseDown = true;
if(hand != 0){
hand = 0;
}
System.out.println(handYPos);
System.out.println(handXPos);
uptadeMouse(e);
}
public void mouseMove(MouseEvent e) {
handXPos = e.getX();
handYPos = e.getY();
}
public void uptadeMouse(MouseEvent e) {
if (mouseDown && hand == 0) {
if (handYPos <= 680 && handYPos >= 640) {
// Tower 1
if (handXPos >= 300 && handXPos <= 340) {
if (player.money >= Tower.allTowers[0].cost) {
System.out.println("You bought a tower!");
hand = 1;
}
}
}
}
}
}
}
Upvotes: 0
Views: 1516
Reputation: 285401
You only update the handXPos and handYPos in mouseMove and no other mouse method. You never add the handler as a MouseMotionListener and so mouseMove never gets called.
e.g.,
public GameScreen(GameFrame frame) {
this.frame = frame;
this.setSize(1280, 800); // avoid this
MouseHandler mouseHandler = new MouseHandler(this);
addMouseListener(mouseHandler);
addMouseMotionListener(mouseHandler);
}
Another and better solution is to update the handXPos and handYPos in all mouse methods used.
Here is my minimal test program, something that you should provide for future questions:
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.*;
import javax.swing.*;
public class FooGui {
private static void createAndShowGui() {
FooGui mainPanel = new FooGui();
GameFrame frame = new GameFrame("Foo Gui");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(new GameScreen(frame));
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
class MouseHandler implements MouseListener, MouseMotionListener {
private GameScreen screen;
private GameScreen.MouseHeld mouseHeld;
public MouseHandler(GameScreen screen) {
this.screen = screen;
this.mouseHeld = this.screen.new MouseHeld();
}
public void mouseClicked(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
this.mouseHeld.mouseDown(e);
}
public void mouseReleased(MouseEvent e) {
}
public void mouseDragged(MouseEvent e) {
this.mouseHeld.mouseMove(e);
}
public void mouseMoved(MouseEvent e) {
this.mouseHeld.mouseMove(e);
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
}
class GameScreen extends JPanel {
private static final long serialVersionUID = 1L;
private static final int PREF_W = 400;
private static final int PREF_H = PREF_W;
private GameFrame frame;
public GameScreen(GameFrame frame) {
this.frame = frame;
this.setSize(1280, 800);
MouseHandler mouseHandler = new MouseHandler(this);
addMouseListener(mouseHandler);
addMouseMotionListener(mouseHandler);
}
@Override
public Dimension getPreferredSize() {
if (isPreferredSizeSet()) {
return super.getPreferredSize();
}
return new Dimension(PREF_W, PREF_H);
}
public class MouseHeld {
boolean mouseDown = false;
int handXPos;
int handYPos;
public void mouseDown(MouseEvent e) {
mouseDown = true;
System.out.println(handYPos);
System.out.println(handXPos);
uptadeMouse(e);
}
public void mouseMove(MouseEvent e) {
handXPos = e.getX();
handYPos = e.getY();
}
public void uptadeMouse(MouseEvent e) {
}
}
}
class GameFrame extends JFrame {
public GameFrame(String name) {
super(name);
}
}
Also avoid overriding the JPanel's paint method and instead favor paintComponent
Check out:
Upvotes: 2