Я новичок в 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
Дельта
Обновления
Рамка
Я понимаю, что объяснять это здесь не очень возможно, но, пожалуйста, помогите мне. Вы также можете дать мне любую ссылку, чтобы изучить и понять это. Если вам понадобится дополнительная информация, я сразу ее предоставлю!
2 ответа
Переменные были объяснены, но если у вас все еще возникают проблемы с пониманием того, что делает игровой цикл в общем смысле (я не знаю, сколько он объяснил в учебнике), надеюсь, я смогу пролить свет на то, что я узнал:
По сути, игровой цикл, конечно же, запускает (отображает, обновляет и т. Д.) Игру, но он также устанавливает постоянную контролируемую скорость, с которой работает игра.
Например, представьте, что вы хотите создать 2D-ролевую игру и хотите, чтобы моб (персонаж) перемещался по экрану со скоростью, скажем, 200 пикселей в секунду. Вы можете сделать это с помощью цикла, но дело в том, что разные компьютеры заставят персонажа двигаться быстрее или медленнее в разное время, потому что компьютер будет просто выполнять код в цикле снова и снова так быстро, как только может.
Вот почему вы реализуете код для управления скоростью выполнения кода и, следовательно, скоростью обновления игры. Вы можете сделать это, используя время в реальном мире (используя методы, которые определяют время в наносекундах). Вы ограничиваете игру только обновлением кадра 60 раз в секунду.
Используя оператор if в цикле while (running), вы обновляете игру только тогда, когда программа проходит цикл, и время с момента последнего выполнения оператора if составляет не менее 1/60 секунды.
Надеюсь, это имеет смысл. Извините за длинный ответ. Если у вас есть еще вопросы, не стесняйтесь их задавать!
AmountOfTicks в основном определяет, сколько тиков вы хотите получить за одну секунду! поэтому при значении 60 метод tick () будет вызываться ок. 60 раз в секунду. внутри метода tick () обычно должна выполняться ваша игровая логика!
Дельта описывает разницу во времени в наносекундах между System.nanoTime (с настоящего момента) и последним тиком (). Когда это значение становится больше 1, вызывается тик и дельта уменьшается на единицу.
Каждую секунду второй оператор if печатает, как часто экран отображался за эту секунду и сколько было обновлений. Обновления увеличиваются с каждым тиком (), поэтому это должно быть около 60. Счетчик кадров будет намного выше, в зависимости от структуры и базового оборудования.
Что я нахожу странным, так это то, что render (), возможно, вызывается очень часто. Это может быть очень дорогостоящим вызовом, но это зависит от конкретной платформы и оборудования.
Похожие вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.