2011-06-13 117 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