无法获得正确的条件

时间:2011-06-13 16:25:45

标签: java swing user-interface graphics 2d

我正在尝试制作一个弹跳球程序。我已经尝试了一些条件。但我没有得到我想要的东西。球继续在框架的对角线方向上来回移动。问题出在哪里?我已经强调了该计划的主要逻辑。

以下是该计划:

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如果问题不清楚,请编译然后运行以查看输出。

4 个答案:

答案 0 :(得分:3)

球从位置0,0开始。从那时起直到它撞到墙壁的每个时间步长,其x位置和y位置各自增加1.因此在时间471,其位置是(471,471)。此时转向的x和y条件都是正确的,因此两者都会切换并且球完全转动。

如果将起始位置更改为(0,30)或将其中一个速度更改为1或-1之外的其他值,您将看到代码正常工作。球将始终跟随一些循环,但由于框架尺寸和球的位置,你的碰巧非常小。

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

答案 1 :(得分:2)

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

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

但是当X大于宽度或Y大于高度时,你只希望它是负数。在另外两种情况下,您希望速度为正。

或者,也许你想要的是

speedX *= -1;

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

答案 2 :(得分: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;    

答案 3 :(得分: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);