Я новичок в java. Я пытаюсь научиться разрабатывать игры. Я смотрю на YouTube руководства этого великого программиста! Я слежу за ним в точности и добрался до "# 9 - Основные границы столкновения" в этом плейлисте.

Он создал следующий игровой цикл ...

public void run(){
        init();
        long lastTime = System.nanoTime();
        final double amountOfTicks = 60.0;
        double ns = 1000000000 / amountOfTicks;
        double delta = 0;
        int updates = 0;
        int frames = 0;
        long timer = System.currentTimeMillis();

        while(running){
            long now = System.nanoTime();
            delta += (now - lastTime) / ns;
            lastTime = now;
            if(delta >= 1){
                tick();
                updates++;
                delta--;
            }
            render();
            frames++;

            if(System.currentTimeMillis() - timer > 1000){
                timer += 1000;
                System.out.println(updates + " Ticks, Fps " + frames);
                updates = 0;
                frames = 0;
            }

        }
        stop();
    }

Я очень запутался в этом методе. Как работает этот метод? Как работают следующие переменные?

AmountOfTicks

Дельта

Обновления

Рамка

Я понимаю, что объяснять это здесь не очень возможно, но, пожалуйста, помогите мне. Вы также можете дать мне любую ссылку, чтобы изучить и понять это. Если вам понадобится дополнительная информация, я сразу ее предоставлю!

0
user3367020 3 Ноя 2014 в 03:24

2 ответа

Лучший ответ

Переменные были объяснены, но если у вас все еще возникают проблемы с пониманием того, что делает игровой цикл в общем смысле (я не знаю, сколько он объяснил в учебнике), надеюсь, я смогу пролить свет на то, что я узнал:

По сути, игровой цикл, конечно же, запускает (отображает, обновляет и т. Д.) Игру, но он также устанавливает постоянную контролируемую скорость, с которой работает игра.

Например, представьте, что вы хотите создать 2D-ролевую игру и хотите, чтобы моб (персонаж) перемещался по экрану со скоростью, скажем, 200 пикселей в секунду. Вы можете сделать это с помощью цикла, но дело в том, что разные компьютеры заставят персонажа двигаться быстрее или медленнее в разное время, потому что компьютер будет просто выполнять код в цикле снова и снова так быстро, как только может.

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

Используя оператор if в цикле while (running), вы обновляете игру только тогда, когда программа проходит цикл, и время с момента последнего выполнения оператора if составляет не менее 1/60 секунды.

Надеюсь, это имеет смысл. Извините за длинный ответ. Если у вас есть еще вопросы, не стесняйтесь их задавать!

3
GunnarO 3 Ноя 2014 в 02:49

AmountOfTicks в основном определяет, сколько тиков вы хотите получить за одну секунду! поэтому при значении 60 метод tick () будет вызываться ок. 60 раз в секунду. внутри метода tick () обычно должна выполняться ваша игровая логика!

Дельта описывает разницу во времени в наносекундах между System.nanoTime (с настоящего момента) и последним тиком (). Когда это значение становится больше 1, вызывается тик и дельта уменьшается на единицу.

Каждую секунду второй оператор if печатает, как часто экран отображался за эту секунду и сколько было обновлений. Обновления увеличиваются с каждым тиком (), поэтому это должно быть около 60. Счетчик кадров будет намного выше, в зависимости от структуры и базового оборудования.

Что я нахожу странным, так это то, что render (), возможно, вызывается очень часто. Это может быть очень дорогостоящим вызовом, но это зависит от конкретной платформы и оборудования.

1
Michael 3 Ноя 2014 в 00:51