Изменение скорости игры Slick2D - PullRequest
1 голос
/ 28 октября 2011

Я создал игру, используя Swing, и она была немного ненадежной, поэтому я начал переделывать ее, используя игровой движок Slick2D, и у меня возникли проблемы.

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

Я пробовал * delta (который контролирует частоту обновления, я думаю!) На моемзначение, которое перемещает фон, но поскольку это не даст мне точного значения, я могу использовать его для сброса фона на левую сторону (2 фона перемещаются справа налево. С левой стороны идет вправо при -800 пикселей).

Что вызывает это и как мне его преодолеть?

Спасибо

1 Ответ

11 голосов
/ 28 октября 2011

Вот вам кое-что для чтения (есть сайт StackExchange для конкретного игрового устройства , кстати):

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

И вот некоторые объяснения ...

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

Цель дельты в Slick2D - дать вам возможность справиться с этой скоростью вверх / вниз и позволить вашему приложению динамически изменять частоту кадров, так чточто воспринимаемое движение на экране не изменяется из-за нагрузки на ваш компьютер.Дельта не является монитором частоты обновления (которая постоянна);дельта - это количество миллисекунд, прошедших с момента последнего вызова update.

Итак, как правильно использовать эту дельту?Допустим, ваш фон должен двигаться со скоростью 100 пикселей в секунду.Если дельта (при данном вызове update) составляет 33 миллисекунды, то сумма, на которую вы должны переместить свой фон в этом обновлении, составляет 100*(33/1000.0) = 0.033 - так что вы переместите свой фон на 0,033 пикселя .Это может показаться странным, и вы можете задаться вопросом, в чем смысл перемещения <1 пикселя, но оставайтесь со мной.</p>

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

Вы заметите, что 2D-графика в Slick2D использует значения с плавающей точкой для отслеживания размещения объектов.Это потому, что если дельта говорит вам что-то переместить на 0,033 пикселя, вам нужно переместить это на 0,033: не 0 и не 1 пиксель.Движение субпикселя также имеет решающее значение для сглаживания увеличения / уменьшения частоты кадров, потому что кумулятивный эффект для нескольких движений субпикселя заключается в том, что, когда наступает подходящий момент, все эти небольшие движения складываются в целый пиксель, иэто совершенно гладко, что приводит к правильной общей скорости движения.

Вы можете подумать, что, поскольку ваш экран разрешает изображения в заданный пиксель, а не субпиксельные элементы, то не имеет значения, если вы делаете суб-пиксельное движение, но если вы преобразуете все ваши движения в плавающие, вы увидите, что наблюдаемый эффект в значительной степени исчезнет.

...