2011-06-20 4 views
1

私は、Javaスイングアプレットでモルモットを作成していますが、私はモルメを出すタイミングに問題があります。私はペイント(私)のループを避け、モルの座標をあまりにも速くランダム化することはできないようです。彼らがヒットしなかった場合、どうやって起き上がり、しばらく滞在するのかを遅らせることができますか?プログラム全体を遅らせずにこの遅延を作成するにはどうすればよいですか?プログラム全体の速度を落とすことなく、モルディレイ法を叩きます。

import java.awt.*; 
import java.awt.event.*; 
import java.util.*; 

import javax.swing.*; 
import javax.swing.Timer; 

public class Game extends JApplet 
{ 

    boolean titleScreen = true; 
    boolean gameBegin = false; 

    // ///////////////////////////////// 
    // ///// IMAGE ///////// 
    // ///////////////////////////////// 

    Dimension dim; 
    Image offscreen; 
    static Graphics bufferGraphics; 
    static Image h1, h2, bg, gamebg, button1a, button1b, button2a, button2b; 
    static Image m1, m1a, m1b, m2a, m2b; 
    static Image[] mk = new Image [9]; 

    // ///////////////////////////////// 
    // ///// MOUSE ///////// 
    // ///////////////////////////////// 

    Cursor c; 
    boolean myButtonPressed = false; 
    boolean myButtonEntered = false; 
    int myMouseX = 0, myMouseY = 0; 
    int myRow = -1, myCol = -1; 

    // ///////////////////////////////// 
    ///GAME VARIABLES /// 
    // ///////////////////////////////// 

    private static final int[] mX = {5, 170, 335, 5, 170, 335, 5, 170, 335}; 
    private static final int[] mY = {5, 5, 5, 170, 170, 170, 335, 335, 335}; 
    int rand, randm; 

    static int[] t = new int [9]; 

    static boolean mhhit = false; 
    static boolean[] mhit = {false, false, false, false, false, false, false, false, false}; 
    private int[] respawnCounter = {0, 0, 0, 0, 0, 0, 0, 0, 0}; 
    private int[] removeCounter = {0, 0, 0, 0, 0, 0, 0, 0, 0}; 

    static int score = 0; 

    public JFrame window; 
    // ///////////////////////////////// 
    // ///// BUTTON ///////// 
    // ///////////////////////////////// 

    GameScreen g1 = new GameScreen(); 
    Timer repaintTimer = null; 
    // GameTime m1 = new GameTime (t[]); 
    // GameTime m2 = new GameTime (t[]); 
    // GameTime m3 = new GameTime (t[]); 
    // GameTime m4 = new GameTime (t[]); 
    // GameTime m5 = new GameTime (t[]); 
    // GameTime m6 = new GameTime (t[]); 
    // GameTime m7 = new GameTime (t[]); 
    // GameTime m8 = new GameTime (t[]); 
    // GameTime m9 = new GameTime (t[]); 

    public Game() 
    { 
     window = new JFrame ("Monkeying Around"); 
     window.setResizable (false); 
     window.setSize (800, 400); 
     window.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 

    } 


    public void init() 
    { 
     // ///////////////////////////////// 
     // ///// IMAGE ///////// 
     // ///////////////////////////////// 
     dim = getSize(); 
     setBackground (Color.white); 
     offscreen = createImage (dim.width, dim.height); 
     bufferGraphics = offscreen.getGraphics(); 

     // Getting all the images 
     m1a = getImage (getCodeBase(), "m1a.gif"); 
     m1b = getImage (getCodeBase(), "m1b.gif"); 
     m1 = getImage (getCodeBase(), "m1.gif"); 

     h1 = getImage (getCodeBase(), "hammer.gif"); 
     h2 = getImage (getCodeBase(), "hammer2.gif"); 
     bg = getImage (getCodeBase(), "mainbg.gif"); 
     gamebg = getImage (getCodeBase(), "gbg.gif"); 
     button1a = getImage (getCodeBase(), "button1a.gif"); 
     button1b = getImage (getCodeBase(), "button1b.gif"); 
     button2a = getImage (getCodeBase(), "button2a.gif"); 
     button2b = getImage (getCodeBase(), "button2b.gif"); 

     for (int mnum = 0 ; mnum < 9 ; mnum++) 
     { 
      mk [mnum] = m1; 
     } 
     /////////////////////// 
     /////// MOUSE ///////// 
     /////////////////////// 

     Toolkit tk = Toolkit.getDefaultToolkit(); 
     c = tk.createCustomCursor (tk.getImage (""), new Point (0, 0), "invisible"); 
     setCursor (c); 

     addMouseListener (new MyMouseListener()); 
     addMouseMotionListener (new MyMouseMotionListener()); 

     repaintTimer = new Timer (500, new RepaintAction (this)); 
     // start the timer. 

    } // end init method 


