1

我试图让球从窗户顶部掉下来。我将球对象存储在 ArrayList 中,目前,我正在这样做。

for (int i = 0; i < balls.size(); i++) {
    Ball b = (Ball) balls.get(i);
    if (b.isVisible()) {
        b.move();
    }

move 函数只是改变了球的 y 坐标,所以它会从屏幕上掉下来。

此刻,一切都在完全相同的时间被绘制,并在完全相同的时间落下。

例如http://puu.sh/xsGF

我怎样才能让它以随机的间隔掉落?

我的 move() 函数如下。

    public void move() {

    if (y > 480) {
        this.setVisible(false);
        System.out.println("GONE");
    }
    y += 1;
}
4

4 回答 4

1

您可以在游戏循环期间随机添加球。

//add new balls randomly here:
if(<randomtest>) {
    balls.add(new Ball());
}
for (int i = 0; i < balls.size(); i++) { 
  Ball b = (Ball) balls.get(i); 
  if (b.isVisible()) { 
      b.move(); 
  }
  else {
    //also might be good idea to tidy any invisible balls here
    //if you do this make sure you reverse the for loop
  }
}
于 2012-05-29T08:20:43.193 回答
0

你可以做两件事:

  1. 添加计时器。当计时器响起时(例如每 10 毫秒),选择一个随机球,然后让那个球下降 1 像素。(请注意,由于随机因素,您会得到在不同时间以不同速度下落的球

  2. 初始化球时使用随机速度值。将 y 坐标增加该速度值,因此球将以不同的速度从屏幕上落下。

于 2012-05-29T08:18:49.527 回答
0

如果您想要恒定速度,最简单的方法是将它们放置在视口顶部的随机位置。

因为我猜你已经在屏幕外画了它们,所以只需在那里添加一个随机位移就可以了。例如:

ball.y = -radius + random.nextInt(100);
于 2012-05-29T08:22:48.377 回答
0

好的,看到你的移动功能,这在物理上并不正确。你应该有一个加速度。这使球更真实地落下(当然有空气阻力等,但我认为现在这已经足够了)。为了让它们随机掉落,您可以随机添加它们(使它们在随机时间实例中存在/可见)等等。

class Ball {
  private double acc = 9.81; // or some other constant, depending on the framerate
  private double velocity = 0;
  private double startFallTime = Math.random()*100; // set from outside, not here!

  public void move() {
    // check if ball is already here
    if (startFallTime-- > 0) return;
    if (y > 480) {
      this.setVisible(false);
      System.out.println("GONE");
    }
    velocity += acc; 
    y += velocity;
  }
}

编辑:当然加速的东西是可选的,这取决于你想要什么。如果你想要线性运动,那么你的方法很好,如果球有加速度,它看起来会更好。;) 另外,我建议在随机实例中添加球,而不是使用我使用的这个 startFallTime,因为这在物理上并不正确。不过要看你的需求,所以你必须自己找出正确的方法。

于 2012-05-29T08:23:38.230 回答