嘿所以我正在研究slick2D中的一个小项目,我试图在播放器和npc之间添加交互,你可以点击选择回复。
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个选项&#34;俄罗斯娃娃&#34;和&#34;不&#34;。 点击&#34;俄罗斯娃娃&#34;应该将用户带到下一条消息(msgID = 2),用户可以在其中回复&#34;有趣的&#34;将它们带回msgID = 0。
我的问题是当点击&#34;俄语娃娃&#34;时,重新运行更新方法,从而选择&#34;有趣&#34;即刻。 我尝试修复它但没有成功,当我选择&#34;俄罗斯娃娃&#34;时,系统输出(&#34; 1,4&#34;)只需点击一下。
单击第一个选项会选择第一个选项两次,从而将玩家返回到原始状态。似乎无法修复:/
答案 0 :(得分:1)
所以这里发生的事情是它需要输入鼠标按钮时的输入,所以当鼠标按钮关闭时它将执行它所涉及的所有内容。你需要做的是让它不仅仅是一个鼠标,而是你需要使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;
}
在代码中尝试这样的事情。