如何按按钮进行游戏对话?

时间:2015-04-19 05:39:55

标签: java jtextarea

我正在尝试制作一个基于文本的RPG,并对如何进行故事对话提出疑问(我还是Java的新手)。

我想通过按下按钮更改文本区域的内容,以便每次按下按钮时对话框都会继续。

例如,如果有这样的对话框,

  

您好。我以前从没见过你的脸。

     

你看起来像个冒险家。

     

所以你也来杀了那个巫师?

我想逐个显示这些文本,而不是一次显示。

这是我的代码:

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按钮将文本从“Hello。我从未见过你的脸”改为“你看起来像冒险家”。

但是我不知道如何进一步(显示“所以你也来杀死那个巫师?”)从这一点开始,因为我的ENTER按钮的动作被指定显示特定的文字(“你看起来像一个冒险家“)。
我甚至不知道在哪里写第3行所以它还没有写在这段代码中。

2 个答案:

答案 0 :(得分:0)

可能有一个计数器和一个loooong开关:

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 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>();

答案 1 :(得分:0)

在你的情况下,我这样做......

声明一个堆栈。

Stack<String> texts = new Stack<String>();

堆栈就像物理堆栈。它有两种主要方法。 Push(String a)和pop()。 Push会将一个String放在堆栈顶部,pop()将返回底部的String。

在main方法中,您只需使用所需的文本填充此堆栈。

e.g。

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,这不是很好。