2015-01-02 5 views
0

Я пытаюсь понять концепцию скорости в игре, которая поддерживает различные размеры экрана (в android).Скорость Sprite на разных размерах экрана

Предположим, у меня есть спрайт, который должен пройти 10 секунд от правого конца в ландшафтном режиме до левого конца. Частота кадров нестабильна, поэтому иногда ей 30, а затем она внезапно меняется на 10. Но я все еще хочу, чтобы мой спрайт забирал 10 секунд с одного конца на другой. Как мне это сделать?

final int time = 10; //time from one end to the otehr 
float baseSpeedX = screenWidth/time; 
float currentFrameRate = 30.0; //just as an example 
float baseFrameRate = 50.0; //the frame rate we want 
float factor = baseFrameRate/currentFrameRate; 
playerSpeedX += baseSpeedX * factor; 

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

Это будет, если это действительно работает, заставить Sprite достичь другого конца через 10 секунд, верно? Даже если у нас есть частота кадров 10 в течение 2 секунд, а затем 50 после этого в течение 8 секунд. Чем выше частота кадров теперь, тем ниже Sprite увеличивается на расстояние и чем ниже частота кадров, тем выше Sprite увеличивается на расстоянии.

Если это все работает, это было бы чем-то, что я мог бы использовать в игре? Или это совершенно неправильный подход для получения спрайта?

+0

«* Частота смены кадров не является устойчивой, так иногда это 30 на некоторое время, а затем внезапно оно меняется на 10. Но я все еще хочу, чтобы мой спрайт забирал 10 секунд с одного конца на другой * «Кажется, что вы должны пытаться стабилизировать частоту кадров, а не заставите вас изменить свою игру. Управляйте своим приложением; не позволяйте ему контролировать вас. Частота кадров должна быть независимой от реальной игры; если частота кадров низкая, и игра вызывает ее, то это то, что вы должны исправить. Помимо этого, это их компьютер, на который у вас нет контроля. –

+0

@VinceEmigh Я думаю, что у моего GameLoop есть стабилизированная частота кадров. Около 30 кадров в секунду. Однако это не всегда так.Иногда прогресс фона или что-то вроде прерываний немного, а fps уменьшается. Если вы понимаете, о чем я? Для таких случаев (от 30 до 10 секунд на некоторое время) я хочу убедиться, что спрайт все еще перемещается на всех устройствах одинаково. Несмотря на то, что размер экрана намного выше или ниже на других устройствах. – Davlog

+0

И это «* это их компьютер, на который у вас нет контроля над». Вы * можете * реализовать такую ​​систему, но это ОЧЕНЬ плохая практика. Вместо этого вы должны установить рекомендацию для игры в игру. Игры отстают, вот как все идет. Если вы попытаетесь настроить свою игру на * актуальную * частоту кадров, вы обнаружите, что делаете больше обработки (и тратите больше времени на фрейм), чем считали вы. Существует много игровых циклов, которые проверяют определенные несоответствия в времени рендеринга/обновления. Либо тестовый компьютер имеет плохие спецификации, либо игровой цикл нуждается в работе –

ответ

1

Вы на правильном пути

Обычно, когда вы движетесь спрайтов, вам нужно сделать так, чтобы спрайт движется медленнее, когда есть более высокий FPS, и двигаться быстрее, когда есть нижняя кадров в секунду. Это можно сделать, умножив другой variable под названием delta на ваш baseSpeed. Delta в этом случае - это время, которое требуется от текущего кадра и предыдущего кадра. При этом игры с высоким fps будут иметь низкую дельта, потому что для перехода от одного кадра к другому требуется короткий промежуток времени. Следуя этой схеме, игра с низким fps увидит большое количество дельты. Вычисляя дельту, вы можете иметь единообразие, что ваш спрайт будет иметь одинаковую скорость при разных целевых показателях fps. Обычно вы можете рассчитать дельта, вычитая текущее время и последнее время рендеринга.

В теории, если вы используете baseSpeedX формулу (с первого взгляда, кажется, звук) и умножить его дельты, вы будете иметь скорость:

double delta = currentTime - timeOfLastFrame; // I don't know specifically what time libraries there are on your platform 
double speed = baseSpeedX * delta; 
+0

«* Обычно, когда вы перемещаете спрайты, вам нужно сделать так, чтобы спрайт двигался медленнее, когда есть более высокий fps, и двигайтесь быстрее, когда есть lower fps * «Хочешь сказать мне, где у тебя эта информация? Последнее, что я проверил, 'delta' отвечал за то, что вы только обновляете с определенной скоростью; управляет тем, насколько быстро и часто обновляется ваша игра. Разум дает источник информации, которую вы даете? –

+0

@Vince Emigh en.m.wikipedia.org/wiki/Delta_timing – Hayden

+0

Идея состоит в том, что если ваш игровой цикл медленно обновляется (или низкий fps), тогда вы должны компенсировать это с высокой дельтой, чтобы игровые объекты двигались вправо (я допускаю, что неправильно использую delta и должен использовать дельта-синхронизацию). – Hayden

Смежные вопросы