Slick2D 更新 text/click 选项

Slick2D updating text/click options

嘿,我正在 slick2D 中做一个小项目,我正在尝试添加玩家和 npc 之间的互动,您可以在其中点击 select 回复。

public class House extends BasicGameState {
Image house;
Image message;
int msgID = 0;
...

public House(int state) {

}

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

}

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

    house.draw(playerPositionX, playerPositionY);
    player.draw(shiftX, shiftY);

    if (exitHouse == true){
        g.drawString("Would you like to exit the house? Y/N", 520, 270);
    }
    if (msgID == 1){
        message.draw(0, 570);
        mollerFace.draw(39, 610);
        ttf.drawString(46,588, "Moller");
        ttf.drawString(180, 609, "'Ello fella, you interested in some russian dolls?");
        ttf.drawString(908, 613, "- Russian dolls?" );//option 1
        ttf.drawString(908, 633, "- No" );//option2
        if (Play.spokeToMarkus){
            ttf.drawString(908, 653, "- Biscuits?" );//option3 hidden
        }
    } else if (msgID == 2){
        message.draw(0, 570);
        mollerFace.draw(39, 610);
        ttf.drawString(46,588, "Moller");
        ttf.drawString(180, 609, "Russian dolls are a set of dolls where each doll is different size, designed to fit in each other.");
        ttf.drawString(180, 636, "I can't recall how it's related to the module but it somehow is! ");
        ttf.drawString(908, 613, "- Interesting" );//option 1
        if (Play.spokeToMarkus){
            ttf.drawString(908, 633, "- Biscuits?" );//option 2 hidden
        }
    }
     else if (msgID == 3){
            message.draw(0, 570);
            mollerFace.draw(39, 610);
            ttf.drawString(46,588, "Moller");
            ttf.drawString(180, 609, "Biscuits? I don't really have any biscuits but I know where to get them from.");
            ttf.drawString(180, 636, "But first I'm dying, get me something to drink and I'll help ya' out");
            ttf.drawString(908, 613, "- Fine" );//option 1
        }
}


public void update(GameContainer gc, StateBasedGame sbg, int delta)
        throws SlickException {
    Input input = gc.getInput();
    // move up
    if (input.isKeyDown(Input.KEY_UP)) {
    up(delta);
    }
    // move down
    if (input.isKeyDown(Input.KEY_DOWN)) {
        down(delta);
    }

    // move left
    if (input.isKeyDown(Input.KEY_LEFT)) {
        left(delta);
    }
    // move right
    if (input.isKeyDown(Input.KEY_RIGHT)) {
        right(delta);
    }

    //speaking to moller

    if (msgID == 1){
        //option 1
        if ((Mouse.getX() > 907 && Mouse.getX()< 1023) 
                && (Mouse.getY() > 88 && Mouse.getY() < 107)) {
            if (input.isMouseButtonDown(0)) {
                msgID = 2;

                System.out.println("1");
            }
        }
        //option 2
        if ((Mouse.getX() > 907 && Mouse.getX()< 940) 
                && (Mouse.getY() > 69 && Mouse.getY() < 83)) {
            if (input.isMouseButtonDown(0)) {
                msgID = 0;
                System.out.println("2");
            }
        }
        //option 3
        if ((Mouse.getX() > 907 && Mouse.getX()< 982) 
                && (Mouse.getY() > 46 && Mouse.getY() < 66)) {
            if (input.isMouseButtonDown(0)) {
                if(Play.spokeToMarkus){
                msgID = 3;
                System.out.println("3");
                }
            }
        }
    }
    if (msgID == 2){
        //option 1
        if ((Mouse.getX() > 907 && Mouse.getX()< 1023) 
                && (Mouse.getY() > 88 && Mouse.getY() < 107)) {
            if (input.isMouseButtonDown(0)) {
                msgID = 0;
                System.out.println("4");
            }
        }
        //option 2
        if ((Mouse.getX() > 907 && Mouse.getX()< 983) 
                && (Mouse.getY() > 69 && Mouse.getY() < 83)) {
            if (input.isMouseButtonDown(0)) {
                if(Play.spokeToMarkus){
                    msgID = 3;
                    System.out.println("5");
                }
            }
        }
    }
     if (msgID == 3){
        //option 1
        if ((Mouse.getX() > 907 && Mouse.getX()< 1023) 
                && (Mouse.getY() > 88 && Mouse.getY() < 107)) {
            if (input.isMouseButtonDown(0)) {
                msgID = 0;
                System.out.println("6");
            }
        }
    }

同时 运行玩游戏: 当与npc对话时msgID变为1,则玩家有2个选项"Russian dolls"和"no"。 单击 "russian dolls" 应该会将用户带到下一条消息 (msgID = 2),用户可以在其中回复 "interesting",这会将他们带回 msgID = 0.

我的问题是单击 "russian dolls" 时,更新方法是重新 运行,因此立即 selects "interesting"。 我试图修复它但没有成功,当我 select "russian dolls" 时,系统通过一次单击输出(“1, 4”)。

单击第一个选项 select 两次第一个选项,因此 returns 播放器回到原始状态。似乎无法修复:/

所以这里发生的是当鼠标按钮按下时它接受输入,所以当鼠标按钮按下时它会执行它所涉及的一切。您在这里需要做的不仅仅是按下鼠标,还需要使 if 语句像这样。只是想让你知道这是 sudo 代码。

boolean isMouseButtonDown = false;

if(inputForMouseButton == true && isMouseButtonDown == false && msgID == 2){
   //do what ever is in the if statement for going to the next chat
   isMouseButtonDown = true;
}

if(inputForMouseButton == false && isMouseButtonDown == true){
    isMouseButtonDown = false;
}

在你的代码中尝试这样的事情。