2011-07-08 14 views
0

私は約2時間の試行後に働くことができなかった問題がありました。私は2つのメソッド(描画と更新)を行うだけでなく、マウス/キーボードのイベントを聞くループをしたいです。私は描画と更新のループを持っていますが、ループの外には何もしません(イベントを聞く)私は物事を試しましたが、何も働いていませんでした。助けてください?Javaアプレットゲームループがマウス/キーボード入力を停止しますか?

私はrunnableスレッドを使用して、wait()とnotify()を使用して異なる注文を使用して試しました。私はたくさん試しました。しかしbasicly私はそれが終了するが、それでもここ

を動作しません、ループを実行し、まだ私は赤い「X」をクリックし、プログラムを終了しようとすると、ユーザー入力も

をチェックする方法を知っていたいですコード:

import java.applet.Applet; 
import java.awt.*; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 

public class main extends Applet implements MouseListener, Runnable { 

    public main() { 
     super(); 
     init(); 
    } 
    Thread t; 
    Screen screen = new Screen(); 
    String Text = "Hello"; 
    boolean Running = true; 
    boolean Click = false; 
    int R = 0x00; 
    int G = 0x00; 
    int B = 0x00; 
    int xpoints[] = {25, 40, 40, 25, 25}; 
    int ypoints[] = {40, 40, 25, 25, 25}; 
    int npoints = 5; 

    public void run() { 
     while (Running) { 
      GameLoop(); 
     } 
    } 

    public void init() { 
     this.addMouseListener(this); 
     this.setSize(400, 300); //manually set your Frame's size 
     t = new Thread(this); 
     t.start(); 
    } 

    public void paint(Graphics g) { 
     g.setColor(new Color(R, B, G)); 
     g.fillPolygon(xpoints, ypoints, npoints); 
     Running = true; 
     t.run(); 
    } 

    public void mousePressed(MouseEvent e) { //On Mouse Click 
     System.exit(0); 
    } 

    public void mouseReleased(MouseEvent e) { 
    } 

    public void mouseEntered(MouseEvent e) { 
     System.exit(0); 
    } 

    public void mouseExited(MouseEvent e) { 
    } 

    public void mouseClicked(MouseEvent e) { 
    } 

    public boolean keyDown(Event e, int key) { 
     return true; 
    } 

    public void GameLoop() { 
     if (Running) { 
      if (R != 0xff) { 
       R++; 
      } else { 
       if (G != 0xff) { 
        G++; 
       } else { 
        if (B != 0xff) { 
         B++; 

        } else { 
         System.exit(0); 
        } 
       } 
      } 
      try { 
       sleep(20); 
      } catch (InterruptedException e) { 

       e.printStackTrace(); 
      } 
      paint(getGraphics()); 
     } 
    } 

    public void sleep(int time) throws InterruptedException { 
     Thread.sleep(time, 0); 
    } 
} 
+0

コードを表示できますか?理解していますが、コードを表示するとさらに理解できます。 :) – fireshadow52

+0

私たちはあなたがすでに試したことについてもう少し詳しく知る必要があります。 – jjnguy

+2

GUIを正しくコーディングした後、すでにイベント処理ループに入っている場合は、何も追加する必要はありませんが、興味のあるイベント(この場合はマウス/キーボード)に登録してから、便利なことをしてくださいあなたの登録メソッドが開始されたとき。しかし、あなたは***すべき***しかし、SwingUtilitiesを使用して、便利なinvokeLaterメソッドを使って、画面のリフレッシュ(描画/更新)を別のスレッドに委譲します。詳細なヘルプが必要な場合は、コードを記入する必要があります。 – Perception

答えて

1

This tutorialは、プログラムをどのように構成するべきかについていくつかの洞察を提供する必要があります。 this oneはマウスリスナーに役立ちます。あなたが取り組むべき

問題:
1)あなたはpaint方法と生臭い何かをやっています。なぜあなたはt.run()に電話していますか?スレッドtはすでに実行中で、常に画面を再描画するためにpaint()メソッドを呼び出してループしています。この通話を削除し、あなたが得るものを見てください。

1)あなたのスレッド/アプリケーションの破壊は貧弱です。最初の例は、上記のあなたがmouseClicked()にコメント//on mouse clickが、何もないmousePressed()であなたのSystem.Exit(0)を持っている)

2を発生するために、そのためのより良い方法を提供しています...それは動作しますが、あなたのクラスを持って悪い慣習

3) mainという名前は、混乱して実用的ではない非常に貧弱な規約です。クラス名を「ゲーム」などの名前に変更します。

4)Screenを使用しないと宣言するのはなぜですか?

+0

本当に変わっています、1)それを使ってすべてを試しても覚えていましたが、修正しました...昨日、おそらくあまりにも疲れていました。ありがとうございました –

+0

あなたのアプリケーションでは何が壊れていますか?それは私のために暗闇の中で一種のショットだったので、知っているのは良いことだ。 – Grambot

0

初期化時に実行変数をtrueに設定することがわかりました。この変数は、ゲームを停止する必要があるかどうかを判断するために使用されます。しかし、私はこの変数の値をfalseに変更する場所は見当たりません。これはあなたのゲームが決して出てこない理由を説明します。

ゲームが機能しない場合は、IDEでアプリケーションをデバッグしてみてください。例外があれば、何が投げられているのか、あなたが質問している変数の値に注意を払うべきです。うまくいけば、これはあなたにあなたのアプリの振る舞いについての洞察を与えるでしょう。

新しい情報があれば更新することを忘れないでください。途中であなたを手伝ってください。

関連する問題