使用循环和随机化器生成下降图形

时间:2018-06-03 12:01:54

标签: java swing loops for-loop while-loop

我需要一个代码,更具体地说是一个游戏,其中陨石坠落,用户必须用箭头键躲闪它们。

移动播放器不是我的问题。我最后会这样做。

我想出了如何创建一个从上到下落下的动画对象。

如何创建一个每2秒创建一个新的下降元素的循环?元素的位置应该是随机的。

这是我目前的代码:

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import javax.swing.JFrame;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class Game extends JPanel {

int x = 135;
int y = 0;

private void moveBall() {
    y = y + 1;
}

@Override
public void paint(Graphics g) {
        super.paint(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.fillOval(x, y, 30, 30);
}

public static void main(String[] args) throws InterruptedException {
    JFrame frame = new JFrame("Meteorites");
    Game game = new Game();
    frame.add(game);
    frame.setSize(300, 400);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    while (true) {
        game.moveBall();
        game.repaint();
        Thread.sleep(10);
    }
}
}

1 个答案:

答案 0 :(得分:0)

首先你需要一个游戏循环(gl)。 gl更新屏幕上每个对象的状态和位置以及屏幕上未显示的其他状态相关对象。

对象应该很容易将自己注册到gl。 gl不负责更新每个对象的状态,但它会回调每个已注册的对象以自行更新(或更新它负责的其他对象,例如,碰撞检测对象将更新屏幕上的任何对象相撞)。

gl以纳秒(通常)将当前时间传递给已向gl注册的所有对象。例如,查看AnimationTimer in Javafx。在JavaFX中,通过创建一个AnimationTimer并在其上调用start方法,JavaFX将在每一帧上调用你的handle方法......实际上是将它注册到JavaFX的主线程(或游戏循环)。

所以你需要创建一个gl。向它注册对象,可能创建一个类似于JavaFX的AnimationTimer的接口或抽象类,以便对象可以将自己注册到gl。 gl不应该有任何Thread.sleeps,但是如果它确实它应该非常短,我想你只会在你的gl快速加入时加入它,因为可能没有很多东西被计算(因此没有用来削弱CPU),但你可以调整它。我知道在JavaFX游戏上工作,我可以告诉你,我们非常努力地将任何延迟降低到最低限度,因此没有Thread休眠,因为这会停止动画的顺畅流动。

更新的对象将跟踪时间的流逝,并可以根据经过的时间执行事件。例如,您可以拥有一个将自身注册到gl的对象,并负责在屏幕上放置新的下降动画对象。它可以有一个字段,表示在删除下一个项目之前等待多长时间。由于gl每次调用它,它可以看到经过了多少时间,当x秒经过时,它可以创建并删除下一个对象,然后重置其计时器。

动画对象的下降也会被gl调用,因此它们可以平滑地下降。在每一帧,这些落下的物体将计算它们的新位置。通常这是使用插值器完成的(这是一个很好的想法来研究这个)。插值器可以很容易地抽象出动画对象的位置应该相对于经过的一小部分时间。例如,如果我在X距离和Y时间线性移动项目,插值器将告诉您在Y时间的百分比过去之后物体沿X距离的距离。插补器功能非常强大,因为您可以创建一个插补器,不仅可以线性移动物体,还可以减慢速度或加快速度(如重力效果),它甚至可以为物体添加弹跳效果。因此,您需要对此有一个坚定的理解。 JavaFX comes with interpolators。我过去也看过一些在线工具,可以根据你想要获得的动画效果来构建自己的JavaFX插值器。

所以要把它们放在一起,有一个gl,有一个对象注册到负责将新的下落对象放在屏幕上的gl,让我们调用这个对象ObjectDropper。 ObjectDropper将实现类似AnimationTimer的功能,因此可以通过gl每帧调用它。它将决定何时放置对象,还可以决定该对象将从哪里掉落的随机点。您将拥有将丢弃的对象,它们将被提供信息,例如它们的起始点,结束点所在的位置,以及丢弃所需的时间,甚至可能是插值器。这些对象也将被注册到gl并且每帧被调用,以便他们可以根据插值器调整它们的位置。

这是一个非常广泛的通用大纲,对大多数动画游戏来说都是如此。可能有工具和库可以在Swing中轻松实现。正如您所看到的,JavaFX已经设计用于处理许多这些概念。

相关问题