2015-11-23 30 views
1

我試圖做一個彈跳球。邊界被設置爲允許球從起點開始,一旦超過邊界。我無法讓球彈跳。一旦邊界(邊框的外邊緣)被擊中,我該如何讓球彈起?我相信問題在於moveBall()方法。顛倒JFrame的界限

主類 import javax.swing.JFrame;

public class MainForm { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     MainFrame mainFrame = new MainFrame(); 
     mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     mainFrame.setSize(220, 270); 
     mainFrame.setVisible(true); 
    } 

} 

二等

import java.awt.BorderLayout; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class MainFrame extends JFrame { 

    private CustomPanel _panel; 

    public MainFrame() 
    { 
     super("Bouncing Ball"); 

     _panel = new CustomPanel(); 
     add(_panel, BorderLayout.CENTER); 
    } 
} 

第三類

import java.awt.Graphics; 
import javax.swing.JPanel; 


public class CustomPanel extends JPanel{ 

    private final BouncingBall _ball1; 
    private final BouncingBall _ball2; 
    private final BouncingBall _ball3; 

    public CustomPanel() 
    { 
     _ball1 = new BouncingBall(this, 20, 3); 
     Thread thread1 = new Thread(_ball1); 
     _ball2 = new BouncingBall(this, 40, 6); 
     Thread thread2 = new Thread(_ball2); 
     _ball3 = new BouncingBall(this, 60, 9); 
     Thread thread3 = new Thread(_ball3); 

     thread1.start(); 
     thread2.start(); 
     thread3.start(); 
    } 

    @Override 
    public void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 

     _ball1.draw(g); 
     _ball2.draw(g); 
     _ball3.draw(g); 
    } 
} 

第四類

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Rectangle; 

import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.swing.JPanel; 


public class BouncingBall implements Runnable { 

    private JPanel _panel; 
    private int _xComponent; 
    private int _yComponent; 
    private int _sleepDelay; 

    public BouncingBall(JPanel panel, int startingYPosition, int sleepDelay) 
    { 
     _panel = panel; 
     _xComponent = 0; 
     _yComponent = startingYPosition; 
     _sleepDelay = sleepDelay; 
    } 

    @Override 
    public void run() 
    { 
     while(true) 
     { 
      try 
      { 
       Thread.sleep(_sleepDelay); 

       moveBall(); 
       _panel.repaint(); 
      } 

      catch (InterruptedException ex) 
      { 
       Logger.getLogger(BouncingBall.class.getName()).log(Level.SEVERE,null, ex); 
      } 
     } 
    } 

    public void draw(Graphics g) 
    { 
     g.setColor(new Color(255, 0, 0)); 
     g.fillOval(_xComponent, _yComponent, 20, 20); 
    } 

    private void moveBall() 
    { 
     _xComponent += 2; 

     Rectangle bounds = _panel.getBounds(); 

     if(_xComponent >= bounds.width) 
      _xComponent = -_xComponent; 
    } 
} 

回答

1

您需要反轉速度(步驟)。

假設邊界是相對的,在(0,0)處,並且一個邊界在邊界內開始。

x += dx; 
    y += dy; 

    if (x < 0 || x > bounds.width) { 
     dx = -dx; 
     x += dx; 
    } 
    if (y < 0 || y > bounds.height) { 
     dy = -dy; 
     y += dy; 
    } 

x短手_xComponent

+0

中閱讀它是什麼dx和dy表示什麼? –

+0

更改x和y,步長,如代碼中的2。 –

+0

所以當我反轉代碼時,我要麼沒有框架,要麼在窗格右側停止或閃爍球。仍然沒有扭轉。 _xComponent + = 2; Rectangle bounds = _panel.getBounds();如果(_xComponent + 20 <0 || _x​​Component + 20> = bounds.width) { _xComponent = -2; _xComponent + = 2; –

0

_xComonent是球元件盒的左上角。所以,從右側的束縛鈕 「碰撞檢測」,你將不得不

if(_xComponent+ball.width >= bounds.width)

insteed的

if(_xComponent >= bounds.width)

同樣的事情也必須做到與底部「碰撞」。 可以直接檢測頂部和左側的colliisions。

現在另一件事情是當你反轉你的_xComponent確保減去或增加它時,你會立即移動你的「球」。請記住(0,0)是compoent/screen的左上角,而不是它的中心。所以基本上所有負面的組成部分都會導致畫面外的畫面。

在這裏,您直接從Oracle獲得了關於Swing座標系的一些信息。 https://docs.oracle.com/javase/tutorial/2d/overview/coordinate.html

+0

我沒有球變量,如果利用(_xComponent + ball.width)。我也不理解第二部分。那麼它是有道理的,如果我加/減它會帶來它的界限。那麼如何操作框架以使球的方向有界? –

+0

根據g.fillOval(_xComponent,_yComponent,20,20),你沒有ball.width,但是你的球是20px w/h;'首先你需要明白你所看到的不是實際的組件。因此,例如你的球組件不是橢圓形的,而是一個橢圓形的長方形,沒有任何背景。 – Antoniossss

+0

我的ide不識別命令ball.width。如果我發佈整個代碼會有幫助嗎?我有4個文件。 –