如何通过按下按钮进行游戏对话?
How to proceed game dialogue by pressing a button?
我正在尝试制作基于文本的角色扮演游戏,但对如何进行故事对话有疑问(我对 Java 还是很陌生)。
我想通过按下按钮来更改文本区域的内容,这样每次按下按钮时对话框都会继续。
例如,如果有这样的对话框,
Hello. I have never seen your face before.
You look like an adventurer.
So you also came to kill that wizard?
我想一条一条地显示这些文字,而不是一次显示。
这是我的代码:
package test;
import java.awt.*;
import java.awt.event.*;
import javax.swing.JFrame;
import java.awt.Container;
import javax.swing.*;
public class Dialogue extends JFrame implements ActionListener
{
//Window
JFrame window;
Container con;
//Font
Font basicfont;
Font bigfont;
Font timesnewroman;
//Main game screen
JPanel storyP;
JPanel inputP;
JPanel enterP;
//Main game screen Panel 3
JTextArea storyT;
//Main game screen Panel 5
JLabel inputA;
JTextField input;
JButton enterB;
public static void main(String[]args)
{
Dialogue game = new Dialogue();
game.setup();
}
public void setup()
{
window = new JFrame();
window.setBounds(0,0,1200,950);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.getContentPane().setBackground(Color.black);
window.setLayout(null); //Disabling the default layout.
window.setVisible(true);
basicfont = new Font("MS Gothic", Font.PLAIN, 24);
bigfont = new Font("MS Gothic", Font.BOLD, 28);
con = window.getContentPane();
// Panel Setup
storyP = new JPanel(); //This is where story text is displayed.
storyP.setBounds(50, 500, 800, 320);
storyP.setBackground(Color.white);
storyP.setLayout(new GridLayout());
inputP = new JPanel();
inputP.setBounds(50, 830, 500, 50);
inputP.setBackground(Color.black);
inputP.setLayout(new BorderLayout());
//p5.setLayout(new GridLayout());
enterP = new JPanel();
enterP.setBounds(600, 830, 120, 50);
enterP.setBackground(Color.black);
//STORY TEXT SETUP
storyT = new JTextArea();
storyT.setFont(basicfont);
storyT.setBackground(Color.black);
storyT.setForeground(Color.white);
storyT.setEditable(false);
//INPUT BOX SETUP
inputA = new JLabel(">");
inputA.setBackground(Color.black);
inputA.setForeground(Color.white);
inputA.setFont(bigfont);
input = new JTextField(15);
input.setBackground(Color.black);
input.setForeground(Color.white);
input.setBorder(null);
input.setFont(bigfont);
input.addActionListener(this);
enterB = new JButton("ENTER");
enterB.setFont(timesnewroman);
enterB.addActionListener(this);
//ADDING
storyP.add(storyT);
inputP.add("West",inputA);
inputP.add(input);
enterP.add(enterB);
//VISIBILITY
con.add(storyP);
con.add(inputP);
con.add(enterP);
Opening();
}
public void Opening()
{
storyT.setText("Hello. I have never seen your face before.");
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==enterB)
{
storyT.setText("You look like an adventurer.");
}
}
}
我可以通过按我创建的 ENTER 按钮将文本从“你好。我以前从未见过你的脸”更改为“你看起来像个冒险家”。
但我不知道如何进一步(显示“所以你也来杀了那个巫师?”),因为我的 ENTER 按钮的动作被指定为显示特定文本(“你看起来像冒险家").
我什至不知道在哪里写第三行,所以它还没有写在这段代码中。
可能有一个计数器和一个长长的开关:
counter++;
switch(counter){
case 0: storyT.setText("You look like an adventurer.");
case 1: storyT.setText("So you also came to kill that wizard?");
case 2: ....
}
但是如果你有成百上千的文本就很糟糕了。
为此,我会使用字符串数组或 ArrayList。然后您可以使用计数器获取要打印的文本索引
如果您将这些文本放在一个文件中,那就更好了。你可以用 Scanner 逐行阅读它 class.
Scanner sc = new Scanner(new File("texts.txt"));
ArrayList<String> texts = new ArrayList<String>();
while(sc.hasNextLine())
text.add(sc.nextLine());
sc.close();
我认为它会抛出 FileNotFoundException
你的 linstener 内容可能是:
storyT.setText(texts.get(counter++));
变量文本应该声明为实例变量,而不是在方法体中:
private ArrayList<String> texts;
....
....
....
texts=new ArrayList<String>();
在你的情况下,我会这样做...
声明一个堆栈。
Stack<String> texts = new Stack<String>();
堆栈就像一个物理堆栈。它有两个主要方法。 Push(String a) 和 pop()。 Push 会将一个 String 放在堆栈的顶部,而 pop() 将 return 位于底部的 String。
在你的 main 方法中,你只需用你想要的文本填充这个堆栈。
例如
texts.push("you look like an adventurer");
texts.push("etc..");
texts.push("etc..");
然后,在您的 actionlistener 中,您只需执行此操作而不是您所拥有的:
storyT.setText(texts.pop());
如果你想要一些安全措施,你可以这样做:
if (texts.hasnext())
storyT.setText(texts.pop());
这将检查堆栈中是否仍有存储的文本。如果不是,则不会弹出堆栈,在这种情况下,您将得到 null,这不好。
我正在尝试制作基于文本的角色扮演游戏,但对如何进行故事对话有疑问(我对 Java 还是很陌生)。
我想通过按下按钮来更改文本区域的内容,这样每次按下按钮时对话框都会继续。
例如,如果有这样的对话框,
Hello. I have never seen your face before.
You look like an adventurer.
So you also came to kill that wizard?
我想一条一条地显示这些文字,而不是一次显示。
这是我的代码:
package test;
import java.awt.*;
import java.awt.event.*;
import javax.swing.JFrame;
import java.awt.Container;
import javax.swing.*;
public class Dialogue extends JFrame implements ActionListener
{
//Window
JFrame window;
Container con;
//Font
Font basicfont;
Font bigfont;
Font timesnewroman;
//Main game screen
JPanel storyP;
JPanel inputP;
JPanel enterP;
//Main game screen Panel 3
JTextArea storyT;
//Main game screen Panel 5
JLabel inputA;
JTextField input;
JButton enterB;
public static void main(String[]args)
{
Dialogue game = new Dialogue();
game.setup();
}
public void setup()
{
window = new JFrame();
window.setBounds(0,0,1200,950);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.getContentPane().setBackground(Color.black);
window.setLayout(null); //Disabling the default layout.
window.setVisible(true);
basicfont = new Font("MS Gothic", Font.PLAIN, 24);
bigfont = new Font("MS Gothic", Font.BOLD, 28);
con = window.getContentPane();
// Panel Setup
storyP = new JPanel(); //This is where story text is displayed.
storyP.setBounds(50, 500, 800, 320);
storyP.setBackground(Color.white);
storyP.setLayout(new GridLayout());
inputP = new JPanel();
inputP.setBounds(50, 830, 500, 50);
inputP.setBackground(Color.black);
inputP.setLayout(new BorderLayout());
//p5.setLayout(new GridLayout());
enterP = new JPanel();
enterP.setBounds(600, 830, 120, 50);
enterP.setBackground(Color.black);
//STORY TEXT SETUP
storyT = new JTextArea();
storyT.setFont(basicfont);
storyT.setBackground(Color.black);
storyT.setForeground(Color.white);
storyT.setEditable(false);
//INPUT BOX SETUP
inputA = new JLabel(">");
inputA.setBackground(Color.black);
inputA.setForeground(Color.white);
inputA.setFont(bigfont);
input = new JTextField(15);
input.setBackground(Color.black);
input.setForeground(Color.white);
input.setBorder(null);
input.setFont(bigfont);
input.addActionListener(this);
enterB = new JButton("ENTER");
enterB.setFont(timesnewroman);
enterB.addActionListener(this);
//ADDING
storyP.add(storyT);
inputP.add("West",inputA);
inputP.add(input);
enterP.add(enterB);
//VISIBILITY
con.add(storyP);
con.add(inputP);
con.add(enterP);
Opening();
}
public void Opening()
{
storyT.setText("Hello. I have never seen your face before.");
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==enterB)
{
storyT.setText("You look like an adventurer.");
}
}
}
我可以通过按我创建的 ENTER 按钮将文本从“你好。我以前从未见过你的脸”更改为“你看起来像个冒险家”。
但我不知道如何进一步(显示“所以你也来杀了那个巫师?”),因为我的 ENTER 按钮的动作被指定为显示特定文本(“你看起来像冒险家").
我什至不知道在哪里写第三行,所以它还没有写在这段代码中。
可能有一个计数器和一个长长的开关:
counter++;
switch(counter){
case 0: storyT.setText("You look like an adventurer.");
case 1: storyT.setText("So you also came to kill that wizard?");
case 2: ....
}
但是如果你有成百上千的文本就很糟糕了。 为此,我会使用字符串数组或 ArrayList。然后您可以使用计数器获取要打印的文本索引 如果您将这些文本放在一个文件中,那就更好了。你可以用 Scanner 逐行阅读它 class.
Scanner sc = new Scanner(new File("texts.txt"));
ArrayList<String> texts = new ArrayList<String>();
while(sc.hasNextLine())
text.add(sc.nextLine());
sc.close();
我认为它会抛出 FileNotFoundException
你的 linstener 内容可能是:
storyT.setText(texts.get(counter++));
变量文本应该声明为实例变量,而不是在方法体中:
private ArrayList<String> texts;
....
....
....
texts=new ArrayList<String>();
在你的情况下,我会这样做...
声明一个堆栈。
Stack<String> texts = new Stack<String>();
堆栈就像一个物理堆栈。它有两个主要方法。 Push(String a) 和 pop()。 Push 会将一个 String 放在堆栈的顶部,而 pop() 将 return 位于底部的 String。
在你的 main 方法中,你只需用你想要的文本填充这个堆栈。
例如
texts.push("you look like an adventurer");
texts.push("etc..");
texts.push("etc..");
然后,在您的 actionlistener 中,您只需执行此操作而不是您所拥有的:
storyT.setText(texts.pop());
如果你想要一些安全措施,你可以这样做:
if (texts.hasnext())
storyT.setText(texts.pop());
这将检查堆栈中是否仍有存储的文本。如果不是,则不会弹出堆栈,在这种情况下,您将得到 null,这不好。