3

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.

4

1 回答 1

2

好的,看来您有几个概念问题。让我看看能不能帮上忙。

  1. 首先,您不想在 render() 方法上加载图像。这就是 init() 的用途。这样,您只需加载一次,而不是每秒加载数百次。
  2. 确认对话框实际上会出现很多帧,因此它会被渲染很多次,独立于它出现的那一刻。所以它需要通过点击显示,但它的状态被记住了。
  3. 您可能想抓住一次点击,而不是在无法移动鼠标的情况下将其按住。因此,不要每次更新都要求鼠标,而是使用事件。

这是代码(虽然我没有测试它,但应该很接近):

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;
}

}
于 2013-05-21T05:41:35.710 回答