【问题标题】:Basic bouncing ball program, ball won't bounce off wall基本的弹跳球程序,球不会从墙上反弹
【发布时间】:2013-10-17 16:14:14
【问题描述】:

所以我应该编写一个程序,让球在绘图板上弹跳 10 秒。如果击中它们,球必须从面板的侧面反弹。现在,当球击中底部面板而不是弹跳时,它会出现在屏幕中间并朝相反方向移动,直到击中顶部并消失。

我很确定问题出在我的这部分代码中... (在代码的前面,我将 x 声明为 1,y 声明为 250,dx 声明为 1,dy 声明为 1)

//Changes dirction 
public static int newDirection1(int x, int dx, int size){
  if (x < 0 || x > 500 || (x + size) < 0 || (x + size) > 500)  {
    dx *= -1;
    return dx;
  } else {
    return dx;
  } 
} 

//Changes direction 
public static int newDirection2(int y, int dy, int size){
  if (y < 0 || y > 500 || (y + size) < 0 || (y + size) > 500)  {
    dy *= -1;
    return dy;
  } else {
    return dy;
  } 
 } 

 //Moves ball one step
 public static void move(Graphics g, Color color, int size, int x1, int y1, int x2, int y2){

   g.setColor(Color.WHITE);
   g.fillOval(x1, y1, size, size);
   g.setColor(color);
   g.fillOval(x2, y2, size, size);


 } 

 //Pauses for 10ms
 public static void sleep(int millis, DrawingPanel panel){
   panel.sleep(millis);
 } 


public static void bounceLoop(DrawingPanel panel, Graphics g, Color color, int size, int x, int dx, int y, int dy, int millis){

   int x1 = x + dx;
   int x2 = x + dx;
   int y1 = y + dy;
   int y2 = y + dy;

   for (int i = 0; i < 1000; i++) {

     x1 = x + dx * i;
     x2 = (x + dx * i) + dx;
     y1 = y + dy * i;
     y2 = (y + dy * i) + dy;
     dx = newDirection1(x2, dx, size);
     dy = newDirection2(y2, dy, size); 
     move(g, c, size, x1, y1, x2, y2);
     sleep(millis, panel);

   } 
  } 

} 

【问题讨论】:

  • 在 SO 的其他地方有很多这个赋值的例子,例如问题 13022754。(顺便说一句,很奇怪你计算 dx 和 dy 然后移动而不刷新新坐标的值.)

标签: java


【解决方案1】:

在循环中不要使用:

x1 = x + dx * i  

使用

x1 = x1 + dx 

(y 相同)
因为每当 dx 发生变化时,乘以 -1,而不是从原来的位置继续,然后转到另一个方向,它将从面板的另一侧继续,或者一个真正偏离的点。

还有一些可能修复编码的事情:
1- getNewDirection 不需要 dx 参数,只需要坐标。
2-边界条件可能会给你带来错误,给它一个肉眼看不到的小偏移量,以避免在创建的面板之外创建对象或你正在使用的任何东西时出错

【讨论】:

  • 谢谢,球现在从墙上反弹了。边界必须是 0 和 500,但是,每当球撞到墙壁时,球就会留下拱门……有没有办法在不改变边界的情况下摆脱这些拱门?
  • 就像我说的,尝试改变边界。例如,将它们设置为 4 和 496 可以解决一些错误。虽然我必须查看代码才能理解为什么它离开了一个拱门当到达边界时它可能与循环有关,它可能会跳过通常会删除球先前位置的特定行。所以我建议你在每次球移动时清除屏幕。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-30
  • 2013-05-23
  • 2020-11-01
相关资源
最近更新 更多