    public void start() 
    { 
    } 


    public Image getMouseImage() 
    { 
     if (myButtonPressed) 
     { 
      return h2; 
     } 
     return h1; 
    } 


    public void handleMouseEvents() 
    { 
     int nCol = myMouseX - 50; 
     int nRow = myMouseY - 50; 
     if (!myButtonEntered) // assumed to be: if myButtonEntered is 
      // not = true i.e. false 
      nCol = nRow = -1; 
     if (nCol != myCol || nRow != myRow) 
     { 
      myRow = nRow; 
      myCol = nCol; 
     } 

     repaint(); 
    } // end handleMouseEvents method 


    ///////////////////////////////////// 
    /////// MOUSELISTENER CLASS ///////// 
    ///////////////////////////////////// 

    public class MyMouseListener implements MouseListener 
    { 
     public void mousePressed (MouseEvent me) 
     { 
      myButtonPressed = true; 
      myMouseX = me.getX(); 
      myMouseY = me.getY(); 
      handleMouseEvents(); 
     } 

     public void mouseReleased (MouseEvent me) 
     { 
      myButtonPressed = false; 
      myMouseX = me.getX(); 
      myMouseY = me.getY(); 
      handleMouseEvents(); 
     } 

     public void mouseEntered (MouseEvent me) 
     { 
      myButtonEntered = true; 
      myMouseX = me.getX(); 
      myMouseY = me.getY(); 
      handleMouseEvents(); 
     } 

     public void mouseExited (MouseEvent me) 
     { 
      myButtonEntered = false; 
      myMouseX = me.getX(); 
      myMouseY = me.getY(); 
      handleMouseEvents(); 
     } 

     public void mouseClicked (MouseEvent me) 
     { 
      myMouseX = me.getX(); 
      myMouseY = me.getY(); 
      handleMouseEvents(); 
     } 
    } // end MyMouseListener class 


    public class MyMouseMotionListener implements MouseMotionListener 
    { 
     public void mouseMoved (MouseEvent me) 
     { 
      myMouseX = me.getX(); 
      myMouseY = me.getY(); 
      handleMouseEvents(); 
     } // end mouseMoved method 

     public void mouseDragged (MouseEvent me) 
     { 
      myMouseX = me.getX(); 
      myMouseY = me.getY(); 
      handleMouseEvents(); 
     } // end mouseDragged method 
    } // end MyMouseListener class 


    public void mouse() 
    { 
     // logic to render mouse... 
     if (myRow != -1 && myCol != -1) 
     { // if you do not hit co-ordinates -1 
      // (out of bounds) then 
      Image mouseImage = getMouseImage(); 
      bufferGraphics.drawImage (mouseImage, myCol, myRow, 100, 100, null, this); 
     } // end if 
    } 


    public void paint (Graphics g) 
    { 
     bufferGraphics.clearRect (0, 0, dim.width, dim.height); 
     repaint(); 
     if (titleScreen == true) 
     { 
      // System.out.println("drawing the main screen"); 
      mainScreen(); 
     } 
     if (gameBegin == true) 
     { 
      game (g); 
     } 
     mouse(); 
     g.drawImage (offscreen, 0, 0, this); 
    } // end Paint method 


    public void update (Graphics g) 
    { 
     paint (g); 
    } 


