Maquaree
Maquaree

Reputation: 43

use slick2d mouselistener to use this?

i have a image that's the pause menu. it has an exit button. when the exit button is pressed, a dialog appears. this is what i want.

so, i have an image, and i set the x and y position of where the mouse should be clicked so then the dialog will appear. i want to do something like:

public void update(GameContainer gc, StateBasedGame sbg, int delta) throws SlickException {     

    Input input = gc.getInput();
    int xpos = Mouse.getX();
    int ypos = Mouse.getY();


    if ((xpos > 200 && xpos < 250) && (ypos > 230 && ypos < 260)) {

        if (input.isMousePressed(0)) {
            g.drawImage("res/Exit Confirmation.png", 200, 400)
        }

I know the code above cannot be like that. but is there a way that is similar to that?


Here is the code:

import org.lwjgl.input.Mouse;
import org.newdawn.slick.*;
import org.newdawn.slick.state.*;

public class Menu extends BasicGameState {

public Menu(int state) {

}

public void init(GameContainer gc, StateBasedGame sbg) throws SlickException {


}

public void render(GameContainer gc, StateBasedGame sbg, Graphics g) throws SlickException {

    Image background = new Image("res/Background.png");
    g.drawImage(background, 0, 0);

    Image play = new Image("res/Play Button.png");
    g.drawImage(play, 275, 50);

    Image exit = new Image("res/Exit Button.png");
    g.drawImage(exit, 210, 250);

}

public void update(GameContainer gc, StateBasedGame sbg, int delta) throws SlickException {     

    Input input = gc.getInput();
    int xpos = Mouse.getX();
    int ypos = Mouse.getY();


    if ((xpos > 300 && xpos < 510) && (ypos > 230 && ypos < 260)) {

        if (input.isMousePressed(0)) {
            sbg.enterState(2); //this will take me to the game.
        }

        if ((xpos > 200 && xpos < 250) && (ypos > 230 && ypos < 260)) {
            //i want this to actually show up a confirmation dialog with my image.
        }
    }
}

public int getID() {
    return 1;
}

}

Please help. Thanks.

Upvotes: 3

Views: 2317

Answers (1)

Daniel Langdon
Daniel Langdon

Reputation: 5999

Ok, it appears you have several conceptual problems. Let me see if I can help.

  1. First, you don't want to load images on the render() method. That's what init() is for. That way, you only load them once, not hundreds of times per second.
  2. The confirmation dialog will actually be there for many frames, so it will be rendered many times, independently on the instant in which it appeared. So it needs to be shown with the click but it's state remembered.
  3. You probably want to catch the click once, not keep it down without being able to move the mouse. So instead of asking for the mouse every update, use the events.

Here is the code (although I didn't test it, but should be close):

import org.lwjgl.input.Mouse;
import org.newdawn.slick.*;
import org.newdawn.slick.state.*;

public class Menu extends BasicGameState {

Image background;
Image play;
Image exit;
Boolean exiting;

public Menu(int state) {
    exiting = false;
}

public void init(GameContainer gc, StateBasedGame sbg) throws SlickException {
    Image background = new Image("res/Background.png");
    Image play = new Image("res/Play Button.png");
    Image exit = new Image("res/Exit Button.png");
}

public void render(GameContainer gc, StateBasedGame sbg, Graphics g) throws SlickException {

    g.drawImage(background, 0, 0);
    g.drawImage(play, 275, 50);

    if(exiting)
        g.drawImage(exit, 210, 250);
}

@Override
public void mousePressed(int button, int x, int y)
{
    if( button == 0 )
    {
        if ((x > 300 && x < 510) && (y > 230 && y < 260))
            sbg.enterState(2); //this will take me to the game.
        else if ((x > 200 && x < 250) && (y > 230 && y < 260))
            exiting = true;
    }
}

public void update(GameContainer gc, StateBasedGame sbg, int delta) throws SlickException {     

}

public int getID() {
    return 1;
}

}

Upvotes: 2

Related Questions