Java 无法获得正确的条件

Java 无法获得正确的条件,java,swing,user-interface,graphics,2d,Java,Swing,User Interface,Graphics,2d,我正在尝试制作一个反弹球的程序。我试过一些条件,但是我没有得到我想要的。球在画面的对角线方向上不停地来回移动。问题出在哪里?我已经强调了该计划的主要逻辑。 节目如下: import java.awt.*; 导入java.awt.event.*; 导入javax.swing.*; 类MovingBall2D扩展了JPanel{ int x_Pos=0; int y_Pos=0; int-speedX=1; int=1; 内径=30; 整数高度=30; int frameX=500; int-fra

我正在尝试制作一个反弹球的程序。我试过一些条件,但是我没有得到我想要的。球在画面的对角线方向上不停地来回移动。问题出在哪里?我已经强调了该计划的主要逻辑。

节目如下:

import java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
类MovingBall2D扩展了JPanel{
int x_Pos=0;
int y_Pos=0;
int-speedX=1;
int=1;
内径=30;
整数高度=30;
int frameX=500;
int-frameY=500;
MovingBall2D(){
ActionListener taskPerformer=新建ActionListener(){
已执行的公共无效行动(行动事件ae){
如果(x_Pos>(frameX-diameter)){/(frameY-diameter)){
y_Pos=框架y-高度;
速度=-1;
}
否则如果(y_位置<0){
y_Pos=0;
速度=1;
} 
x_Pos=x_Pos+speedX;
y_Pos=y_Pos+快速;
重新油漆();
}
};

新计时器(10,taskPerformer).start();//在所有四种情况下,您都将相应的速度设置为-1:

speedX = -1;
//...
speedY = -1;
但是当X大于宽度或Y大于高度时,你只希望它是负的。在另外两种情况下,你希望速度是正的

或者,也许你想要的是

speedX *= -1;

这会将速度切换到相反的方向。

在所有四种情况下,您都将相应的速度设置为-1:

speedX = -1;
//...
speedY = -1;
但是当X大于宽度或Y大于高度时,你只希望它是负的。在另外两种情况下,你希望速度是正的

或者,也许你想要的是

speedX *= -1;

这会将速度切换到相反的方向。

在我看来,
speedX
speedY
没有正确更新。我认为应该是这样的:

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;    
if(x_Pos>(frameX-diameter)){/(frameY-diameter)){
y_Pos=框架y-高度;
速度=-1;
}
否则如果(y_位置<0){
y_Pos=0;
速度=1;
} 
x_Pos=x_Pos+speedX;
y_Pos=y_Pos+快速;

在我看来,
speedX
speedY
没有正确更新。我认为应该是这样的:

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;    
if(x_Pos>(frameX-diameter)){/(frameY-diameter)){
y_Pos=框架y-高度;
速度=-1;
}
否则如果(y_位置<0){
y_Pos=0;
速度=1;
} 
x_Pos=x_Pos+speedX;
y_Pos=y_Pos+快速;

球从位置0、0开始。在此后的每一个时间步,直到它撞到墙上,它的x位置和y位置都增加1。因此在时间471,它的位置是(471471)。此时,转身的x和y条件都为真,因此都被切换,球完全转身

如果您将起始位置更改为(0,30)或将其中一个速度更改为1或-1以外的速度,您将看到您的代码正常工作。球将始终跟随某个循环,但由于帧大小和球的位置,您的球恰好非常小


但是,我建议您删除else条件。在单个帧中,球可能会向左太远和向下太远,因此在该帧中,两个条件都应该固定,而不仅仅是一个。此外,您可能会注意到球在y方向继续离开屏幕。这是因为主帧设置为相同的高度作为面板。框架高度包括用于顶部窗框的部分,因此它需要比它所持的面板稍大。

球从位置0开始,0。在此后的每个时间步,直到它撞到墙上,它的x位置和y位置都增加1。因此在时间471,它的位置是(471471).此时,旋转的x和y条件都为真,因此两者都被切换,球完全旋转

如果您将起始位置更改为(0,30)或将其中一个速度更改为1或-1以外的速度,您将看到您的代码正常工作。球将始终跟随某个循环,但由于帧大小和球的位置,您的球恰好非常小


但是,我建议您删除else条件。在单个帧中,球可能会向左太远和向下太远,因此在该帧中,两个条件都应该固定,而不仅仅是一个。此外,您可能会注意到球在y方向继续离开屏幕。这是因为主帧设置为相同的高度作为面板。框架高度包括用于顶部窗口栏的部分,因此它需要比它所容纳的面板稍大。

我认为您的逻辑正确,但您的初始化确保它沿对角线反弹(从左下到右上)

更改它们,使用随机值或像这样硬编码它们

 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);

等等。

我认为您的逻辑都是正确的,但是您的初始化确保它沿对角线反弹(从左下到右上)

更改它们,使用随机值或像这样硬编码它们

 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);

等等。

你能解释一下你得到了什么?你想要得到什么吗?嗯……你想要什么?你应该准确地描述你看到了什么(问题是什么?)以及你想要看到什么(解决方案是什么?)。球是否离开屏幕?球是否在反弹,但在反弹到特定角度之前仍会离开屏幕?窗口是否根本没有显示?我们不知道您想要什么样的答案。帮助我们帮助您:)@Hunter我正在尝试制作反弹球的程序。我希望此小程序中显示的输出是我想要的输出你能解释一下你得到了什么吗?你想要得到什么吗?好吧…你想要什么?你应该准确地描述你看到了什么(问题是什么?)以及你想得到什么