2014-12-30 17 views
0

問題:因此,我創建了一個帶有Window類的程序,該類創建了一個JFrame,並在其上添加了一個來自我的DrawStuff類的JPanel。 DrawStuff類創建一個(應該)在屏幕上彈跳的球,當它碰到JFrame邊界時,改變方向。球移動,但由於某種原因,我的移動方法的checkbounds部分不起作用。任何幫助將不勝感激。我的目標是保持球的界限。從DrawStuff類爲什麼我的move()方法不讓球保持邊界?

代碼:

public class Drawstuff extends JPanel { 
    private int x = 0; 
    private int y = 0; 
    private int dx, dy=0; 

    public Drawstuff(){ 
     x = 300; 
     y = 250; 
     dx = 0; 
     dy = 0; 
    } 
    public void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 
     Graphics2D g2d = (Graphics2D) g; 
     this.setBackground(Color.BLACK); 
     g2d.setColor(Color.RED); 
     g2d.fillOval(x,y,50,50);  
    } 
    public void move(){ 

     if (x < 600){ 
      dx = 1; 
     } 
     if (y < 500){ 
      dy = 1; 
     } 
     if (x > 600){ 
      dx = -1; 
     } 
     if (y >500){ 
      dy = -1; 
     } 
     x += dx; 
     y += dy; 
    } 

} 

簡單的 「GameLoop」 從窗口類(如果需要)

while (true){ 
      stuff.repaint(); 
      stuff.move(); 
      try { 
       Thread.sleep(5); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
+0

那麼它目前做了什麼?對不起,再次看到我的壞 –

+1

'if(x <600){}'???你不是指'如果(x <0)'?與「y」相同... – FoggyDay

+1

如果x == 600,您只是不動? –

回答

3

move是錯誤的。它的邏輯是錯誤的。你想讓球彈起來,所以當它撞到牆上時,它的運動就會反轉。你所做的是:如果是在室外進入室內,當進入室外時,更改爲:

public void move(){ 
     if (x < 0) { // left bound 
      dx = 1; // now move right 
     } 
     if (y < 0){ // upper bound 
      dy = 1; // now move down 
     } 
     if (x > 600){// right bound 
      dx = -1; // now move left 
     } 
     if (y >500){ // lower bound 
      dy = -1; // now move up 
     } 
     x += dx; 
     y += dy; 
    } 

以備將來使用,我可以建議你做以下方式:

public void move(){ 
     if (x < 0) { // left bound 
      dx = -dx; // now move right, same speed 
      x=-x;  // bounce inside 
     } 
     if (y < 0){ // upper bound 
      dy = -dy; // now move down, same speed 
      y=-y;  // bounce inside 
     } 
     if (x > 600){  // right bound 
      dx = -dy;  // now move left, same speed 
      x=600-(x-600); // bounce inside 
     } 
     if (y >500){  // lower bound 
      dy = -dy;  // now move up, same speed 
      y=500-(y-500); // bounce inside 
     } 
     x += dx; 
     y += dy; 
    } 

所以,你現在可以使用你想要的(至少不無道理)任何矢量速度。矢量座標與撞擊相對應,並將球重新定位在邊界內。

+0

感謝您的幫助。然而,在其中一位用戶指出我的錯誤邏輯後,我將其改爲上面的內容。出於某種原因,現在我的圈子根本不動? @ Jean-Baptiste – imgolden62

+0

不僅像素座標,例如 - 1.Thread.sleep(5);在標準Native OS的延遲下,標準最小值應該是25-33,2.從Swing Timer調用Java6和更新版本,因爲Thread.sleep(int);阻止一個EDT,更多在Oracle教程Concurncy in Swing – mKorbel

+0

@mKorbel我不確定我是否理解了你所說的所有內容,但是如果它有幫助,圓圈就會以適當的速度移動,移動邏輯處於我的發佈移動方法中。然後,我只是改變了兩個「霧天」提示的語句邏輯,現在我的圈子根本不動。有什麼建議麼? – imgolden62