Генерация падающей графики с помощью петель и рандомизаторов - PullRequest
0 голосов
/ 03 июня 2018

Мне нужен код, а точнее игра, в которой падают метеориты, и пользователь должен увернуться от них с помощью клавиш со стрелками.

Перемещение игрока - не моя проблема.Я сделаю это в конце.

Я понял, как создать анимированный объект, падающий сверху вниз.

Как создать цикл, который создает один новый падающий элемент каждые 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 голосов
/ 03 июня 2018

В первую очередь вам понадобится игровой цикл (gl).Gl обновляет состояние и положение каждого объекта на экране и других связанных с состоянием объектов, не видимых на экране.

Для объектов должно быть легко зарегистрироваться в gl.Gl не отвечает за обновление состояния каждого объекта, но он вызывает каждый зарегистрированный объект для обновления себя (или обновления других объектов, за которые он отвечает, например, объект обнаружения столкновений обновит любые объекты на экране, которые имеютстолкнулся).

gl передает текущее время в наносекундах (обычно) всем объектам, зарегистрированным в gl.Например, посмотрите AnimationTimer в Javafx .В JavaFX, создав AnimationTimer и вызвав для него метод start, JavaFX будет вызывать ваш метод handle для каждого кадра ... по сути, регистрируя его в основном потоке JavaFX (или игровом цикле).

Таким образом, вы будетенужно создать гл.Зарегистрируйте в нем объекты, возможно, создайте интерфейс или абстрактный класс, похожий на JavaFX AnimationTimer, чтобы объекты могли регистрироваться в вашем gl.В GL не должно быть никаких Thread.sleeps, но если это произойдет, оно должно быть очень коротким, и я полагаю, что вы добавите его только в том случае, если ваш GL будет быстрым, потому что, возможно, не так много вычисляется (следовательно нет смысла наносить вред процессору), но вы можете настроить это.Я знаю, что работая над играми JavaFX, я могу вам сказать, что мы очень усердно работаем, чтобы свести к минимуму любые задержки, поэтому он не спит, потому что это остановит плавный ход вашей анимации.

Обновленные объекты будут отслеживать ход времени и могут выполнять события в зависимости от того, сколько времени прошло.Например, у вас может быть объект, который регистрируется в gl и отвечает за размещение новых падающих анимированных объектов на экране.Он может иметь поле, как долго ждать, прежде чем бросить следующий элемент.Так как он вызывается каждым кадром посредством gl, он может видеть, сколько времени проходит, и когда проходит x секунд, он может создать и отбросить следующий объект, а затем сбросить таймер.

Анимированные объектыпадение также будет называться gl, чтобы они могли плавно падать вниз.На каждом кадре эти падающие объекты будут вычислять свою новую позицию.Обычно это делается с помощью интерполятора (это хорошая идея, чтобы разобраться в этом).Интерполяторы позволяют легко абстрагироваться от того, где положение анимирующего объекта должно быть относительно доли проходящего времени.Например, если я перемещаю элемент линейно по расстоянию X и времени Y, интерполятор скажет вам, как далеко по расстоянию X должен быть объект после прохождения процента времени Y.Интерполяторы очень мощные, потому что вы можете создать интерполятор, который перемещает ваш объект не только линейно, но и может замедлять или ускорять его (например, гравитационный эффект), он может даже добавлять отскакивающие эффекты к вашим объектам.Таким образом, вы хотите получить твердое понимание этого. JavaFX поставляется с интерполяторами .Я также видел онлайн-инструменты, которые позволяют создавать собственные интерполяторы JavaFX на основе того эффекта анимации, который вы пытаетесь получить.

Итак, чтобы собрать все воедино, иметь gl, иметь объект, который регистрируется в gl, который отвечает за размещение новых падающих объектов на экране, давайте вызовем этот объект ObjectDropper.ObjectDropper будет реализовывать что-то вроде AnimationTimer, поэтому он может вызываться каждый кадр по вашему gl.Он будет решать, когда отбрасывать объекты, а также может определять случайную точку, откуда этот объект будет отброшен.У вас будут объекты, которые будут отброшены, им будет предоставлена ​​информация о том, где находится их начальная точка, где находится их конечная точка и сколько времени потребуется для отбрасывания, и, возможно, даже об интерполяторе.Эти объекты также будут зарегистрированы в gl и будут вызываться в каждом кадре, чтобы они могли корректировать свое положение в соответствии со своим интерполятором.

Это очень общий общий план, который имеет тенденцию быть верным для большинства анимационных игр.Могут быть инструменты и библиотеки, которые делают все это легко реализуемым в Swing.Как вы можете видеть, JavaFX уже был разработан для обработки многих из этих концепций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...