【问题标题】:Generate falling Graphics with loops and randomizers使用循环和随机发生器生成下降图形
【发布时间】:2018-06-03 12:01:53
【问题描述】:

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

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

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

如何创建一个每 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);
    }
}
}

【问题讨论】:

  • “如何创建一个每 2 秒创建一个新的下降元素的循环?” 创建一个每两秒触发一次的 Swing Timer。发生这种情况时创建新的陨石。详情请见How to Use Swing Timers

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


【解决方案1】:

首先,您需要一个游戏循环 (gl)。 gl 更新屏幕上每个对象的状态和位置,以及屏幕上看不到的其他与状态相关的对象。

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

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

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

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

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

所以总而言之,有一个 gl,有一个注册到 gl 的对象,负责在屏幕上放置新的下落对象,让我们将此对象称为 ObjectDropper。 ObjectDropper 将实现类似 AnimationTimer 的功能,因此您的 gl 可以在每一帧调用它。它将决定何时丢弃对象,还可以决定该对象将从何处丢弃的随机点。您将拥有将要掉落的对象,它们将获得诸如起点在哪里、终点在哪里以及掉落需要多长时间之类的信息,甚至可能还有一个插值器。这些对象也将注册到 gl 并在每一帧被调用,以便它们可以根据它们的插值器调整它们的位置。

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

【讨论】:

    猜你喜欢
    • 2014-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-30
    • 2011-02-12
    • 1970-01-01
    • 2020-10-02
    相关资源
    最近更新 更多