2015-04-19 5 views
0

Я пытаюсь сделать текстовую 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.

Но я не знаю, как идти дальше (чтобы отобразить «Так вы также пришли, чтобы убить этого волшебника?») С этого момента, так как действие моего элемента ENTER назначено для отображения определенного текста («Вы похожи на авантюрист ").
Я даже не знаю, где написать третью строку, чтобы она еще не была написана в этом коде.

+2

Вы можете использовать массив строк, который содержит весь разговор. Чем просто прокручивается, когда пользователь нажимает кнопку ввода. Вы можете использовать счетчик, чтобы переключиться на следующий бит в разговоре или какой-нибудь другой умный метод. – CSCH

+0

Да, это один из способов сделать это. Спасибо за информацию :-) – Ryi

ответ

0

Там может быть счетчиком и займет слишком много переключателя:

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: .... 
} 

Но это будет очень плохо, если вы будете иметь hunderds текстов. Для этого я бы использовал массив строк или ArrayList. то вы можете использовать счетчик, чтобы перейти к индексу текста для печати Будет намного лучше, если у вас будут эти тексты в файле. Чем вы можете прочитать это по строкам класса Scanner.

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

Я пробовал ваш метод с помощью счетчика и переключателя, и он работал просто отлично! О методе с ArrayList и сканером ... это звучит очень многообещающе, и на самом деле у меня возникло ощущение, что рано или поздно мне придется принять такой метод. Учитывая мой текущий уровень Java, сканирование данных в другом файле по-прежнему немного продвинуто, но я попробую. Большое вам спасибо за всю полезную информацию! – Ryi

+0

Я знаю, что вы имеете в виду, Сканер - это нечто продвинутое, в любом случае я рад, что это помогает @Ryi – maskacovnik

0

В вашем случае я бы сделал это ...

объявить стек.

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

Стек как физический стек. Он имеет два основных метода. Нажмите (String a) и нажмите(). Push будет помещать String поверх стека, а pop() вернет строку, расположенную внизу.

В основном способе вы просто заполняете этот стек текстами, которые вы хотите.

например.

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

Этот проверяет, сохраняется ли в стеке все сохраненные в нем тексты. Если нет, стек не будет выгружен, и в этом случае вы получите нулевое значение, что не очень хорошо.

+0

Спасибо! Я попробовал ваш метод и, похоже, работает очень хорошо. Но у меня есть одна проблема. Когда вы нажимаете кнопку «Ввод», мой текущий код сначала отображает третью строку. Затем он отображает вторую строку, затем 1-я строка. Таким образом, порядок отменяется. Я могу исправить порядок, написав диалог в обратном порядке, но это делает код запутанным, поэтому, надеюсь, я хочу этого избежать. Есть ли способ решить эту проблему? – Ryi

+0

Нет, вот как работает стек. Первое, что вы вложили в push(), будет первым, что вы выберете с помощью pop(). Поэтому просто добавьте строки в соответствующем порядке. В вашем случае просто измените порядок, который вы нажимаете на строки. Могу ли я предложить связанный список. Читайте об этом! – Jake

Смежные вопросы