2017-01-23 9 views
-2

私は、複数の結果を持つ自分自身で選ぶプロジェクトを選択しています。私がやろうとしていることの1つは、短時間の制限内でボタンをクリックするか、殺さなければならないクイックタイムイベント(QTE)やゲーム内のイベントを組み込むことです。この場合、私は、時間が来ると、ゲームが「突然あなたの右から来る蹄の鳴りを聞く!」と言うようにしています。その時点でGUIのポップアップを行うメソッドが呼び出されますボタンを押すだけで、数秒でボタンをクリックできます。適切な時間内にボタンをクリックすると、ゲームが続行されます(「CRACK !!」で始まります)。そうでない場合、ゲームは終了し、メッセージが印刷されます( 'GAME OVER - あなたはMinotaur Prison Guardによって殺されましたが、GUIをポップアップしないとGame Overメッセージが3回印刷されますsleepLines遅延し、その後「CRACKが!!あなたがすばやく回す...」というメッセージが表示されますここに私のコードです:。JavaでのGUIを使用したクイックタイムイベント

import java.util.Scanner; 

    import java.awt.Container; 

    import javax.swing.JPanel; 
    import javax.swing.JButton; 
    import javax.swing.JFrame; 
    import javax.swing.JTextField; 

    import javax.swing.*; 
    import java.awt.*; 
    import java.awt.event.*; 


    public class KCP1Main extends JPanel{ 

    public static JButton AttackButton; 
    static Scanner myScanner = new Scanner(System.in); 

    static int quicktimecompletion = 0; 


    public static void main(String[] args) throws InterruptedException { 

     //insert leading up to this point here 

     System.out.println("Suddenly, you hear the clomping of hooves to your right!"); 


     QuickTimeEvent(args); 

     sleepLines(500,2); 
     System.out.println("CRACK!!"); 
     sleepLines(1000,1); 
     scrollText("You quickly turn right, swinging your metal pole at the same time... it swings into the head of "); 
     scrollText("a minotaur that was charging towards you, with enough force to knock him out."); 


    } 

} 



public static void QuickTimeEvent(String[] args) throws InterruptedException 
{ 



    for(int timer=0 ; timer<3 ; timer++){ 

     ButtonHandler handler = new ButtonHandler(); 

     AttackButton = new JButton("<!"); 
     //static add(AttackButton); 
     AttackButton.addActionListener(handler); 

     sleepLines(1000,1); 

     if(quicktimecompletion == 1) 
     { 
      break; 
     } 

     if(timer > 3); 
     { 

      System.out.println("GAME OVER"); 
      System.out.printf("You were slain by a Minotaur Prison Guard."); 

     } 

    } 

} 

public static class ButtonHandler implements ActionListener 
{ 

    public void actionPerformed (ActionEvent event) 
    { 
     if (event.getSource() == AttackButton) 
     { 
      quicktimecompletion = 1; 

     } 
    } 
} 



public static void scrollText(String message) throws InterruptedException{ 

    for(int i = 0; i < message.length(); i++) 
    { 
     System.out.print(message.charAt(i)); 
     Thread.sleep(62); 
    } 
    System.out.print("\n"); 

} 

public static void JPanel(String[] args){ 

    JFrame theGUI = new JFrame(); 
    theGUI.setTitle("Incoming!"); 
    KCP1Main makeButtons = new KCP1Main(); 
    theGUI.add(makeButtons); 
    theGUI.setSize(300, 200); 
    theGUI.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    theGUI.setBackground(Color.red); 

    Container pane = theGUI.getContentPane(); 

    theGUI.setVisible(true); 


} 


public static void sleepLines(int duration, int lines) throws InterruptedException{ 

    for(int i=0; i < lines; i++){ 

     Thread.sleep(duration); 
     System.out.println(""); 

    } 

} 

    } 
+1

として

が、これはチュートリアルを読むために急いのあまりに誰かが作成した意識コードの乱数ストリームのように見えます。私の助言を取り、このコードをすべて削除し、使用したいGUIライブラリを選択してください。それはSwingまたは最近のJavaFXです。次に、ライブラリで複雑なプログラムを作成する前にチュートリアルを最初に調べてください。あなたがこれに従うなら、あなたは自分自身(そして私たち)に多くの悲しみを救うでしょう。 –

答えて

2

はのは、スイングがシングルスレッドであるという事実から始めましょう、これは意味任意のアクションものブロックイベントディスパッチスレッド(のようなThread.sleep)それはブロックが解除されるまで(ペイントイベントを含む)任意の新しいイベントを処理するのを防ぐことができます。

つの黄金ルール...

  1. あなたはTimer

    参照スイングを利用することによって、あなたの所望の結果を達成することができ、あなたのケースではEDT

外部からUIを更新しないEDT

  • をふさがないでください詳細はHow to use Swing Timersをご覧ください。

    私の頭の中では、時間のかかる種類のQTEクラスを作成することを検討していました。ユーザーがクリックする必要のあるボタンへの参照、リスナー/オブザーバー/コールバック。

    QTEはボタンにActionListenerを添付します。トリガーされた場合、Timerが停止し、正常にオブザーバーに通知されます。そうでない場合、Timerが最初にトリガされた場合、オブザーバに障害が発生したことが通知されます。アイデア鈍のため申し訳ありません

  • +0

    私は人々を助けると思わない会議を逃したにちがいないでしょう:( – MadProgrammer

    +0

    証券取引所のフロアのように、ミーティングのようなものではありません。 – trashgod

    関連する問題