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;
}
在你的代码中尝试这样的事情。
嘿,我正在 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;
}
在你的代码中尝试这样的事情。