    public void mainScreen() 
    { 
     bufferGraphics.drawImage (bg, 0, 0, 600, 500, Color.red, this); 
     bufferGraphics.drawImage (button1a, 427, 384, 159, 49, Color.red, this); 
     bufferGraphics.drawImage (button2a, 427, 440, 159, 49, Color.red, this); 
     mouse(); 
     if (myButtonPressed == true) 
     { 
      if (myRow > (384 - 50) && myRow < (433 - 50) && myCol > (427 - 50) 
        && myCol < (586 - 50)) 
      { 
       titleScreen = false; 
       gameBegin = true; 
      } 
      else if (myRow > (340 - 50) && myRow < (489 - 50) 
        && myCol > (427 - 50) && myCol < (586 - 50)) 
      { 
       titleScreen = false; 
      } 
     } 
    } 





    public void game (Graphics g) 
    { 
     // new ReminderBeep (5); 
     bufferGraphics.drawImage (gamebg, 0, 0, 600, 500, Color.red, this); 
     for (int i = 0 ; i < 9 ; i++) 
     { 
      bufferGraphics.drawImage (mk [i], mX [i], mY [i], 160, 160, Color.red, this); 
     } 

     g.drawString ("har", 520, 140); 
    } 


    public void monkeyhit() 
    { 
     if (myButtonPressed == true) 
     { 
      for (int hit = 0 ; hit < 9 ; hit++) 
       if (mhit [hit] == true && myRow > (mY [hit] - 50) && myRow < (mY [hit] + 160 - 50) 
         && myCol > (mX [hit] - 50) && myCol < (mX [hit] + 160 - 50)) 
       { 
        mk [hit] = m1b; 
        mhhit = true; 
        mhit [hit] = false; 
        score += 10; 
       } 
     } 
     // reset(); 
    } 


    public void run() 
    { 
     monkey(); 
    } 


    // public void reset() 
    // { 
    //  mhhit = false; 
    //  for (int x = 0 ; x < 9 ; x++) 
    //  { 
    //   mk [x] = m1; 
    //   mhit [x] = false; 
    // 
    //  } 
    // 
    // } 


    public void monkey() 
    { 
     rand = ((int) (Math.random() * 100000000)) + 10000000; 
     randm = ((int) (Math.random() * 100)); 


     if (randm <= 8) 
     { 
      for (int a = 0 ; a < 9 ; a++) 
      { 
       if (randm == a) 
       { 
        mhit [randm] = true; 
        mk [randm] = m1a; 
       } 
       else if (randm != a) 
       { 
        mhit [a] = false; 
        mk [a] = m1; 
       } 
      } 

      for (int i = 0 ; i < rand * 100 ; i++) 
      { 
       monkeyhit(); 
       if (mhit [randm] = false) 
        mk [randm] = m1; 
       break; 
      } 
     } 
    } 



    // Timer 
    class GameTime 
    { 
     Toolkit toolkit; 
     Timer timer; 

     public GameTime (int seconds) 
     { 
      toolkit = Toolkit.getDefaultToolkit(); 
      timer = new Timer (seconds, new MTask()); 
      timer.start(); 
     } 


     /* 
     public void delay(int seconds) { 
       toolkit = Toolkit.getDefaultToolkit(); 
       timer = new Timer(); 
       timer.schedule(new Mdelay(), seconds * 1000); 
     } 
     */ 

     class MTask implements ActionListener 
     { 
      public void actionPerformed (ActionEvent ae) 
      { 
       /* 
       for (int tsec = 0; tsec < 9; tsec++) { 
         t[tsec] = ((int) (Math.random() * 11)) * 5; 
       } 
       */ 

      } 
     } 
    } 


    class RepaintAction implements ActionListener 
    { 
     Game game; 
     public RepaintAction (Game game) 
     { 
      this.game = game; 
     } 


     public void actionPerformed (ActionEvent e) 
     { 
      game.repaint(); 
     } 
    } 
} 

答えて

2

決して (更新を上書き)とペイント()しないでください助けてください。これはSwingで使われていない古いAWTコードです。

