2011-06-13 84 views
1

我正在嘗試製作彈跳球的程序。我已經嘗試了一些條件。但我沒有得到我想要的東西。球繼續在框架的對角線方向上前後移動。問題在哪裏?我強調了這個計劃的主要邏輯。無法獲得正確的條件

下面是程序:

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

class MovingBall2D extends JPanel{ 
int x_Pos=0; 
int y_Pos=0; 
int speedX=1; 
int speedY=1; 
int diameter=30; 
int height=30; 
int frameX=500; 
int frameY=500; 

MovingBall2D() { 
    ActionListener taskPerformer = new ActionListener() { 
    public void actionPerformed(ActionEvent ae) { 
    if(x_Pos > (frameX - diameter)) {  // <------ logic starts from here 
     x_Pos = frameX - diameter; 
     speedX = -1; 
    } 
    else if(x_Pos < 0) { 
     x_Pos = 0; 
     speedX = 1; 
    } 
    else if(y_Pos > (frameY - diameter)) { 
     y_Pos = frameY - height; 
     speedY = -1; 
    } 
    else if(y_Pos < 0) { 
    y_Pos = 0; 
    speedY = 1; 
    } 
    x_Pos = x_Pos + speedX; 
    y_Pos = y_Pos + speedY;  
    repaint(); 
    } 
    }; 
    new Timer(10,taskPerformer).start(); // <------- logic ends here 
} 

public void paintComponent(Graphics g) { 
super.paintComponent(g); 
g.setColor(Color.red); 
g.fillOval(x_Pos,y_Pos,diameter,height); 
} 
} 

class Main2D { 
Main2D() { 
JFrame fr=new JFrame(); 
MovingBall2D o = new MovingBall2D(); 
fr.add(o); 
fr.setSize(500,500); 
fr.setVisible(true); 
fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
} 

public static void main(String args[]) { 
    new Main2D(); 
} 
} 

編輯 -球來回移動。 爲什麼會發生這種情況?我期待輸出shown here如果問題對任何人都不清楚,請編譯然後運行以查看輸出。

+0

你能解釋一下你所得到的嗎?和你想要得到什麼? – 2011-06-13 16:28:37

+0

那麼......你想要什麼?您應該準確描述您所看到的(問題是什麼?)以及您想要看到的內容(什麼是解決方案?)。球是否熄滅?球是否彈跳,但仍然在屏幕上以某些角度反彈之前熄滅?窗戶根本沒有露面嗎?我們不知道你想要什麼樣的答案。幫助我們幫助你:) – 2011-06-13 16:29:54

+0

@獵人我正在嘗試製作彈跳球的程序。我期望在這個applet中顯示的輸出http://www.roseindia.net/java/java-tips/45examples/40animation/40BouncingBall/bouncingball.shtml – 2011-06-13 16:30:05

回答

3

球從位置0開始,0。從此每次一步,直到撞到牆,其x位置和y位置每提高1。因此,在時間471,其位置是(471,471)。在這一點上,轉身的x和y條件都是真實的,所以兩者都會轉換並且球完全轉動。

如果您將起始位置更改爲(0,30)或將其中一個速度更改爲1或-1以外的其他值,您將看到代碼正常工作。球總是會跟隨一些循環,但由於球的大小和球的位置,你的球體非常小。

但是,我建議您刪除其他條件。在一個單一的框架內,球可能離得太遠而且離得太遠,所以在這個框架中,這兩個條件應該是固定的,而不是一個。此外,您可能會注意到球在y方向上繼續離開屏幕。這是因爲您的主框架被設置爲與面板相同的高度。框架高度包括用於頂部窗戶欄的部分,因此它需要比它所握住的面板稍大。

+0

是的,球繼續在屏幕上y方向並且也在x方向上。我可以做些什麼來避免這種情況? – 2011-06-14 05:14:58

+0

爲了避免這種情況,您需要初始化您的JFrame在y方向上稍大一些。我不確定究竟有多大,但像40像素。玩它。 – Deddryk 2011-06-14 13:11:02

+0

要使框架完全包含面板,請在MovingBall2D類上使用setPreferredSize()。例如在構造函數中,你說setPrefferedSize(新維(frameX,frameY))。然後,而不是顯式調用您的主框架fr.setSize()使用fr.pack()。這將自動調整框架的大小。 – Deddryk 2011-06-14 21:40:31

2

在你的情況下所有四個,你相應的速度設置爲-1:

speedX = -1; 
//... 
speedY = -1; 

但你只希望它是消極的,當X是大於寬度或Y是大於高度。在另外兩種情況下,你希望速度是積極的。

或者,也許你所追求的是

speedX *= -1; 

這將切換速度向相反的方向。

+0

@馬克·彼得斯,但現在球來回移動。我只是不想讓球來回移動。我希望在這裏顯示的輸出在這個小程序(http://www.roseindia.net/java/java-tips/45examples/40animation/40BouncingBall/bouncingball.shtml) – 2011-06-13 17:04:33

+0

@馬克·彼得斯我編輯我的問題,當x <0和y時,速度= 1 <0 – 2011-06-13 17:10:50

1

對我來說speedXspeedY沒有正確更新。我想應該是這樣的,而不是:

if(x_Pos > (frameX - diameter)) {  // <------ logic starts from here 
    x_Pos = frameX - diameter; 
    speedX = -1; 
} 
else if(x_Pos < 0) { 
    x_Pos = 0; 
    speedX = 1; 
} 
else if(y_Pos > (frameY - diameter)) { 
    y_Pos = frameY - height; 
    speedY = -1; 
} 
else if(y_Pos < 0) { 
y_Pos = 0; 
speedY = 1; 
} 
x_Pos = x_Pos + speedX; 
y_Pos = y_Pos + speedY;  
+0

我編輯了我的問題。製作速度= 1個球來回移動。我想要在此小程序中顯示的輸出(http://www.roseindia.net/java/java-tips/45examples/40animation/40BouncingBall /bouncingball.shtml) – 2011-06-13 17:15:34

1

我想你把所有的邏輯正確,但你的初始化使得它一定要斜着反彈(從左下到右上)

改變了,使用隨機值或硬編碼他們像這樣

int x_Pos=100; // These are changed so the ball no longer starts at bottom left 
int y_Pos=20; 
int speedX=1; //This should be fine as long as your initial position is different 
int speedY=1; 
int diameter=30; 
int height=30; 
int frameX=500; 
int frameY=500; 

我也認爲這會工作

int x_Pos = 100* Math.Rand(1); 

等。

+0

這是什麼'int x_Pos = 100 * Math.Rand(1);'?這給出了一個錯誤。 – 2011-06-14 05:15:48

+0

噢,這只是一種僞代碼(不符合語法上的正確)......基本上無論Rand()函數做什麼(通常它會返回一個從0到1的數字),您將它乘以得到所需的邊界,然後就可以得到任何數。只需找到Math.Rand()的文檔。 – Kiran 2011-06-14 14:25:05