Swingのカスタムペイントは、JPanelまたはJComponentのpaintComponent()メソッドをオーバーライドして行います。次に、アプレット(またはフレームまたはダイアログまたはウィンドウ)のコンテンツペインにコンポーネントを追加します。

詳細と例については、Custom PaintingのSwingチュートリアルのセクションをお読みください。

また、スウィングでは、ペイント方法内からrepaint()を呼び出すことは決してありません。これは、これが無限ループを引き起こすためです。

+0

が記載されている。どうもありがとうございました。 – jeesoo

+1

Swingでは 'paint()'が引き続き使用されています。Swingコンポーネントのコンテンツ、枠線、および子をペイントします。しかし、あなたが言ったように、AWTコンポーネントの 'paint()'メソッドをオーバーライドすることは、Swingコンポーネントの 'paintComponent(...)'メソッドをオーバーライドすることと同じです。また、 'paint()'をオーバーライドしたい場合もあります。例えば、アプリケーションがそのコンポーネントのレンダリングのすべて(例えば半透明)のグラフィックス状態を変更したいときなどです。 – mre

+0

ここで重要な部分を強調する答えを編集しました。 –

1

あなたは、startTime、upTime、およびcoordinatesを持つMoleクラスを作成し、メインゲームクラスにモル数のArrayListを作成できます。次に、ペイントループで、割り当てられた時間の間にどんな魔力がアップしているかどうかを確認し、そうであれば、それを削除します。常に一定のモル数を維持するために、ランダムに開始する時間(現在の時間に基づく)、アップ時間、および座標で破壊される各モルを置き換えるために新しいモルを作成することができます。

for(Mole mole : this.moles) { 
    if(System.currentTimeMillis() - mole.getStartTime() >= mole.getUpTime()) { 
     this.moles.remove(mole); 
    } 
} 

スレッディングは、しかし、はるかに複雑な選択肢でもあります。

+0

「あなたのペイント・ループ」はどういう意味ですか?ペインティングメソッドにプログラムロジックがあることを意味するなら、私は強く反対する必要があります。絵画の方法は絵画だけでなく、他のものでなければなりません。あなたが望むときに呼び出されるという保証はなく、あなたが期待していないときに呼び出すことができ、できるだけ速く盲目的にする必要があります。 –

+0

何をお勧めしますか?私はモル数を更新するための別のスレッドを持つことができ、またはパウロのようなMVC構成を実装することができると思います。 –

+2

彼の目的のためには、単純なスイングタイマーで十分であり、私はバックグラウンドスレッドが必要であるとは思わない。ロジックはSwing Timerに入り、プログラムの状態を変更し、再描画を呼び出して、GUIがプログラムの変更された状態を視覚的に表示できるようにします。しかし、塗装メソッド(paintまたはpaintComponent)でプログラムの状態を決して変更しないでください。 –

3

あなたのペインティングメソッド(またはそこから呼び出されたメソッド)では、ペインティングだけを行うべきで、マウスがどこにあるかを確認することはありません。

他はすべて別々に行う必要があります。例えば、モル(またはサル)の位置を計算する(ランダム化する)べきではなく、例えばタイマー法で行うべきである。

アプレットにはモデルが必要です。このモデルは、ユーザー操作とランダムイベントによって変更されます。次に、このモデルをペイント法で調べ、これに基づいてペイントします。

+0

このモデルはどのように作成すればよいですか?新しいクラス?新しい方法? – jeesoo

+0

あなたのケースでは、モデルはあなたの 'GAME VARIABLES'のほとんどであると私は思います。これを分かりやすくするために別のクラスに入れることもできます。重要な部分は、どこから変更したのか、どこから読んだだけなのかです。 –

+0

+1は明確な懸念事項を明確にします。 – trashgod

2

このモデルはどのように作成しますか?

あなたのデザインを導く非常に簡単なgameです。モデルとビューの分離を示しています。関連する例にもリンクしています。 List<Mole>Moleとのモデルがjavax.swing.Timerのモデルが適しているようです。モデルは、モルが状態を変えたときにビューに通知し、ビューはモデルにマウスヒットテストを照会することができます。

関連する問題